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

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

Attribute Unavailable: Automatic Preferred Max Layout Width is not available on iOS versions prior to 8.0

由于我需要我的布局在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;
}

作为参考,这里是how to find out the iOS version,这里是如何获得screen width.请注意,您必须专门查找iOS 8,而不是对象是否响应preferredMaxLayoutWidth,因为该属性是在iOS 6中添加的.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...