中心自定义的UIView垂直和水平使用自动布局(Center custom UIView verti

2019-08-03 13:58发布

我试图建立一个使用自动布局API新的可用的iOS 6,我建立自定义视图中有我想成为垂直和水平为中心的圆一个相当简单的动画自定义用户界面。

不幸的是我无法弄清楚,为什么我的限制似乎为UIButton的做工精细,和的UILabel元素,但是当我用一个自定义视图和自定义CALayer的(在这种情况下转了一圈,最终将动画)产生奇怪的结果。

需要明确的是,我不希望我的观点扩大到充满整个屏幕,而是具有动态的“填充”,这样的观点是在iPhone 4和5垂直居中两个我也应该注意到,我很新的可可和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);
}
...

基本上,我已经实现了约束:

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

这是结果我得到:

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

谢谢

Answer 1:

尝试添加的高度和宽度约束你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];


Answer 2:

只需添加到rdelmar的回答:

核心问题是,一旦你去NSLayoutConstraint路线,并指定setTranslatesAutoresizingMaskIntoConstraints:NO ,你所做的框架CGRectMake呈现无关自动版式的目的。 这就是为什么它没有使用从框架的高度和宽度的信息。



文章来源: Center custom UIView vertically and horizontally using Auto Layout