您的位置:首页 > 移动开发 > IOS开发

ios 11和iphone x的相关适配问题及解决方法

2017-11-09 10:11 781 查看

有关iOS11 ,最大的变化就是增加了一个安全区域(safeArea)的概念,iOS11 适配的大部分问题都是由于它引起的。

在ios 11中,tableView会莫名偏移,解决办法:

//解决iOS11 tableview会出现漂移,预估高度都设为0
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

解决scrollView,默认位移了,解决办法:

-(void)setScrollViewContentInsetAdjustmentBehavior:(UIScrollView *)scrollView {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000
if(@available(iOS 11.0, *)) {
if ([scrollView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
}
#endif
}

关于iphone x适配,封装了一个类:代码如下:

ScreenTool.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#define ViewSafeAreaInsets(view) [ScreenToolSharedInstance getViewSafeAreaInsets:view]
#define WindowSafeAreaInsets [ScreenToolSharedInstance getWindowSafeAreaInsets]
#define Screen_height [[UIScreen mainScreen] bounds].size.height
#define Screen_width [[UIScreen mainScreen] bounds].size.width
#define ScreenToolSharedInstance [ScreenTool sharedInstance]
#define NavAndStatusBarHeight [ScreenToolSharedInstance getNavAndStatusBarHeight]
#define TabBarAndVirtualHomeHeight [ScreenToolSharedInstance getTabBarAndVirtualHomeHeight]
#define StatusBarHeight [ScreenToolSharedInstance getStatusBarHeight]
#define NavContentHeight [ScreenToolSharedInstance getNavContentHeight]
#define TabBarContentHeight [ScreenToolSharedInstance getTabBarContentHeight]
#define ScrollViewContentInsetAdjustmentBehavior(scrollView) [ScreenToolSharedInstance setScrollViewContentInsetAdjustmentBehavior:scrollView]
typedef NS_ENUM(NSUInteger, DeviceScreenType) {//设备屏幕类型
DeviceTypeIphone4Screen,
DeviceTypeIphone5Screen,
DeviceTypeIphone6Screen,
DeviceTypeIphone6PlusScreen,
DeviceTypeIphoneXScreen,
DeviceTypeOtherScreen
};
typedef NS_ENUM(NSUInteger, DeviceOrientationType) {//屏幕方向类型
DeviceOrientationTypeHorizontalScreen,
DeviceOrientationTypeVerticalScreen,
DeviceOrientationTypeOther
};
@interface ScreenTool : NSObject
@property(nonatomic,unsafe_unretained)BOOL isAccordingToSafeArea;
-(void)setScrollViewContentInsetAdjustmentBehavior:(UIScrollView *)scrollView;
+(ScreenTool *)sharedInstance;
+(BOOL)isSmallScreen;
-(UIEdgeInsets)getWindowSafeAreaInsets;
-(UIEdgeInsets)getViewSafeAreaInsets:(UIView *)view;
-(NSString *)getDevice;
-(DeviceScreenType)getDeviceType;
-(DeviceOrientationType)getDeviceOrientationType;
-(CGFloat)getNavAndStatusBarHeight;
-(CGFloat)getTabBarAndVirtualHomeHeight;
-(CGFloat)getTabBarContentHeight;
-(CGFloat)getNavContentHeight;
-(CGFloat)getStatusBarHeight;
@end
ScreenTool.m
[objc] view plain copy
#import "ScreenTool.h"
@implementation ScreenTool
-(instancetype)init{
if (self = [super init]) {
self.isAccordingToSafeArea = YES;
}
return self;
}
+(ScreenTool *)sharedInstance {
static dispatch_once_t pred = 0;
__strong static id screenTool = nil;
dispatch_once(&pred, ^{
screenTool = [[self alloc] init];
});
return screenTool;
}
-(void)setScrollViewContentInsetAdjustmentBehavior:(UIScrollView *)scrollView {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000
if(@available(iOS 11.0, *)) {
if ([scrollView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
}
#endif
}
-(UIEdgeInsets)getWindowSafeAreaInsets {
UIEdgeInsets i = UIEdgeInsetsZero;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000
if(@available(iOS 11.0, *)) {
i = [UIApplication sharedApplication].keyWindow.safeAreaInsets;
}
#endif
return i;
}
-(UIEdgeInsets)getViewSafeAreaInsets:(UIView *)view {
UIEdgeInsets i = UIEdgeInsetsZero;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000
if(@available(iOS 11.0, *)) {
i = view.safeAreaInsets;
}
#endif
return i;
}
-(NSString *)getDevice {
if ((Screen_width == 320 && Screen_height == 480) || (Screen_height == 320 && Screen_width == 480)) {
return @"4";
}else if ((Screen_width == 320 && Screen_height == 568) || (Screen_height == 320 && Screen_width == 568)) {
return @"5";
}else if ((Screen_width == 375 && Screen_height == 667) || (Screen_height == 375 && Screen_width == 667)) {
return @"6";
}else if ((Screen_width == 375 && Screen_height == 812) || (Screen_height == 375 && Screen_width == 812)) {
return @"x";
}else if ((Screen_width == 414 && Screen_height == 736) || (Screen_height == 414 && Screen_width == 736)) {
return @"6p";
}else {
return @"";
}
}
-(DeviceScreenType)getDeviceType {
if ((Screen_width == 320 && Screen_height == 480) || (Screen_height == 320 && Screen_width == 480)) {
return DeviceTypeIphone4Screen;
}else if ((Screen_width == 320 && Screen_height == 568) || (Screen_height == 320 && Screen_width == 568)) {
return DeviceTypeIphone5Screen;
}else if ((Screen_width == 375 && Screen_height == 667) || (Screen_height == 375 && Screen_width == 667)) {
return DeviceTypeIphone6Screen;
}else if ((Screen_width == 375 && Screen_height == 812) || (Screen_height == 375 && Screen_width == 812)) {
return DeviceTypeIphoneXScreen;
}else if ((Screen_width == 414 && Screen_height == 736) || (Screen_height == 414 && Screen_width == 736)) {
return DeviceTypeIphone6PlusScreen;
}else {
return DeviceTypeOtherScreen;
}
}
-(DeviceOrientationType)getDeviceOrientationType {
if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) {
return DeviceOrientationTypeVerticalScreen;
} else if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft || [[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight) {
return DeviceOrientationTypeHorizontalScreen;
}else {
return DeviceOrientationTypeOther;
}
}
+(BOOL)isSmallScreen{
if (Screen_width >=375 && Screen_height >= 667) {
return NO;
}else {
return YES;
}
}
-(CGFloat)getTabBarContentHeight {
if (!UIEdgeInsetsEqualToEdgeInsets(UIEdgeInsetsZero, WindowSafeAreaInsets)) {
//if ([self getDeviceType] == DeviceTypeIphoneXScreen) {
if ([self getDeviceOrientationType] == DeviceOrientationTypeHorizontalScreen) {
if (self.isAccordingToSafeArea) {
return 32;
}else {
return 49;
}
}else {
return 49;
}
}else {
return 49;
}
}
-(CGFloat)getNavContentHeight {
if (!UIEdgeInsetsEqualToEdgeInsets(UIEdgeInsetsZero, WindowSafeAreaInsets)) {
// }
// if ([self getDeviceType] == DeviceTypeIphoneXScreen) {
if ([self getDeviceOrientationType] == DeviceOrientationTypeHorizontalScreen) {
if (self.isAccordingToSafeArea) {
return 32;
}else {
return 44;
}
}else {
return 44;
}
}else {
return 44;
}
}
-(CGFloat)getStatusBarHeight {
return [[UIApplication sharedApplication] statusBarFrame].size.height;
}
-(CGFloat)getNavAndStatusBarHeight {
return [self getNavContentHeight]+[self getStatusBarHeight];
}
-(CGFloat)getTabBarAndVirtualHomeHeight {
return [self getTabBarContentHeight]+WindowSafeAreaInsets.bottom;
}
@end

总结

以上所述是小编给大家介绍的ios 11和iphone x的相关适配问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios iphonex ios11