2015-04-14 3 views
0

У меня есть UILabel, который находится на моей раскадровке с помощью AutoLayout. (Ограничения включают высоту, ширина и центр по горизонтали и вертикальный интервал от верхнего).Центр динамически созданного UIView над UILabel в раскадровке не работает

У меня есть UIView, что делает круг с помощью метода drawRect с использованием UIBeizerPath.

Ничего особенного пока.

Для простоты я использую жестко закодированные номера, чтобы помочь проиллюстрировать мою проблему.

Теперь я хочу, чтобы CircleView располагался над UILabel, центрируя метку по кругу.

Однако я не могу получить что-либо, чтобы правильно подобрать его. Его как якорные точки или что-то в порядке.

Я попытался установить центральную точку CircleView в центр метки. Не повезло.

Я попытался установить CircleViews X в положение метки минус ширина, деленная на два. Не повезло.

Ближайшее, что я могу получить, это координата 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. (радиус х 2) + 5, которые дают мне вид вы видите с кругом.

enter image description here

Темный фон вид тренажера IOS. Я добавил цвета фона для каждого из элементов, чтобы отличить их размер.

Через магию Photoshop здесь является то, что я пытаюсь сделать: enter image description here

+0

Где вы создаете и добавляете личный круг? Я имею в виду, какой метод. Возможно ли это в 'viewDidLoad' – uchiha

+0

Да, я запускаю CircleView в viewDidLoad –

ответ

2

Тогда вы делаете что-то неправильно ... Использование ограничений!

Вот мои Раскадровка этикетки ограничения enter image description here

Вот мой 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 

И вот результат

enter image description here

Кусок торта! ;)

+0

Ding ding ding! Вот и все. Добавление макета. Ограничения на CircleView были билетом! Теперь вы можете объяснить, что происходит с моей реализацией? Почему у меня были добавлены ограничения компоновки раскадровки на представление, не относящееся к раскадровке? –

+0

Я не понимаю: ограничения в раскадровке связаны только с представлениями, встроенными в раскадровку, как вы могли установить ограничения на представление, которое еще не было создано? Примечание: мой код мог бы работать так же, если бы я создал «CircleView» и его ограничения непосредственно в моей раскадровке – Vinzzz

0

Вот что я хотел бы сделать:

  1. Убедитесь, что нет никаких ограничений, которые потенциально толкающие круг
  2. Сделайте круг просмотром subview of NOT UILabel, но из супервизора (вероятно, вы уже это делаете)
  3. установить рамку круга в

    CGRectMake(self.myLabel.frame.origin.x - (155/2.0), self.myLabel.frame.origin.y - (155/2.0), 155, 155); 
    
+0

Это странная вещь. Я делаю или делал все это. Ярлык находится на раскадровке с ограничениями. После загрузки представления кружок добавляется программно. –

+0

Вы должны программно установить место метки вместо использования ограничений. Эти ограничения, вероятно, вытесняют круг – AlexKoren

+0

@matt дал вам правильное решение. Используйте ограничения для размещения круга. Вы пытаетесь смешать автоматический макет с ручной установкой рамки подзонов. – Rog

0

Do The Init окружности в viewDidAppear вместо viewDidLoad

+0

Когда я это делаю, я могу манипулировать кругом там, где он должен быть, однако после того, как изображение загрузится, появляется заметное внезапное появление круга. –