我正在使用NSLayoutconstraint,但是当从iphone 6 plus传递到iphone 6时,它似乎会弄乱视图的位置。
它应该可以工作,因为我正在创建与视图属性相关的约束,如果使用不同的设备,该属性应该会更改。
下面是一些约束示例:
v=getBitmapView("V -.-")
self.view.addSubview(v)
var myConstraint =
NSLayoutConstraint(item: v,
attribute: NSLayoutAttribute.CenterX,
relatedBy: NSLayoutRelation.Equal,
toItem: self.view,
attribute: NSLayoutAttribute.CenterX,
multiplier: 1.0,
constant: 0)
self.view.addConstraint(myConstraint)
myConstraint =
NSLayoutConstraint(item: v,
attribute: NSLayoutAttribute.BottomMargin,
relatedBy: NSLayoutRelation.Equal,
toItem: self.view,
attribute: NSLayoutAttribute.BottomMargin,
multiplier: 1.0,
constant: -30)
self.view.addConstraint(myConstraint)
myConstraint =
NSLayoutConstraint(item: v,
attribute: NSLayoutAttribute.Width,
relatedBy: NSLayoutRelation.Equal,
toItem: self.view,
attribute: NSLayoutAttribute.Width,
multiplier: 1.0,
constant: -200)
self.view.addConstraint(myConstraint)
myConstraint =
NSLayoutConstraint(item: v,
attribute: NSLayoutAttribute.Height,
relatedBy: NSLayoutRelation.Equal,
toItem: self.view,
attribute: NSLayoutAttribute.Height,
multiplier: 1.0,
constant: -650)
self.view.addConstraint(myConstraint)
如果我运行iphone 6 plus,则视图位于底边距上方30点,但如果我使用iphone6,则视图将消失。
最佳答案
问题是你已经硬编码了高度和宽度。不要对宽度和高度使用常量,而是将它们定义为超视图的其他视图的倍数。
如何在没有硬编码的情况下设置宽度和高度?你有例子吗?假设我想看到屏幕一半的三分之一,也就是屏幕的六分之一
使用乘法器来实现这一点。如果只有一个子视图,则可以将宽度和高度定义为超级视图的倍数:
NSLayoutConstraint.activateConstraints([
blueView.topAnchor.constraintEqualToAnchor(view.topAnchor), // pin to top left corner
blueView.leftAnchor.constraintEqualToAnchor(view.leftAnchor),
blueView.widthAnchor.constraintEqualToAnchor(view.widthAnchor, multiplier: 1.0 / 3.0), // one third the width
blueView.heightAnchor.constraintEqualToAnchor(view.heightAnchor, multiplier: 1.0 / 2.0) // one half the height
])
结果是:
或者,有时,定义一组视图以跨越整个超视图,然后定义它们之间的相对宽度,例如,上半部分是三分之一蓝色和三分之二红色,下半部分都是绿色:
NSLayoutConstraint.activateConstraints([
blueView.topAnchor.constraintEqualToAnchor(view.topAnchor), // pin blue and red to the top
redView.topAnchor.constraintEqualToAnchor(view.topAnchor),
blueView.leftAnchor.constraintEqualToAnchor(view.leftAnchor), // pin blue to left edge
redView.leftAnchor.constraintEqualToAnchor(blueView.rightAnchor), // pin red adjacent to blue view
redView.rightAnchor.constraintEqualToAnchor(view.rightAnchor), // pin red to right edge
redView.widthAnchor.constraintEqualToAnchor(blueView.widthAnchor, multiplier: 2.0), // but make red twice as wide as blue (i.e. 2/3rds entire view)
greenView.topAnchor.constraintEqualToAnchor(blueView.bottomAnchor), // define green to be below blue
greenView.topAnchor.constraintEqualToAnchor(redView.bottomAnchor), // and red views
greenView.heightAnchor.constraintEqualToAnchor(blueView.heightAnchor), // but make it same height as blue
greenView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor), // and pin it to the bottom of superview
greenView.leftAnchor.constraintEqualToAnchor(view.leftAnchor), // and green spans entire superview
greenView.rightAnchor.constraintEqualToAnchor(view.rightAnchor)
])
显然,如果您希望实例化一个
NSLayoutConstraint
,然后像在原始示例中那样执行addConstraint
,那么请放心。上面的语法(在iOS 9中引入)只是一个更简洁的格式副本,但其概念与上面的相同,即一个应该适当地钉住边,但只将宽度/高度定义为另一个视图的倍数,而不是使用一些硬编码常量。关于swift - NSLayoutConstraint问题在不同的设备上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35807954/