17

自動レイアウトを使用してCocoaのコントロールをアニメーション化しようとしています。

これで、設定できます[[constraint animator] setConstant:newWidth];。これは機能します。しかし、どうすれば正しい制約を得ることができますか?

これ[self constraints]ですべての制約を取得できます。この場合は、を選択するだけconstraints[0]ですが、制約の順序は異なる場合があります。

常に正しい制約があることをどのように確認できますか?制約はInterfaceBuilderで設定されます。IBOutletを追加できることを確認しましたが、必須ではないようです。


私の解決策

おかげで、それはうまくいきました。私は小さなカテゴリーを書きました。


NSView + NSLayoutConstraintFilter.h

#import <Cocoa/Cocoa.h>

@interface NSView (NSLayoutConstraintFilter)
- (NSLayoutConstraint *)constraintForAttribute:(NSLayoutAttribute)attribute;
- (NSArray *)constaintsForAttribute:(NSLayoutAttribute)attribute;
@end

NSView + NSLayoutConstraintFilter.m

#import "NSView+NSLayoutConstraintFilter.h"

@implementation NSView (NSLayoutConstraintFilter)

- (NSArray *)constaintsForAttribute:(NSLayoutAttribute)attribute {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", attribute];
    NSArray *filteredArray = [[self constraints] filteredArrayUsingPredicate:predicate];

    return filteredArray;
}

- (NSLayoutConstraint *)constraintForAttribute:(NSLayoutAttribute)attribute {
    NSArray *constraints = [self constaintsForAttribute:attribute];

    if (constraints.count) {
        return constraints[0];
    }

    return nil;
}

@end
4

3 に答える 3

39

すべての制約には属性[constraint firstAttribute] があり、列挙型 NSLayoutAttribute を返します

typedef NS_ENUM(NSInteger, NSLayoutAttribute) {
    NSLayoutAttributeLeft = 1,
    NSLayoutAttributeRight,
    NSLayoutAttributeTop,
    NSLayoutAttributeBottom,
    NSLayoutAttributeLeading,
    NSLayoutAttributeTrailing,
    NSLayoutAttributeWidth,
    NSLayoutAttributeHeight,
    NSLayoutAttributeCenterX,
    NSLayoutAttributeCenterY,
    NSLayoutAttributeBaseline,

    NSLayoutAttributeNotAnAttribute = 0
};

NSLayoutAttributeWidth で幅を確認できます。

サンプルコード:

NSArray constraints = [self constraints];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", NSLayoutAttributeWidth];
NSArray *filteredArray = [constraints filteredArrayUsingPredicate:predicate];
if(filteredArray.count == 0){
      return nil;
}
NSLayoutConstraint *constraint =  [constraints objectAtIndex:0];
于 2012-12-13T10:18:09.060 に答える
5

これは、Xcode 8.2.1 および macOS 10.12.2 でテストされた swift 3 バージョンです。

NSLayoutAttributeこのコードは、ボタンの幅と高さの制約を取得する方法を示していますが、 enumから必要なものをフィルタリングできます。

let cons = signInButton.constraints.filter {
    $0.firstAttribute == NSLayoutAttribute.width || $0.firstAttribute == NSLayoutAttribute.height /// or other from `NSLayoutAttribute`
}
// do something with the constraints array, e.g.
NSLayoutConstraint.deactivate(cons)
于 2017-01-12T03:41:37.613 に答える