获取的宽度现有NSLayoutConstraint? [英] Getting an existing NSLayoutConstraint for the width?

查看:163
本文介绍了获取的宽度现有NSLayoutConstraint?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在动画可可自动布局的控制。

现在,我可以设置 [约束动画] setConstant:newWidth]; ,其工作方式。
但我怎么能得到正确的约束?

使用 [自我约束] 你可以得到所有的约束,在这种情况下,我只能选择约束[0] ,但约束的顺序可以变化。

我怎么能肯定我总是有合适的约束?
这些约束在Interface Builder中设置的。我已经看到了你可以添加一个IBOutlet中来,但似乎有必要不。


我的解决方案

谢谢,它的工作太棒了。我写了一个小类别。


的NSView + NSLayoutConstraintFilter.h

 #进口<可可/ Cocoa.h>@interface的NSView(NSLayoutConstraintFilter)
- (NSLayoutConstraint *)constraintForAttribute:(NSLayoutAttribute)属性;
- (NSArray的*)constaintsForAttribute:(NSLayoutAttribute)属性;
@结束


的NSView + NSLayoutConstraintFilter.m

 #进口的NSView + NSLayoutConstraintFilter.h@implementation的NSView(NSLayoutConstraintFilter) - (NSArray的*)constaintsForAttribute:(NSLayoutAttribute){属性
    NS predicate * predicate = NS predicate predicateWithFormat:@firstAttribute =%d个,属性]。
    NSArray的* filteredArray = [[自我约束] filteredArrayUsing predicate:predicate]。    返回filteredArray;
} - (NSLayoutConstraint *)constraintForAttribute:(NSLayoutAttribute){属性
    NSArray的*约束= [自我constaintsForAttribute:属性]。    如果(constraints.count){
        返回约束[0];
    }    回零;
}@结束


解决方案

每一个约束实现有一个属性 [约束firstAttribute]
它返回一个枚举NSLayoutAttribute

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

所以你可以检查NSLayoutAttributeWidth的宽度。

样code:

  NSArray的约束= [自我约束]
NS predicate * predicate = NS predicate predicateWithFormat:@firstAttribute =%d个,NSLayoutAttributeWidth]
NSArray的* filteredArray = [约束filteredArrayUsing predicate:predicate]。
如果(filteredArray.count == 0){
      回零;
}
NSLayoutConstraint *约束= [约束objectAtIndex:0];

I'm trying to animate a control in Cocoa with auto layout.

Now, I can set [[constraint animator] setConstant:newWidth];, which works. But how can I get the right constraint?

With [self constraints] you can get all the constraints, and in this case I can just select constraints[0], but the order of the constraints may vary.

How can I be certain I always have the right constraint? The constraints are set in Interface Builder. I have seen that you can add a IBOutlet to it, but it doesn't seem necessary.


My solution

Thanks, it worked great. I wrote a little category.


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

解决方案

Every contraint has an attribute [constraint firstAttribute] It returns an enum NSLayoutAttribute

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

    NSLayoutAttributeNotAnAttribute = 0
};

so you can check NSLayoutAttributeWidth for width.

Sample code:

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];

这篇关于获取的宽度现有NSLayoutConstraint?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆