如何以编程方式自动将标签的preferredMaxLayoutWidth设置为自动?

时间:2014-12-30 20:09:50

标签: ios objective-c iphone uilabel autolayout

当我尝试在故事板中将标签的首选宽度设置为自动时出现以下错误:

  

属性不可用:自动首选最大布局宽度在8.0之前的iOS版本上不可用

由于我需要在iOS 7和8上使用我的布局,我计划执行以下操作:

  1. 在情节提要中将值设置为明确
  2. 在iOS 7上,以编程方式将值设置为显式的计算宽度。
  3. 在iOS 8上,以编程方式将值设置为自动。
  4. 1和2很容易。我该如何做第3步?我可以将它设置为常量吗?


    这是我到目前为止所尝试的内容......

    如果您在情节提要上将值设置为自动并且检查了preferredMaxLayoutWidth,则会看到它是0

    但是,尝试将其设置为0,即使它已经为0,也不能正常工作(例如标签保持为单行)。例如,我尝试在故事板中将值设置为自动,在viewDidLoad上,我运行了以下内容:

    self.label.preferredMaxLayoutWidth = self.label.preferredMaxLayoutWidth;
    

    当我不运行上述代码时,标签的大小正确。但是,当我运行上面的代码(它什么也不做)时,它仍然是一行(不良行为)。


    UILabel的头文件说:

    // Support for constraint-based layout (auto layout)
    // If nonzero, this is used when determining -intrinsicContentSize for multiline labels
    @property(nonatomic) CGFloat preferredMaxLayoutWidth NS_AVAILABLE_IOS(6_0);
    

    就常数而言,我找不到任何东西。我能想到的最接近的常数是UITableViewAutomaticDimension,它不起作用。

    这是故事板的样子......

    自动布局宽度:

    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="1000" text="Foo" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Bis-iG-g4l">
        <rect key="frame" x="20" y="116" width="560" height="21"/>
        <fontDescription key="fontDescription" type="system" pointSize="17"/>
        <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
        <nil key="highlightedColor"/>
    </label>
    

    显式布局宽度:

    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="1000" text="Foo" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="560" translatesAutoresizingMaskIntoConstraints="NO" id="Bis-iG-g4l">
        <rect key="frame" x="20" y="116" width="560" height="21"/>
        <fontDescription key="fontDescription" type="system" pointSize="17"/>
        <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
        <nil key="highlightedColor"/>
    </label>
    

    唯一的区别是后者有:

    preferredMaxLayoutWidth="560"
    

1 个答案:

答案 0 :(得分:8)

我还没有找到以编程方式执行此操作的方法,但有一个相当不错的解决方法。

任何有效的解决方法都必须满足以下要求:

preferredMaxLayoutWidth设置为自动的唯一方式是通过故事板,因此我们这样做。

为了抑制上述警告,将行数设置为1

现在,以编程方式执行以下操作:

self.label.numberOfLines = 0;
if (iOS8) {
    ; // do nothing, it will use automatic via the storyboard
} else {
    self.label.preferredMaxLayoutWidth = screenWidth - 32;
}

供参考,此处为how to find out the iOS version,以下是获取screen width的方法。请注意,您必须专门查找iOS 8,而不是该对象是否响应preferredMaxLayoutWidth,因为该属性已在iOS 6中添加。