NSLayoutAttribute topMargin和bottomMargin(Constraints To Margin)无法在iOS编程布局中工作

时间:2018-02-01 06:40:08

标签: ios swift autolayout

我正在通过程序化约束开发带有swift 4.0的iOS应用程序。但是当在iOS模拟器上运行时,mainView.topMargin与mainView.top相同。我期待mainView.topMargin和mainView.top之间的20像素差异。如果有任何想法,那么请帮忙。

我在下面发布了我的代码。请检查。

    // my scroll view
private let svLogin: UIScrollView = {
    let scroll = UIScrollView(frame: .zero)
    scroll.backgroundColor = UIColor.yellow//(hex: Colors.PRIMARY_DARK, alpha: 0)
    scroll.delaysContentTouches = false
    scroll.showsVerticalScrollIndicator = false
    scroll.showsHorizontalScrollIndicator = false
    scroll.isScrollEnabled = true
    scroll.isPagingEnabled = false
    scroll.bounces = false
    scroll.isUserInteractionEnabled = true
    scroll.clipsToBounds = true
    scroll.translatesAutoresizingMaskIntoConstraints = false
    return scroll
}()

// This is how I am applying constraints
view.layout(svLogin, .leading, .equal, view, .leading)
view.layout(svLogin, .top, .equal, view, .topMargin)
view.layout(svLogin, .width, .equal, view, .width)
view.layout(svLogin, .bottom, .equal, view, .bottomMargin)

// extension to create programmatic constraints

extension UIView {

@discardableResult
func layout(
    _ leftItem: Any,
    _ leftAttribute: NSLayoutAttribute,
    _ relation: NSLayoutRelation,
    _ rightItem: Any,
    _ rightAttribute: NSLayoutAttribute,
    _ multiplier: CGFloat,
    _ constant: CGFloat
    ) -> NSLayoutConstraint {
    if let leftView = leftItem as? UIView {
        leftView.translatesAutoresizingMaskIntoConstraints = false
    }

    let constraint = NSLayoutConstraint(
        item:       leftItem,
        attribute:  leftAttribute,
        relatedBy:  relation,
        toItem:     rightItem,
        attribute:  rightAttribute,
        multiplier: multiplier,
        constant:   constant
    )
    self.addConstraint(constraint)
    return constraint
}

@discardableResult
func layout(
    _ leftItem: Any,
    _ leftAttribute: NSLayoutAttribute,
    _ relation: NSLayoutRelation,
    _ rightItem: Any,
    _ rightAttribute: NSLayoutAttribute
    ) -> NSLayoutConstraint {
    if let leftView = leftItem as? UIView {
        leftView.translatesAutoresizingMaskIntoConstraints = false
    }

    let constraint = NSLayoutConstraint(
        item:       leftItem,
        attribute:  leftAttribute,
        relatedBy:  relation,
        toItem:     rightItem,
        attribute:  rightAttribute,
        multiplier: 1,
        constant:   0
    )
    self.addConstraint(constraint)
    return constraint
}

@discardableResult
func layout(
    _ leftItem: Any,
    _ leftAttribute: NSLayoutAttribute,
    _ relation: NSLayoutRelation,
    _ constant: CGFloat
    ) -> NSLayoutConstraint {
    if let leftView = leftItem as? UIView {
        leftView.translatesAutoresizingMaskIntoConstraints = false
    }

    let constraint = NSLayoutConstraint(
        item:       leftItem,
        attribute:  leftAttribute,
        relatedBy:  relation,
        toItem:     nil,
        attribute:  .notAnAttribute,
        multiplier: 1,
        constant:   constant
    )
    self.addConstraint(constraint)
    return constraint
}
}

1 个答案:

答案 0 :(得分:0)

我通过为iOS 11 +,iOS 9 +,iOS 8 +

编写单独的逻辑解决了我的问题
if #available(iOS 11.0, *) {
            svUploadWorks.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
            svUploadWorks.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
            svUploadWorks.widthAnchor.constraint(equalTo: view.safeAreaLayoutGuide.widthAnchor).isActive = true
            svUploadWorks.heightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.heightAnchor).isActive = true
        } else {
            if #available(iOS 9.0, *) {
                svUploadWorks.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
                svUploadWorks.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true
                svUploadWorks.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
                svUploadWorks.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor).isActive = true
            } else {
                view.layout(svUploadWorks, .leading, .equal, view, .leading)
                view.layout(svUploadWorks, .top, .equal, topLayoutGuide, .bottom)
                view.layout(svUploadWorks, .width, .equal, view, .width)
                view.layout(svUploadWorks, .bottom, .equal, bottomLayoutGuide, .top)
            }
        }