使用“自动布局”垂直和水平居中自定义UIView

我正在尝试使用自动布局API新build可用的iOS 6来构build一个相当简单的animation自定义用户界面。我正在构build的自定义视图有一个圆形,我想要以垂直和水平为中心。

不幸的是,我不明白为什么我的约束似乎对UIButton和UILabel元素工作正常,但当我使用自定义视图和自定义CALayer(在这种情况下是一个圆圈,最终将animation),会产生奇怪的结果。

为了清楚起见,我不希望我的视图扩大到填满整个屏幕,而是要有dynamic的“填充”,使视图垂直居中在iPhone 4和5上。我还应该注意到,我很新cocoa和UIKit。

RootViewController.m:

... - (void)viewDidLoad { [super viewDidLoad]; // Create Circle View CGRect circle_view_rect = CGRectMake(0, 0, 100, 100); UIView *circle_view = [[UIView alloc] initWithFrame:circle_view_rect]; // Create Circle Layer CircleLayer *circle_layer = [[CircleLayer alloc] init]; circle_layer.needsDisplayOnBoundsChange = YES; circle_layer.frame = circle_view.bounds; [circle_view.layer addSublayer:circle_layer]; // Enable Auto Layout [circle_view setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.view addSubview:circle_view]; // Center Vertically NSLayoutConstraint *centerYConstraint = [NSLayoutConstraint constraintWithItem:circle_view attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]; [self.view addConstraint:centerYConstraint]; // Center Horizontally NSLayoutConstraint *centerXConstraint = [NSLayoutConstraint constraintWithItem:circle_view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]; [self.view addConstraint:centerXConstraint]; } ... 

CircleLayer.m:

 ... - (void)drawInContext:(CGContextRef)context { CGContextAddArc(context, 50, 50, 50, 0.0, 2*M_PI, 0); CGContextSetFillColorWithColor(context, [UIColor yellowColor].CGColor); CGContextFillPath(context); } ... 

基本上我实施的限制是:

  • 在父视图内垂直居中
  • 在父视图内水平居中

这是我得到的结果:

圆圈不以自动布局为中心

任何帮助将不胜感激,我一直在思考这一个几天了。

谢谢

尝试添加一个高度和宽度约束到你的circle_view。 我什至不能只是一个痛苦的方形视图出现在所有没有添加这些(使用您的代码,减去图层的东西)。

 NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:circle_view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:100.0]; [circle_view addConstraint:heightConstraint]; NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:circle_view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:100.0]; [circle_view addConstraint:widthConstraint]; 

只要添加到rdelmar的答案:

核心问题是,只要你去NSLayoutConstraint路线,并指定setTranslatesAutoresizingMaskIntoConstraints:NO ,您使用CGRectMake所做的框架呈现与AutoLayout目的不相关。 这就是为什么它没有使用帧的高度和宽度的信息。