我有我想要的旋转屏幕期间保持停止子视图,所以我决定把NSLayoutConstraint类型:
尾随空格到上海华
顶层空间,以上海华
按键空间,以上海华
我在的UITableViewCell的子类。 我写的代码,但我得到了以下错误:
'NSInvalidArgumentException', reason: 'Unable to parse constraint format:
self is not a key in the views dictionary.
H:[self.arrows]-5-|
我在CustomCell.m代码是:
self.arrows = [[Arrows alloc]initWithFrame:CGRectMake(self.contentView.bounds.size.width-30, self.bounds.origin.y+4, 30, self.contentView.bounds.size.height-4)];
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(self.arrows, self.contentView);
NSMutableArray * constraint=[[NSMutableArray alloc]init];
[constraint addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H: [self.arrows]-5-|" options:0 metrics:nil views:viewsDictionary]];
[constraint addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-1-[self.arrows]" options:0 metrics:nil views:viewsDictionary]];
[constraint addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"[V: [self.arrows]-1-|" options:0 metrics:nil views:viewsDictionary]];
[self.arrows addConstraints:constraint];
它看起来像的自动版式视觉格式解析引擎的解释“像它的使用您的VFL约束是一个的keyPath,而不是关键” .
valueForKeyPath:
NSDictionaryOfVariableBindings(...)
将采取一切你的参数是在括号,并把它翻译成与该对象的值的文本键值(在你的情况: @{"self.arrow" : self.arrow}
在VFL的情况下,自动布局被认为你有一个关键名为self
在你看来字典使用具有的关键一子词典(或子对象) arrow
,
@{
@"self" : @{ @"arrow" : self.arrow }
}
当你从字面上希望系统解释为“你的钥匙self.arrow
”。
通常,当我使用一个实例变量的getter这样的,我通常最终会创造我自己的字典,而不是使用的NSDictionaryOfVariableBindings(...)
如下所示:
NSDictionary *views = @{ @"arrowView" : self.arrow }
要么
NSDictionary *views = NSDictionaryOfVariableBindings(_arrow);
这将允许您使用视图在VFL没有自我,你还知道你在说些什么:
NSArray *arrowHorizConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[arrowView]-5-|" options:0 metrics:nil views];
要么
NSArray *arrowHorizConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[_arrow]-5-|" options:0 metrics:nil views];
作为一般规则,我已经学会不与一个点(字典的键.
)在他们以避免任何混淆系统或调试的噩梦。
我的诀窍是简单地声明一个局部变量,这只是另一个指针的财产,并把它放在NSDictionaryOfVariableBindings
。
@interface ViewController ()
@property (strong) UIButton *myButton;
@property (strong) UILabel *myLabel;
@end
...
UIButton *myButtonP = self.myButton;
UILabel *theLabelP = self.myLabel;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(myButtonP, myLabelP);
在P
的后缀是“指针”。
最简单的办法是避免了变量的getter从自己的类和超局部变量重新定义变量。 a。对于例如解决方案
UIView *contentView = self.contentView;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_arrows, contentView);
请确保您添加的约束添加所需的子视图到主view.It后,花了一段时间得到有关这一问题的知识。