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

有关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;

__span 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 11和iphone x的相关适配问题及解决方法 的全部内容, 来源链接: utcz.com/z/324613.html

回到顶部