【问题标题】: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 我自己回答了。告诉我这是否是这样做的方式。

标签: iphone ios constraints autolayout


【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-02
        • 2019-04-13
        • 1970-01-01
        • 2013-05-13
        • 2019-12-11
        • 1970-01-01
        • 2012-11-23
        • 2022-10-04
        相关资源
        最近更新 更多