使用自动布局纵向和横向自定义UIView

pho*_*or2 30 cocoa-touch calayer uiview ios autolayout

我正在尝试使用新推出的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];
}
...
Run Code Online (Sandbox Code Playgroud)

CircleLayer.m:

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

基本上我实施的限制是:

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

这是我得到的结果:

圆圈不以自动布局为中心

任何帮助都将不胜感激,我几天来一直在思考这个问题.

谢谢

rde*_*mar 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];
Run Code Online (Sandbox Code Playgroud)


Ben*_*ler 12

只是为了增加rdelmar的答案:

核心问题是,只要您继续NSLayoutConstraint路由并指定setTranslatesAutoresizingMaskIntoConstraints:NO,您使用的帧就会与CGRectMakeAutoLayout目的无关.这就是为什么它没有使用框架高度和宽度的信息.