时间:2021-01-06 11:21:49 | 栏目:iOS代码 | 点击:次
有关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
总结