2

ビュー内で垂直方向に整列できるようにしたい CATextLayer があります。ビューの上部、中央、または下部に配置するように制約を設定できます。しかし、ユーザーがその場でこれを変更できるようにしたいと考えています。CATextLayer を設定するときは、この制約を使用して中央に配置します。

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

これはうまくいきますが、レイヤーを更新してビューの上部に揃えたい場合は、次のようにします。

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

新しい制約を追加すると、上部に配置されず、ビューの上部を超えて、その一部しか表示されなくなります。両方の制約を適用しようとしているようです。クラスでCAConstraint変数を定義し、CATextLayerに追加した後にその変数を更新すると、removeConstraintはなく、同じことが起こるようです。毎回 CATextLayer を再作成する必要がありますか?

4

1 に答える 1

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
于 2009-09-07T00:08:05.403 に答える