【问题标题】:Can't shrink UILabel to fit content when rotating旋转时无法缩小 UILabel 以适应内容
【发布时间】:2014-03-25 03:50:00
【问题描述】:

我无法让我的 UILabel 使用自动布局正确调整大小。基本上我希望我的标签的大小总是足够大以匹配它的内容。这里有一些图片来说明我的意思。

请注意横向方向的额外顶部和底部填充。我不想要那个。我希望标签垂直收缩,以便它只包含其内容。

我有一个 33 的顶部约束到顶部布局指南,一个 75 的前导约束到超级视图,一个 75 的尾随约束到超级视图。

所以我的目标还是允许根据方向调整标签大小,但让标签只包含其内容而没有任何填充。

谢谢。

【问题讨论】:

  • 带有自动布局的多行标签很难。当方向改变时,您似乎需要强制另一个布局传递。尝试在该视图上调用setNeedsLayoutlayoutIfNeeded,看看是否有帮助。这不是答案,因为知道自动布局,这可能行不通。

标签: ios uilabel autolayout autoresize


【解决方案1】:

你需要的是一个灵活的约束。因此,假设让底部约束大于或等于0,并将其优先级设置为100。然后选择UILabel 并将其Vertical Content Hugging 优先级更改为99。这样,内容拥抱优先于底部距离,并且填充将在所有方向上消失。

【讨论】:

  • 感谢您的回复,但这不起作用。我还是有同样的问题。
【解决方案2】:

编辑:下面是比我更好的答案:https://stackoverflow.com/a/15927392/3414722
它应该完全符合您的要求,并且可以与 Auto Layout 一起使用。


您可以在每次更改方向时调用标签上的sizeToFit。从理论上讲,sizeToFit 不应该与 Auto Layout 一起使用,但它应该会给你想要的效果。这是您视图中需要的代码:

- (void)updateViewConstraints {
    [super updateViewConstraints];

    [self.label sizeToFit];
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];

    [self.view setNeedsUpdateConstraints];
}

【讨论】:

    【解决方案3】:

    看起来只在影响大小的任何更改(旋转、xib 调整大小等)上更新 preferredMaxLayoutWidth 即可。

    示例: 我在 IB 中设计了一个 iPhone 屏幕尺寸的视图,如下所示:

    要使其在横向工作,请在您的视图控制器中添加以下代码:

    - (void)updateLabelPreferredMaxLayoutWidthToCurrentWidth:(UILabel *)label
    {
        label.preferredMaxLayoutWidth =[label bounds].size.width;
    }
    
    -(void)updateLabels
    {
        [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label1];
        [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label2];
        [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label3];
    }
    
    - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
        [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
    
        [self updateLabels];
    }
    

    基本上,我们只是在 willAnimateRotationToInterfaceOrientation 中更改每个标签的 preferredMaxLayoutWidth,因为那里正在更改大小。结果是:

    如果要支持多种显示尺寸,只需像这样调用 viewDidAppear 中的 updateLabels 即可:

    -(void)viewDidAppear:(BOOL)animated
    {
        [self updateLabels];
    }
    

    这是因为,我设计了一个带有 iPhone 显示尺寸的 xib,但想支持多个显示尺寸。在视图已经出现后,计算所有元素的确切大小。

    iPad Portrait Demo 与 viewDidAppear 中相同的 xib 和调整代码:

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多