我正在通过程序化约束开发带有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
}
}
答案 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)
}
}