iOS – 以编程方式使用自动布局将UIView放置在超级视图的中心位置

你如何以编程方式设置一个UIView使用自动布局在其超视图的中心?

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]; 

但是这个视图并没有在模拟器中显示出来。

有什么build议么?

谢谢!

由于您在使用自动布局的上下文中提出了这个问题,因此这里的问题是UIButton的内在大小(通过intrinsicContentSize方法传递)提供了有关宽度和高度的信息,但UIView通常不会。 所以你需要添加更多与宽度和高度有关的约束。

如果你想让你的UIView成为一个设置大小(比如200×200),你可以添加这些行:

 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 ,第二个属性为NSLayoutAttributeNotAnAttribute ,因为您没有指定相对于其他的宽度和高度。 如果你想子视图的高度和宽度是相对于超视图(比如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]; 

UIButtonUIImageViewUIlabelUITextField可以根据它们的内容属性自动设置它们的大小。 UIImageView的宽度和高度由它可能包含的UIImage设置。 UILabel的大小将取决于其文本。 UIButton的宽度和高度由标题和图像定义(你可以通过Intrinsic Content Size了解更多信息)。

因此,当你想在UIView中自动布局UIButtonUILabelUITextField或者UIImageView ,在几乎所有的情况下,你不必为它们的宽度和高度创build约束。 你只需要为它们设置水平和垂直约束。

但是,对于自动布局,没有子视图的UIView不能依赖任何东西来设置它的大小,除非你提供了一些任意的宽度和高度约束。 根据你的需要,你可以用三种不同的方式解决这个问题。


纯粹的自动布局风格

在这里,我们将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]) } 

自动调整掩码样式

在这里,我们初始化我们的UIView的宽度和高度,使其中心和超视图的中心相等,并创build一些自动修复的面具。 然后,我们要求UIKit将这些自动调整掩码转换为自动布局约束:

 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) } 

子类风格

在这里,我们创build一个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) } }