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

Sen*_*ful 15 iphone objective-c uilabel ios autolayout

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

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

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

  1. 在故事板中将值设置为Explicit.
  2. 在iOS 7上,以编程方式将值设置为显式的计算宽度.
  3. 在iOS 8上,以编程方式将值设置为自动.

1和2很容易.我该如何做第3步?我可以设置它吗?


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

如果您在故事板上将值设置为自动并进行检查preferredMaxLayoutWidth,您将看到它是0.

但是,尝试将其设置为0,即使它表示已经为0,也不能正常工作(例如标签保持为单行).例如,我尝试在故事板中将值设置为自动,然后viewDidLoad运行以下命令:

self.label.preferredMaxLayoutWidth = self.label.preferredMaxLayoutWidth;
Run Code Online (Sandbox Code Playgroud)

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


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);
Run Code Online (Sandbox Code Playgroud)

至于常数,我找不到任何东西.我能想到的最接近的常数是什么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>
Run Code Online (Sandbox Code Playgroud)

显式布局宽度:

<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>
Run Code Online (Sandbox Code Playgroud)

唯一的区别是后者有:

preferredMaxLayoutWidth="560"
Run Code Online (Sandbox Code Playgroud)

Sen*_*ful 8

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

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

设置为自动唯一方法是通过故事板,所以我们这样做.preferredMaxLayoutWidth

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

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

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

作为参考,这里是如何找出iOS版本,这里是如何获得屏幕宽度.请注意,您必须专门查找iOS 8,而不是对象是否响应preferredMaxLayoutWidth,因为该属性是在iOS 6中添加的.