12

我有一个包含 UIButton 的 UIView。UIButton 为 UIControlStateNormal(“Follow”)和 UIControlStateSelected(“Following”)状态设置了 2 个标题。我在 UIButton 上使用自动布局,它有一个约束,即与父视图顶部有一定距离,而另一个约束与父视图左侧有一定距离。我还在上面使用了“适合内容的大小”。

当我从代码中将按钮设置为处于选定状态时,标题会正确更改,但 UIButton 的固有宽度不会更改,因此当从“跟随”更改为“跟随”时,文本会变成椭圆形。

self.selected = self.following;

在此处输入图像描述在此处输入图像描述

当我以不同的方式解决问题并在有人点击按钮时简单地更改 UIControlStateNormal 的文本时,按钮会正确更改大小。

NSString *title = (self.following) ? @"Following" : @"Follow"
[self setTitle:title forState:UIControlStateNormal];

在此处输入图像描述在此处输入图像描述

这是 UIKit 中的错误吗?我希望按钮在其状态发生变化时更改其固有大小以正确反映文本的新大小,特别是因为除了 2 个按钮状态的文本之外,我还想更改其他内容。

4

4 回答 4

23

就像 David Caunt 在评论中指出的那样,调用invalidateIntrinsicContentSize会导致自动布局调整按钮的大小以适应它的新内容。

self.selected = self.following;
[self invalidateIntrinsicContentSize];

PS。大卫,如果你想发布你的命令作为答案,我会删除我的。

于 2013-12-23T23:50:51.387 回答
1

对我来说,设置contentEdgeInsets给了我唯一可靠的解决方案。

我正在使用带有背景图像的自定义按钮。因此,切片出现了。事实证明,您如何切片图像也会影响内在内容大小!测试它!因此,我必须确保在不同状态的图像之间进行相同的切片。我也在使用属性字符串。此处发布的解决方案不适用于我的情况。

经过一天(!)的实验后,我发现在按钮上设置足够的 contentEdgeInsets 值可以使其在使用自动布局更改标题时正常运行。如果您这样做,则无需使内在内容大小无效或调用任何布局代码。

您可以在代码或 IB 中设置 contentEdgeInsets。

self.button.contentEdgeInsets = UIEdgeInsetsMake(10.0, 16.0, 10.0, 16.0);

我认为除了 var 属性之外,Swift 代码是相同的。

Apple 在文档中这样说:“按钮使用此属性来确定 intrinsicContentSize 和 sizeThatFits:.”。

在此处输入图像描述

于 2015-03-19T21:11:21.823 回答
1

在您的故事板中选择您的 UIButton 并在顶部选择编辑器-> 大小以适合内容大小。

编辑:试试这个:

[self.myButton setTitle:@"Following" forState:UIControlStateSelected];
[self.myButton sizeToFit];
于 2013-07-31T22:16:59.427 回答
0

我不知道这是一个错误,还是它本身就是一个错误,但看起来你必须解决它——我不认为你做错了什么。如果您想在每次触摸后在选中和不选中之间切换,您可以执行以下操作:

- (IBAction)buttonClick:(UIButton *)sender {
    sender.selected = !sender.selected;
    if (sender.selected) {
        [self.button setTitle:@"Following" forState:UIControlStateNormal];
        //Do whatever else you want to do here for the selected state
    }else{
        [self.button setTitle:@"Follow" forState:UIControlStateNormal];
    }
}
于 2013-08-01T01:03:13.537 回答