在unity中我们可以通过UI的设置锚点来实现不用尺寸屏幕的适配,但是iphoneX有“刘海”,会挡住游戏中的关键信息,如图:
解决的思路是:整个游戏的绘制区域缩短并下移32个单位(96像素高度)空出“刘海”(statusBar)的高度,然后把statusBar优雅的显示出来,最终效果在iphoneX上的截屏(实际效果可以想象一下,非常完美):
下面开始贴代码,都是在Xcode工程里实现的。
- 整个游戏的绘制区域缩短并下移32个单位,找到这个函数:
修改:
//_window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
CGRect winSize = [UIScreen mainScreen].bounds;
if(winSize.size.height/winSize.size.width>2){
winSize.size.height -=32;
winSize.origin.y = 32;
}
_window = [[UIWindow alloc] initWithFrame:winSize];
- 把statusBar优雅的显示出来,找到这两个函数:
修改:
- (BOOL)prefersStatusBarHidden
{
static bool _PrefersStatusBarHidden = true;
static bool _PrefersStatusBarHiddenInited = false;
if(!_PrefersStatusBarHiddenInited)
{
NSNumber* hidden = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UIStatusBarHidden"];
_PrefersStatusBarHidden = hidden ? [hidden boolValue] : YES;
CGRect winSize = [UIScreen mainScreen].bounds;
if(winSize.size.height/winSize.size.width>2){
_PrefersStatusBarHidden = false;
NSLog(@"show status bar");
}
_PrefersStatusBarHiddenInited = true;
}
return _PrefersStatusBarHidden;
}
- (UIStatusBarStyle)preferredStatusBarStyle
{
static UIStatusBarStyle _PreferredStatusBarStyle = UIStatusBarStyleDefault;
static bool _PreferredStatusBarStyleInited = false;
if(!_PreferredStatusBarStyleInited)
{
NSString* style = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UIStatusBarStyle"];
if(style && ([style isEqualToString:@"UIStatusBarStyleBlackOpaque"] || [style isEqualToString:@"UIStatusBarStyleBlackTranslucent"]))
_PreferredStatusBarStyle = UIStatusBarStyleLightContent;
CGRect winSize = [UIScreen mainScreen].bounds;
if(winSize.size.height/winSize.size.width>2){
_PreferredStatusBarStyle = UIStatusBarStyleLightContent;
NSLog(@"set status bar light");
}
_PreferredStatusBarStyleInited = true;
}
return _PreferredStatusBarStyle;
}
这里判断当前设备是否是iphoneX的方法比较粗暴,就是屏幕长宽比是不是超过2。愿意修改的同学可以自己改一下。