我正在尝试使用新推出的iOS 6自动布局API构建一个相当简单的动画自定义UI。我正在构建的自定义视图有一个圆圈,我想要垂直和水平居中。
不幸的是我无法弄清楚为什么我的约束似乎对UIButton和UILabel元素工作正常但是当我使用自定义视图和自定义CALayer(在这种情况下是一个圆圈,最终会被动画化)时会产生奇怪的结果
要明确我不希望我的视图扩展以填充整个屏幕,而是要有动态的“填充”,以便视图在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);
}
...
基本上我实施的限制是:
这是我得到的结果:
任何帮助都会非常感激,我几天都在思考这个问题。
由于
答案 0 :(得分:34)
尝试在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];
答案 1 :(得分:11)
只是添加到rdelmar的答案:
核心问题是,只要您转到NSLayoutConstraint
路由并指定setTranslatesAutoresizingMaskIntoConstraints:NO
,您使用CGRectMake
创建的框架就会与AutoLayout目的无关。这就是为什么它没有使用框架高度和宽度的信息。