我有一个UILabel通过AutoLayout放置在我的情节提要上。 (约束包括水平方向的高度,宽度和中心以及与顶部的垂直间距)。

我有UIView使用drawRectUIBeizerPath方法围成一个圈。

到目前为止还算不上什么。

为简单起见,我使用硬编码数字来帮助说明我的问题。

现在,我希望将CircleView放置在UILabel上方,使标签在圆中居中。

但是,我什么也无法正确排队。它像锚点或混乱的东西。

我尝试将CircleView的中心点设置为标签的中心点。没运气。

我尝试将CircleViews X设置为标签的位置减去宽度除以2的位置。没运气。

我能得到的最接近的是Y坐标。我使用label.center.y-52.5(半径的一半)。

cv = [[CircleView alloc] initWithFrame:CGRectMake(WHATHERE.x, WHATHERE.y,
                                                      155, 155)];
cv.radius           = 75;
cv.strokeWidth      = 5;


圆的半径为75。CircleView的宽度/高度为155,因为圆的笔触为5。(半径x 2)+ 5,这给了我用圆看到的视图。



深色背景是iOS模拟器的视图。我为每个元素添加了背景色以区分它们的大小。

通过Photoshop的魔力,这就是我想要实现的目标:

最佳答案

那就说明您做错了...使用约束!

这是我的Storyboard标签约束

这是我的ViewController

    @interface ViewController ()

    @property (nonatomic, weak) IBOutlet UILabel *centeredLabel;

    @end

    @implementation ViewController

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.

        CircleView *circleView = [CircleView new];
        [self.view addSubview:circleView];

        circleView.translatesAutoresizingMaskIntoConstraints = NO;

        NSLayoutConstraint *circleCenterX = [NSLayoutConstraint constraintWithItem:circleView
                                                                         attribute:NSLayoutAttributeCenterX
                                                                         relatedBy:NSLayoutRelationEqual
                                                                            toItem:self.centeredLabel
                                                                         attribute:NSLayoutAttributeCenterX
                                                                        multiplier:1 constant:0];


        NSLayoutConstraint *circleCenterY = [NSLayoutConstraint constraintWithItem:circleView
                                                                         attribute:NSLayoutAttributeCenterY
                                                                         relatedBy:NSLayoutRelationEqual
                                                                            toItem:self.centeredLabel
                                                                         attribute:NSLayoutAttributeCenterY
                                                                        multiplier:1 constant:0];
        CGFloat circleDiameter = 155;

        NSLayoutConstraint *circleWidth = [NSLayoutConstraint constraintWithItem:circleView
                                                                         attribute:NSLayoutAttributeWidth
                                                                         relatedBy:NSLayoutRelationEqual
                                                                            toItem:nil
                                                                         attribute:NSLayoutAttributeNotAnAttribute
                                                                        multiplier:1 constant:circleDiameter];
        NSLayoutConstraint *circleHeight = [NSLayoutConstraint constraintWithItem:circleView
                                                                         attribute:NSLayoutAttributeHeight
                                                                         relatedBy:NSLayoutRelationEqual
                                                                            toItem:circleView
                                                                         attribute:NSLayoutAttributeWidth
                                                                        multiplier:1 constant:0];

        [self.view addConstraints:@[circleCenterX, circleCenterY, circleWidth, circleHeight]];
    }

    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    @end


这是CircleView

    @implementation CircleView

- (instancetype)init{
    self = [super init];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    UIColor *blueTransparent = [[UIColor blueColor] colorWithAlphaComponent:0.4];
    [blueTransparent setFill];
    CGContextFillRect(ctx, self.bounds);
    UIColor *circleColor = [UIColor greenColor];
    [circleColor setStroke];

    CGContextSetLineWidth(ctx, 6);
    CGContextStrokeEllipseInRect(ctx, self.bounds);

}

@end


这就是结果



小菜一碟 ! ;)

关于ios - 将动态创建的UIView放在 Storyboard 中的UILabel上居中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29633881/

10-11 17:18