代码之家  ›  专栏  ›  技术社区  ›  Austin

如何更新CALayer上的约束?

  •  2
  • Austin  · 技术社区  · 16 年前

    我有一个CATextLayer,我希望它能够在我的视图中垂直对齐。我可以设置一个约束,使其与视图的顶部、中间或底部对齐;但我希望能够允许用户动态更改此设置。设置CATextLayer时,我使用此约束将其居中对齐:

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

    这工作得很好,但如果我想更新图层以将其与视图顶部对齐,我会尝试:

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

    当我添加新约束时,它不会与顶部对齐,而是会越过视图的顶部,在那里你只能看到它的一部分。看起来它正在尝试应用这两个约束。没有removeConstraint,如果我在类上定义一个CAConstraint变量,并在将其添加到CATextLayer后更新该变量,似乎也会发生同样的事情。我每次都需要重新创建CATextLayer吗?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Austin    16 年前

    看起来最好的方法是使用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