如何使用Swift正确定位UIView?

时间:2018-01-26 16:12:28

标签: ios swift uiview position

我读了许多与我的问题类似的问题的答案。但我仍然无法解决这个问题。

我将UIView添加到另一个UIView之上。

    @IBOutlet weak var contentView: UIView!

以下是我在contentView上添加另一个视图的方法。

 func showPopupView(){
    popupView.bounds.size.width = contentView.bounds.size.width
    popupView.bounds.size.height = self.view.frame.height - 99
    popupView.frame.origin.y = contentView.frame.origin.y + 50
    popupView.center.x = contentView.center.x
    view.addSubview(popupView)
}

我将99计算为49 + 50. 49是TabBar高度的高度,50是顶部视图的高度。

但是,弹出视图未在所有模拟器大小上显示。它在iPhone SE上按预期显示,但在iPhone 6,iPhone 6s或iPhone X上存在间隙。

如何在超级视图(self.view)上定位弹出视图?

4 个答案:

答案 0 :(得分:0)

您的方法在几个级别上都是错误的。

  1. 你有几个"魔术数字"在你的代码中

  2. 您正在操纵您的视图框架。不要这样做。自动布局可能会破坏您的尺寸和位置。而是创建自动布局约束(看看布局锚点。它们非常容易使用。)

答案 1 :(得分:0)

您可以尝试这样的事情

  NSLayoutConstraint.activate([
    popupView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 50),
    popupView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
    popupView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor)
    ])
   if #available(iOS 11.0, *) {
NSLayoutConstraint.activate([
    popupView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)])

 } else {
    NSLayoutConstraint.activate([
    popupView.bottomAnchor.constraint(equalTo: self.bottomLayoutGuide.topAnchor)])

}

答案 2 :(得分:0)

高度建议使用autolayout,而不是硬编码:

class SomeController: UIViewController {
    @IBOutlet weak var contentView: UIView!
    func showPopupView() {
        let popupView = UIView()   // or any other way how your `popupView` should be initialized
        view.addSubview(popupView) // Adding popup view before the setting anchors
        popupView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor)   // constant is 0 by default, could be any else
        popupView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor) // constant is 0 by default, could be any else
        popupView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 50) // same top position as `contentView`'s top plus 50 points
        popupView.heightAnchor.constraint(equalTo: contentView.heightAnchor, constant: -100) // same haight as `contentView`'s haight minus 100 points
    }
}

注意:我假设contentViewview的子视图。此外,在使用popupView之前,应将anchors添加到子视图中。

答案 3 :(得分:0)

我终于设法通过下面的代码在所有设备类型上正确定位我的popupView。

func showPopupView(){
    let statusBarHeight = self.view.safeAreaInsets.top
    showPopupView.frame.size.width = contentView.frame.size.width
    showPopupView.frame.size.height = contentView.frame.height
    showPopupView.frame.origin.y = contentView.frame.origin.y + statusBarHeight
    showPopupView.center.x = contentView.center.x
    view.addSubview(showPopupView)
}

使用此代码,popupView获取contentView的高度和宽度。考虑到statusBarHeight,在当前视图中将其置于其顶部。