问题
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):
- X coordinate
- Y coordinate
- Width
- 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