Iphone iOS-通过编程方式使用自动布局将UIView定位在superview的中心
如何使用自动布局以编程方式将UIView设置为其superview的中心Iphone iOS-通过编程方式使用自动布局将UIView定位在superview的中心,iphone,ios,autolayout,Iphone,Ios,Autolayout,如何使用自动布局以编程方式将UIView设置为其superview的中心 UIButton* viewObj = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [viewObj setTranslatesAutoresizingMaskIntoConstraints:NO]; [viewObj setBackgroundColor:[UIColor greenColor]]; [self.view addSubview:viewObj];
UIButton* viewObj = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[viewObj setTranslatesAutoresizingMaskIntoConstraints:NO];
[viewObj setBackgroundColor:[UIColor greenColor]];
[self.view addSubview:viewObj];
NSLayoutConstraint* cn = [NSLayoutConstraint constraintWithItem:viewObj
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:0];
[self.view addConstraint:cn];
cn = [NSLayoutConstraint constraintWithItem:viewObj
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterY
multiplier:1.0
constant:0];
[self.view addConstraint:cn];
上面的代码适用于UIButton,但用适用于UIView的内容替换第一行时遇到了问题
我试过了
UIView* viewObj = [UIView alloc] initWithFrame:CGRectZero];
但该视图并没有显示在模拟器中
有什么建议吗
谢谢 因为您是在使用自动布局的上下文中提出这个问题的,所以这里的问题是UIButton有一个内在大小(通过intrinsicContentSize方法进行通信),它为自动布局提供宽度和高度的信息,但UIView通常没有。因此,您需要添加更多与宽度和高度相关的约束 如果希望UIView是一个设置大小(例如200x200),可以添加以下行:
cn = [NSLayoutConstraint constraintWithItem:viewObj
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:200];
[viewObj addConstraint:cn];
cn = [NSLayoutConstraint constraintWithItem:viewObj
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:200];
[viewObj addConstraint: cn];
请注意,toItem:
参数是nil
,第二个属性是nslayouttributenotataAttribute
,因为您没有指定相对于任何其他属性的宽度和高度。如果希望子视图的高度和宽度相对于superview(例如,0.5),可以执行以下操作:
cn = [NSLayoutConstraint constraintWithItem:viewObj
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeHeight
multiplier:0.5
constant:0];
[self.view addConstraint:cn];
cn = [NSLayoutConstraint constraintWithItem:viewObj
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeWidth
multiplier:0.5
constant:0];
[self.view addConstraint: cn];
ui按钮
、ui图像视图
、ui标签
和ui文本字段
可以根据其内容属性自动设置其大小。UIImageView
的宽度和高度由它可能包含的UIImage
设置。ui标签的大小取决于其文本。ui按钮的宽度和高度由其标题和图像定义(您可以使用了解更多信息)
因此,当您希望将ui按钮
、ui标签
、ui文本字段
或ui图像视图
置于具有自动布局的ui视图
的中心时,几乎在所有情况下都不必为其宽度和高度创建约束。只需为它们设置水平和垂直约束
但是,使用自动布局,没有子视图的UIView
不能依赖任何东西来设置其大小,除非您为其提供一些任意的宽度和高度约束。根据你的需要,你可以用3种不同的方法来解决这个问题
纯自动布局风格
在这里,我们将UIView
的宽度和高度直接设置为自动布局约束:
override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView()
newView.backgroundColor = .redColor()
newView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(newView)
// Auto layout code using anchors (iOS9+)
let horizontalConstraint = newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor)
let verticalConstraint = newView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor)
let widthConstraint = newView.widthAnchor.constraintEqualToAnchor(nil, constant: 100)
let heightConstraint = newView.heightAnchor.constraintEqualToAnchor(nil, constant: 100)
NSLayoutConstraint.activateConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
}
override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
newView.backgroundColor = .redColor()
newView.center = CGPointMake(view.bounds.midX, view.bounds.midY)
newView.autoresizingMask = [.FlexibleLeftMargin, .FlexibleRightMargin, .FlexibleTopMargin, .FlexibleBottomMargin]
newView.translatesAutoresizingMaskIntoConstraints = true // default is true
view.addSubview(newView)
}
自动调整大小的遮罩样式
在这里,我们使用宽度和高度初始化UIView
,使其中心和superview的中心相等,并创建一些自动调整大小的遮罩。然后,我们要求UIKit将这些自动调整大小的遮罩转换为自动布局约束:
override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView()
newView.backgroundColor = .redColor()
newView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(newView)
// Auto layout code using anchors (iOS9+)
let horizontalConstraint = newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor)
let verticalConstraint = newView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor)
let widthConstraint = newView.widthAnchor.constraintEqualToAnchor(nil, constant: 100)
let heightConstraint = newView.heightAnchor.constraintEqualToAnchor(nil, constant: 100)
NSLayoutConstraint.activateConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
}
override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
newView.backgroundColor = .redColor()
newView.center = CGPointMake(view.bounds.midX, view.bounds.midY)
newView.autoresizingMask = [.FlexibleLeftMargin, .FlexibleRightMargin, .FlexibleTopMargin, .FlexibleBottomMargin]
newView.translatesAutoresizingMaskIntoConstraints = true // default is true
view.addSubview(newView)
}
子类样式
在这里,我们创建UIView
的子类,并重写其intrinsicContentSize()
方法(),以便返回所需的大小:
import UIKit
class CustomView: UIView {
override func intrinsicContentSize() -> CGSize {
return CGSize(width: 100, height: 100)
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let newView = CustomView()
newView.backgroundColor = .redColor()
newView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(newView)
let horizontalConstraint = NSLayoutConstraint(item: newView,
attribute: .CenterX,
relatedBy: .Equal,
toItem: view,
attribute: .CenterX,
multiplier: 1,
constant: 0)
view.addConstraint(horizontalConstraint)
let verticalConstraint = NSLayoutConstraint(item: newView,
attribute: .CenterY,
relatedBy: .Equal,
toItem: view,
attribute: .CenterY,
multiplier: 1,
constant: 0)
view.addConstraint(verticalConstraint)
}
}
始终尝试将你的问题格式化,以便让人们易于阅读(即没有水平滚动)。。这只会让你变得更快乐convenient@abbood…因此可以对整个屏幕进行编码。。。我有很大的左右空白页边距,什么都不做。如果你想把它居中到某个位置,比如说200英寸“x”和350英寸“y”?我不认为自动布局是为了处理像素的完美,它是为了适应而设计的。如果你想的话,你应该把它关掉。再像素完美:它处理得很好……你只需要重新思考你想要什么。将父视图定位在所需的点上,然后在该点内居中可以解决一些问题。