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

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

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

由于我需要我的布局在iOS 7和8上工作,所以我打算执行以下操作:

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

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" 

我还没有想出一个方法来做到这一点编程,但有一个相当体面的解决方法。

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

  • 在iOS 8上使用自动preferredMaxLayoutWidth ,并在iOS 7上显式使用。
  • 不得有警告。

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

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

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

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

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