自动布局水平和垂直格式一起
Posted
技术标签:
【中文标题】自动布局水平和垂直格式一起【英文标题】:auto layout horizontal and vertical format together 【发布时间】:2013-07-05 06:26:25 【问题描述】:如何在 constraintsWithVisualFormat 中同时添加水平和垂直视觉格式?只有水平的。我想添加 V:|-50-[leftButton] 和 V:|-50-[rightButton] 到它。怎么做?创建另一个 NSLayoutConstraint?
- (void)viewDidLoad
[super viewDidLoad];
UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[leftButton setTitle:@"Left" forState:UIControlStateNormal];
[leftButton setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:leftButton];
UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[rightButton setTitle:@"Right" forState:UIControlStateNormal];
[rightButton setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:rightButton];
NSArray *layoutConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[leftButton(>=80)]-50-[rightButton(>=80)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(leftButton, rightButton)];
[self.view addConstraints:layoutConstraints];
【问题讨论】:
把它和图片放在一起,然后解释你想要什么......它可以更好地理解:) @iPatel 我自己回答了。告诉我这是否是这样做的方式。 【参考方案1】:您可以根据需要使用视觉格式创建任意多的单独约束集。你不能在同一个字符串中混合水平和垂直约束,但没有什么能阻止你创建:
H:|-[view]-|
紧随其后
V:|-[view]-|
将每个 VFL 语句视为在父视图的单行或单列中表达布局。
【讨论】:
【参考方案2】:哦,我想通了。我应该像这样创建另一个约束:
NSLayoutConstraint *leftButtonLayoutConstraint = [NSLayoutConstraint constraintWithItem:leftButton attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:10.0];
[self.view addConstraint:leftButtonLayoutConstraint];
告诉我这是否是最好的方法。但无论如何它都有效。
【讨论】:
【参考方案3】:我为 NSLayoutConstraint 做了一个类别,它接受具有水平和垂直 VFL 声明的字符串,因为我注意到大多数时候我需要在同一个对象上同时使用 (H: ,V:)
@implementation NSLayoutConstraint (CombinedVFL)
+(NSArray *)constraintsWithCombinedVisualFormat:(NSString *)combinedFormat views:(NSDictionary *)views
int indexOfVerticalChar = [combinedFormat rangeOfString:@"V:"].location;
NSString *verticalString = [combinedFormat substringFromIndex: indexOfVerticalChar];
NSString *horizontalString = [combinedFormat substringToIndex: indexOfVerticalChar - 1 ]; // trim
return [[self constraintsForString:horizontalString views:views] arrayByAddingObjectsFromArray:[self constraintsForString:verticalString views:views]];
+(NSArray *)constraintsForString:(NSString *)string views:(NSDictionary *)views
return [NSLayoutConstraint constraintsWithVisualFormat:string options:0 metrics:nil views:views];
@end
打电话:
[self addConstraints:[NSLayoutConstraint constraintsWithCombinedVisualFormat:@"H:|[topBorder]| V:|[topBorder(1)]" views:@ @"topBorder" : topBorder]];
我把代码放在我的github上:https://github.com/dannyshmueli/NSLayoutConstraint-CombinedVFL
【讨论】:
以上是关于自动布局水平和垂直格式一起的主要内容,如果未能解决你的问题,请参考以下文章
在水平堆栈视图(自动布局)中将文本与图像垂直居中 - iOS