UIButton 在运行时更改尺寸
Posted
技术标签:
【中文标题】UIButton 在运行时更改尺寸【英文标题】:UIButton change dimensions at run time 【发布时间】:2014-08-06 14:14:41 【问题描述】:我有一个 UIView 的 xib 文件,其中有 2 个按钮。像这样 :
Button1 将在显示时隐藏。当它被隐藏时,我希望其他按钮占用整个空间。
我还希望视图占据所有可用空间(也可以管理方向更改)。在 IB 中查看,我选择了大小为Freeform
,方向为Portrait
。
为此,我为两个按钮添加了约束,将 0 设置为顶部、底部和左/右。但是有了这个,当方向改变时,它们是我不想要的两个按钮之间的间隙。
我尝试了很多方法,但无法处理上述两个问题。两者也是相互关联的。如果 Button1 是隐藏的,那么也应该将左约束添加到其他按钮。现在,我已经移除了所有限制,所以在横向上它并没有利用全部空间。
您能否告诉我如何处理这些相互关联的问题。
更新 向视图 (UIView) 类添加了以下方法。像这样添加它对我来说是新的,参考编写了代码来添加两个按钮的顶部、底部和左/右设置 0。左边是主要角色 - button1 被隐藏,然后添加什么,然后显示什么。
-(void) addCustomConstriants:(BOOL) hideFirstBtn
// http://technet.weblineindia.com/mobile/ui-design-of-ios-apps-with-autolayout-using-constraints-programmatically/2/
//NSDictionary *viewsDict = NSDictionaryOfVariableBindings(self.button1, self.button2);
//NSArray *constriaints =
if (hideFirstBtn)
// ONLY 2ND BUTTON - NO 1ST BUTTON
else
// SHOW BOTH BUTTONS
// BUTTON 1
// ADD TOP CONSTRAINT - 0
[self addConstraint:[NSLayoutConstraint constraintWithItem:self.button1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0] ];
// ADD BOTTOM - 0
[self addConstraint: [NSLayoutConstraint constraintWithItem:self.button1 attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0 ] ];
// LEFT
[self addConstraint: [NSLayoutConstraint constraintWithItem:self.button1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0 ] ];
// BUTTON 2
// ADD TOP CONSTRAINT - 0
[self addConstraint:[NSLayoutConstraint constraintWithItem:self.button2 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0] ];
// ADD BOTTOM - 0
[self addConstraint: [NSLayoutConstraint constraintWithItem:self.button2 attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0 ] ];
// ADD RIGHT - 0
[self addConstraint: [NSLayoutConstraint constraintWithItem:self.button2 attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0 ] ];
// Width constraint, half of parent view width
[self addConstraint:[NSLayoutConstraint constraintWithItem:self.button1
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeWidth
multiplier:0.5
constant:0]];
// Width constraint, half of parent view width
[self addConstraint:[NSLayoutConstraint constraintWithItem:self.button2
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeWidth
multiplier:0.5
constant:0]];
// AFTER ADDING WIDTH ALSO FOR BOTH BUTTONS, WILL HAVE TO ADD X SOME HOW ??? PUZZLE ???
我相信我还必须为两个按钮设置宽度。那应该是相等的宽度。如果只有button2,那么这个宽度也得在这里设置才对。如何为它们添加约束?
这就是我从其他屏幕调用此视图的方式:-
vov1 = [visitorOptView objectAtIndex:0];
// note the origin of the frame is (0, 0) since you are adding it to the cell instead of the table view
vov1.frame = CGRectMake(0, 0, selectedCell.frame.size.width, selectedCell.frame.size.height);
btnWidth = selectedCell.frame.size.width;
[vov1.button2 addTarget:self action:@selector(showVisitorDetailsView) forControlEvents:UIControlEventTouchUpInside];
// show/Enable "Start Chat" btn, else Disable it
if (tableView.tag == 0 || tableView.tag ==1)
// START
[vov1.button1 setTitle:@"Accept" forState:UIControlStateNormal];
[vov1.button1 addTarget:self action:@selector(acceptBtnClicked) forControlEvents:UIControlEventTouchUpInside];
else if (tableView.tag == 3)
// CLOSED LIST - HIDE ALL BTNS
[vov1.button1 setHidden:YES];
///// HERE addCustomConstraints SHOULD BE CALLED I THINK
// add overlay view to this row
[selectedCell.contentView addSubview:vov1];
你能帮我解决以上问题吗?
【问题讨论】:
【参考方案1】:在这种情况下,您应该通过代码添加约束。因此,当显示两个按钮时。第一个按钮尾随约束应绑定到第二个按钮约束的前导。如果“查看详细信息”按钮是唯一显示的按钮,则隐藏第一个按钮,该按钮的前导约束将与 self.view 的前导绑定。
创建一个名为addCustomConstraints
的方法并在viewDidLoad
中调用它。
【讨论】:
我已经创建了方法并在上面添加了。你能检查一下并帮我解决剩下的问题吗?我在编码和使用约束方面有点新意。谢谢。 首先你的约束是错误的。在“To item:”中,您传递 self,但如果约束与视图绑定,则应传递 self.view;如果约束与左按钮绑定,则应传递 self.button。其次,添加约束应该发生在 if/else 语句中。如果按钮被隐藏,应用程序应该添加一组约束,如果不是其他的。 // LEFT [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.viewDetailsButton attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0 ]]; 不要使用 [self button],因为 button 不是方法。在 if 语句中添加上面的代码。 我将 [self button1] 更改为 self.button1 。其次,我的类已经是 UIView 的子类,并且直接在其中有 2 个按钮。我无法获取 self.view。 我已经更新了方法,你可以看看它。对于 if() 部分,由于 button1 将被隐藏,因此他们无需为其添加任何约束或什么???以上是关于UIButton 在运行时更改尺寸的主要内容,如果未能解决你的问题,请参考以下文章