how to set auto layout for dynamically created buttons?

孤街浪徒 提交于 2019-12-13 04:55:42

问题


i am creating dynamic buttons and labels with scroll view now i want set auto layout for that . hows its possible set multiple dynamic buttons .i search many tutorial but not got any example for set auto layout multiple dynamic buttons.its work but all buttons are set together .means show only one button and label. but i am search its show correct result but auto layout is not work . what the problem
   -(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];


}

回答1:


You need to add the constraints programmatically, similar to how you have with your searchBar code. Did you just copy that code from somewhere without even understanding it?

There are many many tutorials for this, such as: https://medium.com/@jsleeuw/mastering-programmatic-auto-layout-b02ed2499d79

You will need to create all your autoLayout constraints with something like this:

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

There is also the visual format which you already have a sample of in your code.

I also edited your question to clean up the text and to format the code so it is readable. Please note the changes I made to make it easier for people to read your code.




回答2:


With autolayout you have to set in almost for cases 4 things (sometimes one of them are inferred by context):

  1. X coordinate
  2. Y coordinate
  3. Width
  4. Height

So, looking at your code, you have this line...

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

what was suggested before it's not totally wrong. Those constraints are exactly what the above line means. The problem is that you should pin the button to it's superview in order for the superview to define it's width and height. In this case, to define the scrollView contenSize.

So, in pseudo-code you should do something like

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];

After that, you should at least pin the very fist button to Left,Top and the very last button to Right,Bottom. Something like for each side (example just for top side)

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

Hope it helps!!



来源:https://stackoverflow.com/questions/26399372/how-to-set-auto-layout-for-dynamically-created-buttons

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!