【问题标题】:UIButton takes up its own size AutolayoutUIButton 占用自己的大小 Autolayout
【发布时间】:2014-06-10 17:18:53
【问题描述】:

我尝试的是这样的:-

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。

那么为什么总是这样呢?

我还尝试提供high compression resistance priorityhigh content hugging priority。不会缩水。

问题还在于我想仅根据其内容来减小按钮的宽度,而没有给出任何固定宽度。

我可以获取文本的宽度并为按钮指定宽度,但如果按钮占用了内容宽度,我也不需要这样做。

编辑:

导致宽度为30 的也不是插图。鬼值。

【问题讨论】:

    标签: ios uibutton autolayout


    【解决方案1】:

    一个按钮由几个子视图组成。按钮的内部布局很可能在标签和按钮视图本身之间有一些默认填充。

    制作一个像你这样的按钮并检查约束显示如下:

    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。基本上这是按钮的最小尺寸,没有其他任何东西。

    目前还不太清楚你想要什么,或者你为什么对此感到困扰。任何较小的东西都将是一个糟糕的触摸目标,没有标签或图像的按钮无论如何都是不可见的。如果添加更长的标题,按钮会变大。如果您添加其他约束来强制特定大小,那么这些将覆盖内在内容大小。

    如果您希望按钮在没有标题时变得不可见,那么您应该明确隐藏它。这使您在代码中的意图更加清晰,并防止用户意外点击他们看不到的按钮。

    【讨论】:

    • 嗯,好的。现在听起来不错。但正如我在问题中提到的,The problem is also the fact that I want to reduce the width of the button simply based on its content, without giving any fixed width.30 对于默认内容大小似乎有点太大了,我只是根本不希望按钮出现。这样会更好。
    • @BlackFlam3 Apple HIG 声明按钮的最小触摸区域大小应为 44x44 点。 30 对于按钮来说已经太小了,无法轻松点击。进一步减小它的大小是没有意义的。
    • 在这种情况下隐藏按钮会比依赖布局更好。您可以在设置标题时轻松完成此操作。
    • 对于这种特殊情况,我在它旁边(即右侧)布置了其他按钮,所以我想将它们拉在一起。所以我只是依靠按钮大小来做到这一点。并编写所有布局代码来做到这一点......麻烦。这就是我所说的tad too big。什么都不给我会更好。
    • 在属性中存储约束通常是最好的选择。正如@Fogmeister 所建议的那样,对于您的特定要求,将宽度约束明确设置为零将是最简单的。不过,您仍然需要考虑按钮之间的任何插图
    【解决方案2】:

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

    不管怎样,试着做...

    [button invalidateIntrinsicContentSize];
    

    【讨论】:

    • 嗯?哦……我一定是打错了。哈哈!我接电话时在我的 iPad 上。
    【解决方案3】:

    首先在情节提要中定义按钮大小的约束。

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

    之后,您可以将其大小设置为您想要的任何大小。

    self.buttonSizeConst.constant = 65.0;
    

    编辑:使用这种方法,您需要计算按钮宽度,但我认为您不想这样做。您需要为其内容自动调整 UIButton 的大小。为此,您应该给出如下图所示的约束。当您更改标题时,它会向右展开。

    【讨论】:

    • 它的苹果相关的东西。想知道那个“30”是从哪里来的。这个方法我已经知道了。
    【解决方案4】:

    你试过[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)我正在使用Autolayout(无框架世界)。 b) sizeWithFont 已弃用。需要为此使用boundingRectWithSize(未来证明)。
    • 我最终使用了文本的宽度,使用自动布局。这只是苹果相关的东西。
    • 好的。这些方法与自动布局不太兼容,但如果我发现了什么,我会回复你。
    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 2015-05-28
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多