2009-09-04 98 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

看起来最好的方法是使用CATextLayer的setConstraints方法,并在需要更改垂直对齐时替换所有约束。这是我的代码现在的样子:

// 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