以编程方式相对于安全区域底部定位视图

Position a view relative to the bottom of the safe area programmatically

我有一个从屏幕底部弹出的视图,并加载到我的应用委托中。我遇到的问题是我无法设置视图的 y 坐标,因此它会出现在所有屏幕尺寸的相同位置。在我的例子中,我试图让这个弹出视图出现在屏幕底部标签栏的正上方。

这是我的代码,我在其中放置相对于 [[UIScreen mainScreen] 边界] 的视图,但它在所有屏幕尺寸上并不一致。我怎样才能得到我需要的坐标,以便我可以将这个视图垂直放置在所有屏幕上的同一个位置?

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenWidth = screenRect.size.width;
    float y = [UIScreen mainScreen].bounds.size.height;

    UIInterfaceOrientation deviceOrientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIInterfaceOrientationIsLandscape(deviceOrientation))
    {
        [UIView animateWithDuration:0.5
                              delay:.25
                            options: UIViewAnimationOptionCurveEaseOut
                         animations:^{
                             self->popcontroller.frame = CGRectMake(0,y -90, screenWidth, 40);
                         }
                         completion:^(BOOL finished){
                         }];
    }
    else{
        [UIView animateWithDuration:0.5
                              delay:.25
                            options: UIViewAnimationOptionCurveEaseOut
                         animations:^{
                             self->popcontroller.frame = CGRectMake(0,y -120, screenWidth, 40);
                         }
                         completion:^(BOOL finished){
                         }];
    }

    brsAppDelegate *appDelegate = (brsAppDelegate *)[[UIApplication sharedApplication] delegate];
    if (![[appDelegate window].subviews containsObject:popcontroller])
    {  [[appDelegate window] addSubview:popcontroller];

    [popcontroller setNeedsDisplay];
    }
});

}

因此,为了检测边缘插入的额外间距,在所有名为 safeAreaInsets 的视图上都有一个 属性。这可用于检测是否需要向布局参数添加额外值(top/bottom 或 left/right)。

因此,为了获得 "extra margins",如果应用是纵向的,您可以检查该插图的 top/bottom 值,或者如果应用是纵向的,则检查插图的 "left/right" 值应用程序处于横向状态。

需要注意的一件事是,此 safeAreaInset 默认设置在控制器的根视图上,因此如果您将自定义视图添加为子视图,则该自定义视图很可能不会包含此内容属性 设置正确。

更具体地说,在您的情况下,"frame" 代码类似于

if deviceIsInPortrait {
   let frame = CGRect(x:thisX,
                      y: -90 - self.view.safeAreaInsets.top // this will be 0 for non "notch" phones
                      width: myWidth
                      height: myHeight
}
else {
  let frame = CGRect(x:thisX,
                      y: -90 - self.view.safeAreaInsets.left // this will be 0 for non "notch" phones
                      width: myWidth
                      height: myHeight
}

还有一条建议,尽可能多地使用自动布局。