UIButton按照自己的大小进行自动布局

5
我尝试的是这个:-
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[self.view addSubview:btn];
btn.translatesAutoresizingMaskIntoConstraints = NO;
[btn addTarget:self action:@selector(bringUpNextViewController:) 
                    forControlEvents:UIControlEventTouchUpInside];
btn.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:14];
[btn setTitle:@"8" forState:UIControlStateNormal];
[self.view layoutIfNeeded];

NSLog(@"button size : %@", NSStringFromCGSize(btn.frame.size));

作为输出,我得到了这个:
button size : {30, 29}

然后,我将`setTitle`的字符串设置为空。按钮宽度仍然为30。
那么为什么这总是这种情况?
我还尝试了给出“高压缩阻力优先级”和“高内容抱紧优先级”。但不会收缩到零。
问题也在于我想根据其内容简单地减小按钮的宽度,而不给出任何固定宽度。
我可以获取文本的宽度并赋值给按钮的宽度,但如果按钮占用内容宽度,则不需要这样做。
编辑:
也不是插图导致宽度为30。虚假值。
4个回答

7
一个按钮由多个子视图组成。很可能按钮内部的布局在标签和按钮视图本身之间有一些默认填充。
创建一个像您的按钮并检查约束,会显示以下内容:
button constraints (
"<NSContentSizeLayoutConstraint:0x8c40a60 H:[UIButton:0x8f29840(30)] Hug:250 CompressionResistance:750>",
"<NSContentSizeLayoutConstraint:0x8c55280 V:[UIButton:0x8f29840(29)] Hug:250 CompressionResistance:750>"
)

30和29与您看到的大小值相吻合。按钮的内在内容大小属性也返回30,29。基本上,这是一个按钮的最小尺寸,在缺少其他任何东西的情况下。
不太清楚您想要什么或为什么会感到困扰。任何更小的尺寸都将成为差劲的触摸目标,而没有标签或图像的按钮将无法看到。如果您添加了更长的标题,则按钮的大小将变大。如果您添加其他约束来强制特定大小,则这些约束将覆盖内在内容大小。
如果您希望按钮在没有标题时变得不可见,请明确隐藏它。这使您在代码中的意图更加清晰,并将防止用户意外点击他们实际上看不到的按钮。

嗯,好的。现在听起来还不错。但正如我在问题中提到的,“问题也在于我想根据按钮的内容简单地减小其宽度,而不给出任何固定的宽度。” 而且默认的 30 内容大小似乎有点太大了,我只是不想让按钮出现。那样会更好。 - esh
啊!我明白了。在这种情况下,当您想要隐藏按钮时,可以手动添加零宽度约束条件,然后在您想要再次显示它时删除约束条件。 - Fogmeister
是的,我想这样更好。顺便问一下,我是否漏掉了什么。除了将约束存储在变量中或者如果您没有将其存储为这样的话,迭代所有约束,查找、删除和重写约束之外,是否有一种方法可以覆盖给定的约束(即稍后更改它)? - esh
1
将限制条件存储在属性中通常是最好的选择。对于您的特定要求,像@Fogmeister建议的那样,显式设置宽度约束为零将是最简单的方法。不过,您仍需要考虑按钮之间的任何插入值。 - jrturton
好的,我会做。谢谢。 - esh
显示剩余3条评论

1

我想知道uibutton的最小固有内容大小是否存在?

无论如何,请尝试...

[button invalidateIntrinsicContentSize];

啥?哦...我一定是误触了。哈哈!我当时在用iPad回答的。 - Fogmeister

0

你试过 [button sizeToFit]; 吗?

对于自定义按钮,我认为你需要重写:

- (CGSize)sizeThatFits:(CGSize)size;

最后,如果其他方法都不行,你可以尝试根据文本大小为按钮设置宽度。

CGSize textsize = [yourText sizeWithFont:[UIFont fontWithName:@"HelveticaNeue" size:14]]; 
[button setFrame:CGRectMake(0,0,textsize.width, textsize.height)];

几点需要注意。a)我正在使用“自动布局”(没有框架世界)。b)sizeWithFont已被弃用。需要使用boundingRectWithSize代替它(具有未来性)。 - esh
我最终使用文本的宽度,并使用自动布局。这只是与苹果相关的内容。 - esh
好的。这些方法与自动布局不太兼容,但如果我找到了什么,我会再联系你的。 - aksh1t

0

首先在Storyboard中定义按钮大小的约束。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *buttonSizeConst;

之后,您可以像这样将其大小设置为任何您想要的尺寸。

self.buttonSizeConst.constant = 65.0;

enter image description here

编辑:使用此方法,您需要计算按钮的宽度,但我认为您不想这样做。您需要自动调整UIButton以适应其内容。为此,您应该像下面的图像一样给出约束条件。当您更改标题时,它将向右扩展。

enter image description here


这是与苹果相关的内容。不知道那个“30”来自哪里。我已经知道了这种方法。 - esh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接