ios 11和iphone x的相关适配



在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 
#import 

#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

#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

我的业余技术微信公众号:YKJGZH,欢迎大家进入

你可能感兴趣的:(iOS/OC)