【问题标题】:Center custom UIView vertically and horizontally using Auto Layout使用自动布局将自定义 UIView 垂直和水平居中
【发布时间】:2012-11-23 11:55:46
【问题描述】:

我正在尝试使用 iOS 6 新推出的 Auto Layout 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);
}
...

基本上我实现的约束是:

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

这是我得到的结果:

任何帮助将不胜感激,我已经思考了几天了。

谢谢

【问题讨论】:

    标签: ios cocoa-touch uiview calayer autolayout


    【解决方案1】:

    只是为了补充 rdelmar 的答案:

    核心问题是,一旦您走NSLayoutConstraint 路线,并指定setTranslatesAutoresizingMaskIntoConstraints:NO,您使用CGRectMake 制作的框架就与自动布局无关。这就是为什么它没有使用框架高度和宽度的信息。

    【讨论】:

    • 这个答案解决了我的问题。即使是使用 initWithFrame: 构造函数指定的框架,在调用 etTranslatesAutoresizingMaskIntoConstraints:NO 时也会立即失效
    【解决方案2】:

    尝试为您的 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];
    

    【讨论】:

    • 谢谢!这正是我想要的。不再有模棱两可的布局警告。 :)
    • 我花了一段时间才明白这段代码是对上述问题代码的补充。谢谢大家!
    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2017-01-25
    相关资源
    最近更新 更多