0

在此处输入图像描述 我正在创建带有滚动视图的动态按钮和标签,现在我想为此设置自动布局。它如何设置多个动态按钮。我搜索了很多教程,但没有任何设置自动布局多个动态按钮的示例。它可以工作,但所有按钮都设置在一起。意味着只显示一个按钮和标签。但我正在搜索它的显示正确结果,但自动布局不起作用。什么问题

   -(void)DynamicButton:(NSMutableArray*)objectName
    {
     for(UIView *view in [scrollView subviews])
      {
        [view removeFromSuperview];
      }
      int yPossion = 100, xPossion = 44; int temp = 0;


      for (int i = 0; i<[objectName count]; i++)
     {
    SMSCategory *cat = [objectName objectAtIndex:i];

    UIButton *aButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [aButton setTag:i];
    [aButton setTranslatesAutoresizingMaskIntoConstraints:YES];
    [aButton setBackgroundColor:[UIColor blackColor]];
    [aButton setBackgroundImage:[UIImage imageNamed:@"icon-menu.png"]  
    forState:UIControlStateNormal];

    [aButton setTitle:[NSString stringWithFormat:@"%d",i] 
    forState:UIControlStateNormal];

    [aButton setFrame:CGRectMake(xPossion, yPossion, 70, 60)];
     aButton.highlighted=YES;

    [scrollView addSubview:aButton];

    ;

    xPossion += aButton.frame.size.width+35;
    temp++;
    if (temp==3)
    {
        yPossion = aButton.frame.origin.y+aButton.frame.size.height+20;
        temp = 0;
        xPossion = 44;
        yPossion += aButton.frame.size.width-15;
        [scrollView setContentSize:CGSizeMake(scrollView.frame.size.width ,yPossion-
       50)];
    }

    UILabel *label =  [[UILabel alloc] init];
    [label setTranslatesAutoresizingMaskIntoConstraints:YES];

    [label setText:cat.Name];
    [label setTextColor:[UIColor blackColor]];
    label.font = [UIFont systemFontOfSize:12];

    [label sizeToFit];

    [label setFrame:CGRectMake(4, 44, 70, 60)];
    [scrollView addSubview:label];
    [aButton addSubview:label];

   }
   }

   //Autolayout code 
   [aButton setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSDictionary *viewsDictionary = @{@"aButton":aButton};

    // 2. Define the button Sizes
    NSArray *aButton_constraint_H = [NSLayoutConstraint 
                                     constraintsWithVisualFormat:@"V:[aButton(60)]"
                                                                        options:0
                                                                        metrics:nil
                                                                         views:viewsDictionary];

    NSArray *aButton_constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[aButton(70)]"
                                                                        options:0
                                                                        metrics:nil
                                                                          views:viewsDictionary];
    [aButton addConstraints:aButton_constraint_H];
    [aButton addConstraints:aButton_constraint_V];


    // 3. Define the views Positions using options
     NSArray *constraint_POS_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-80-[aButton]"
                                                                        options:0
                                                                        metrics:nil
                                                                        views:viewsDictionary];

     NSArray *constraint_POS = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[aButton]"
                                                                       options:0
                                                                       metrics:nil views:viewsDictionary];

    [self.view addConstraints:constraint_POS_V];
    [self.view addConstraints:constraint_POS];


}
4

2 回答 2

1

您需要以编程方式添加约束,类似于使用 searchBar 代码的方式。您是否只是从某个地方复制了该代码而没有理解它?

这方面有很多教程,例如:https ://medium.com/@jsleeuw/mastering-programmatic-auto-layout-b02ed2499d79

您将需要使用以下内容创建所有 autoLayout 约束:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:label
                                                      attribute:NSLayoutAttributeCenterX
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self.view
                                                      attribute:NSLayoutAttributeCenterX
                                                     multiplier:1.0
                                                       constant:0.0]];

还有一种视觉格式,您的代码中已经有一个示例。

我还编辑了您的问题以清理文本并格式化代码以使其可读。请注意我为使人们更容易阅读您的代码所做的更改。

于 2014-10-16T15:07:21.737 回答
0

使用自动布局,您几乎必须设置 4 种情况(有时其中之一是由上下文推断的):

  1. X坐标
  2. Y坐标
  3. 宽度
  4. 高度

所以,看看你的代码,你有这条线......

    [aButton setFrame:CGRectMake(xPossion, yPossion, 70, 60)];

之前的建议并不是完全错误的。这些约束正是上述行的含义。问题是您应该将按钮固定到它的超级视图,以便超级视图定义它的宽度和高度。在这种情况下,要定义scrollView的contenSize。

所以,在伪代码中你应该做类似的事情

for each button
aButton.translatesAutoresizingMaskIntoConstraints = NO;
NSDictionary *viewsDictionary = @{@"aButton":aButton};
// 2. Define the button width and height
NSArray *aButton_constraint_H = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[aButton(60)]"
                                                                options:0
                                                                    metrics:nil
                                                                     views:viewsDictionary];

NSArray *aButton_constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[aButton(70)]"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:viewsDictionary];
[aButton addConstraints:aButton_constraint_H];
[aButton addConstraints:aButton_constraint_V];

之后,您至少应该将第一个按钮固定到左、上,最后一个按钮固定到右、下。每边都有类似的东西(仅用于顶部的示例)

NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:abutton
                                                                     attribute:NSLayoutAttributeTop
                                                                        relatedBy:NSLayoutRelationEqual
                                                                           toItem:self.scrollView
                                                                        attribute:NSLayoutAttributeTop
                                                                       multiplier:1
                                                                         constant:0];

希望能帮助到你!!

于 2016-04-26T23:33:37.413 回答