Maison > Questions et réponses > le corps du texte
我现在想自定义一个控件, 该控件初始化的时候会传入一个数组,我需要根据数组的个数创建若干个UIButton
button
的宽度是根据控件的宽度和各button
的间距算出来的, button
之间等间距..
请问这种情况如何用masonry
来布局这些button
? (这个控件也需要用Masonry
进行约束, 所以不会给它的frame
赋值)
我将我使用masonry
前后的代码贴了出来, 关键点height
和width
我用问好代替了,希望大神们能够赐教!
不使用masonry
是这样布局 :
- (instancetype)initWithFrame:(CGRect)frame items:(NSArray<NSString *> *)items
{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = YZ_WhiteColor;
NSInteger count = items.count;
for (int i = 0; i < count; i++) {
NSInteger width = (self.bounds.size.width - margin * 2 - (count - 1) * gap) / count;
NSInteger height = btnHeight;
NSInteger x = margin + i * (gap + width);
NSInteger y = 10;
UIButton *btn = [self buttonForToolBarWithTitle:items[i]];
btn.frame = CGRectMake(x, y, width, height);
btn.tag = 100 + i;
btn.layer.cornerRadius = 5;
}
}
return self;
}
使用masonry
布局 :
- (instancetype)initWithFrame:(CGRect)frame items:(NSArray<NSString *> *)items
{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = YZ_WhiteColor;
NSInteger count = items.count;
for (int i = 0; i < count; i++) {
UIButton *btn = [self buttonForToolBarWithTitle:items[i]];
btn.tag = 100 + i;
btn.layer.cornerRadius = 5;
[btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self);
make.height.mas_equalTo(btnHeight);
make.width.equalTo(???);
make.left.equalTo(???);
}];
}
}
return self;
}
PHPz2017-04-18 09:59:51
J'ai eu la réponse en me référant au Masonry
donné par Demo
- (instancetype)initWithItems:(NSArray <NSString *>*)items
{
if (self = [super initWithFrame:CGRectZero]) {
self.backgroundColor = YZ_WhiteColor;
NSInteger count = items.count;
NSMutableArray *arr = @[].mutableCopy;
for (int i = 0; i < count; i++) {
UIButton *btn = [self buttonForToolBarWithTitle:items[i]];
btn.tag = 100 + i;
btn.layer.cornerRadius = 5;
[arr addObject:btn];
}
if (count > 1) {
[arr mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:gap leadSpacing:margin tailSpacing:margin];
[arr mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self);
make.height.mas_equalTo(btnHeight);
}];
}
else {
[self.subviews.firstObject mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self);
make.height.mas_equalTo(btnHeight);
make.left.equalTo(self).offset(margin);
make.right.equalTo(self).offset(-margin);
}];
}
}
return self;
}
巴扎黑2017-04-18 09:59:51
大概是这样:
- (instancetype)initWithFrame:(CGRect)frame items:(NSArray<NSString *> *)items
{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = YZ_WhiteColor;
NSInteger count = items.count;
UIButton *lastButton = nil;
for (int i = 0; i < count; i++) {
UIButton *btn = [self buttonForToolBarWithTitle:items[i]];
btn.tag = 100 + i;
btn.layer.cornerRadius = 5;
NSInteger width = (self.bounds.size.width - margin * 2 - (count - 1) * gap) / count;
[btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self);
make.height.mas_equalTo(btnHeight);
make.width.equalTo(width);
if (lastButton) {
make.left.equalTo(lastButton.mas_right).offset(margin);
}else{
make.left.equalTo(self).offset(margin);
}
}];
lastButton = btn;
}
}
return self;
}
巴扎黑2017-04-18 09:59:51
Ne serait-il pas sympa de définir la largeur de tous les boutons pour qu'elle soit égale