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 在运行时更改尺寸的主要内容,如果未能解决你的问题,请参考以下文章

如何在功能运行时更改按钮的文本

如何以编程方式更改UIButton标签

运行时按钮框架更改

iPhone:我怎么能交换UIButton文字颜色?

更改在运行时添加的 ProgressBar 的宽度

在情节提要中更改 UIButton BorderColor