objective-c - 获取现有的 NSLayoutConstraint 宽度?

标签 objective-c xcode macos cocoa autolayout

我正在尝试使用自动布局为 Cocoa 中的控件设置动画。

现在,我可以设置 [[constraint animator] setConstant:newWidth];,这很有效。 但是我怎样才能得到正确的约束呢?

使用[self constraints]你可以获得所有的约束,在这种情况下我可以只选择constraints[0],但是约束的顺序可能会有所不同.

我如何确定我总是有正确的约束? 约束在 Interface Builder 中设置。我看到您可以向其中添加 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

最佳答案

每个约束都有一个属性[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];

关于objective-c - 获取现有的 NSLayoutConstraint 宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13857115/

相关文章:

xcode - Cocoa:防止窗口离开屏幕

objective-c - startMonitoringSignificantLocationChanges 示例

c++ 在同一行使用 cout 和 cin 的问题 (xcode8)

iphone - "Code Sign error: No unexpired provisioning profiles found that contain any of the keychain' s 签名证书"

从 Xcode 启动 iPhone 应用程序会崩溃,但从 iPhone 启动时不会崩溃

c - lldb: `print` 和 `display` 的一行输出

objective-c - NSMutableDictionary 中没有保存键/值对

iphone - 如何在部分 curl 动画后展开?

objective-c - NSObject 子类是否有可能对每个属性访问 "hook in"

c - 在 mac os 上将两个变量名相乘