首页 > 系统 > iOS > 正文

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

2019-10-21 18:43:49
字体:
来源:转载
供稿:网友

有关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的相关适配问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对VEVB武林网网站的支持!


注:相关教程知识阅读请移步到IOS开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表