如何将标签的preferredMaxLayoutWidth设置为自动编程?
当我尝试在故事板中将标签的“ 首选宽度”设置为“ 自动”时 ,出现以下错误:
属性不可用:自动首选最大版面宽度在8.0之前的iOS版本上不可用
由于我需要我的布局在iOS 7和8上工作,所以我打算执行以下操作:
- 将值设置为故事板中的显式 。
- 在iOS 7上,以编程方式将该值设置为明确的计算宽度。
- 在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中添加的。