自动布局水平和垂直格式一起

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

ios 自动布局水平跟垂直居中

如何使用自动布局在纵向模式下垂直堆叠视图并在横向模式下水平堆叠视图?

ios自动布局视觉格式-对齐