我有一个表格视图,其中包含多个部分和每个部分的部分标题。如您所知,节标题随表格视图移动。因此,如果有多个部分,则当前部分的标题会粘在 tableview 的顶部,而该部分的内容会在标题下滚动。
我试图弄清楚它应该如何适应 iPhone X,因为标题上方的空间通过内容显示,正如您在此屏幕截图中注意到的那样。我查看了 Apple 关于如何适应 iPhone X 缺口的观点,但他们所有的示例顶部都有一个搜索栏视图,因此他们从未真正遇到过这个问题。
我有一个表格视图,其中包含多个部分和每个部分的部分标题。如您所知,节标题随表格视图移动。因此,如果有多个部分,则当前部分的标题会粘在 tableview 的顶部,而该部分的内容会在标题下滚动。
我试图弄清楚它应该如何适应 iPhone X,因为标题上方的空间通过内容显示,正如您在此屏幕截图中注意到的那样。我查看了 Apple 关于如何适应 iPhone X 缺口的观点,但他们所有的示例顶部都有一个搜索栏视图,因此他们从未真正遇到过这个问题。
正如您在此屏幕截图中注意到的那样,标题上方的空间通过内容显示
区分两件事:主视图(在凹槽后面延伸)和表格视图。将表格视图的顶部固定到安全区域的顶部。在 iPhone X 上,并且仅在 iPhone X 上,安全区的顶部会从主视图的顶部向下,安全区的底部会从主视图的底部向上,保持您的从在凹口后面向上或在指示器后面向下看的表格视图。
在此屏幕截图中,有几个单元格在 A 标题上方滚动,但您看不到它们。并且表格视图的底部没有虚拟主页指示器。
这只是给表视图控制器一个具有黑色背景的父视图控制器的问题。您可以在代码中执行此操作,也可以在情节提要中完全不使用代码对其进行配置。
这就是我最终做的事情。
我在里面添加了一个带有 UIVisualEffectView的新UIView
( )。notchFIxView
我把它放在视图控制器的最顶部。这是所有 tableview 之外的最顶层视图。我将顶部、左侧和右侧约束固定到超级视图(不是安全区域)。
我将此视图的底部固定到安全区域的顶部。
我UIScrollViewDelegate
在接口中添加了协议,并添加了以下用于 iPhoneX 检测的宏:
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0)
我在界面中添加了一个BOOL checkIfNotch;
变量并在 viewDidLoad 中对其进行了初始化:
checkIfNotch = IS_IPHONE_X;
然后最终显示/隐藏notchFIxView
发生如下:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (checkIfNotch) {
static CGFloat lastY = 0;
CGFloat currentY = scrollView.contentOffset.y;
if ((lastY <= tableheaderviewHeight) && (currentY > tableheaderviewHeight)) {
NSLog(@" ******* Header view just disappeared");
self.notchFIxView.hidden=NO;
[UIView animateWithDuration:0.3 animations:^{
self.notchFIxView.alpha=1;
} completion:^(BOOL finished) {
}];
}
if ((lastY > tableheaderviewHeight) && (currentY <= tableheaderviewHeight)) {
NSLog(@" ******* Header view just appeared");
[UIView animateWithDuration:0.3 animations:^{
self.notchFIxView.alpha=0;
} completion:^(BOOL finished) {
self.notchFIxView.hidden=YES;
}];
}
lastY = currentY;
}
}
在此之后,它看起来好多了:
如果您有兴趣,那么您可以查看这个 github 页面,它使您能够解决这个缺口问题: