2009-09-04 2 views
2

У меня есть CATextLayer, который я хочу, чтобы иметь возможность вертикального выравнивания в моем представлении. Я могу установить ограничение, чтобы выровнять его в верхней части представления, до середины или снизу; но я хочу, чтобы позволить пользователю изменять это на лету. Когда я создал свой CATextLayer, я использую это ограничение, чтобы выровнять его по центру:Как обновить ограничение на моем CALayer?

[textLayer addConstraint: [CAConstraint constraintWithAttribute:kCAConstraintMidY 
       relativeTo:@"superlayer" 
      attribute:kCAConstraintMidY]]; 

Это прекрасно работает, но если я хочу, чтобы обновить слой, чтобы выровнять его с верхней точки зрения я стараюсь:

[textLayer addConstraint: [CAConstraint constraintWithAttribute:kCAConstraintMaxY  
       relativeTo:@"superlayer" 
      attribute:kCAConstraintMaxY]]; 

Когда я добавляю новое ограничение, оно не выравнивается к вершине, но проходит мимо верхней части представления, где вы можете видеть только ее часть. Похоже, что он пытается применить оба ограничения. Не существует removeConstraint, и, похоже, это происходит, если я определяю переменную CAConstraint в моем классе и просто обновляю эту переменную после добавления ее в CATextLayer. Нужно ли мне каждый раз воссоздавать CATextLayer?

ответ

2

Похоже, лучший способ сделать это - использовать метод setConstraints для CATextLayer и заменить все ограничения, когда захочу изменить вертикальное выравнивание. Вот как выглядит мой код:

// Define the constraints for the class in the .h 

@interface LayerView : NSView { 

    CATextLayer *textLayer; 

    CAConstraint *verticalConstraint; 
    CAConstraint *horizontalConstraint; 
    CAConstraint *widthConstraint; 

} 

- (IBAction)alignTextToTop:(id)sender; 

@end 

@implementation LayerView 

- (id)initWithFrame:(NSRect)frameRect 
{ 
    id view = [super initWithFrame:frameRect]; 

    horizontalConstraint = [CAConstraint constraintWithAttribute:kCAConstraintMidX relativeTo:@"superlayer" attribute:kCAConstraintMidX]; 

    widthConstraint = [CAConstraint constraintWithAttribute:kCAConstraintWidth relativeTo:@"superlayer" attribute:kCAConstraintWidth]; 

    verticalConstraint = [CAConstraint constraintWithAttribute:kCAConstraintMidY relativeTo:@"superlayer" attribute:kCAConstraintMidY]; 

    [textLayer setConstraints:[NSArray arrayWithObjects:verticalConstraint, horizontalConstraint, widthConstraint, nil]]; 

    return view; 
} 

// Update the constraints using setConstraints 
- (IBAction)alignTextToTop:(id)sender 
{ 
    verticalConstraint = [CAConstraint constraintWithAttribute:kCAConstraintMaxY relativeTo:@"superlayer" attribute:kCAConstraintMaxY]; 

    [textLayer setConstraints:[NSArray arrayWithObjects:verticalConstraint, horizontalConstraint, widthConstraint, nil]]; 
} 

@end 
Смежные вопросы