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



由于我需要在iOS 7和8上都可以使用布局,因此我打算执行以下操作:

  • 将值设置为 Storyboard 中的显式
  • 在iOS 7上,通过编程将值设置为显式的计算宽度。
  • 在iOS 8上,以编程方式将该值设置为自动。

  • 1和2很容易。我该如何执行第3步?我可以将其设置为常数吗?

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

    如果在 Storyboard 上将该值设置为auto并检查preferredMaxLayoutWidth,您将看到它是0

    但是,即使将其设置为0,即使将其设置为0,也无法正常工作(例如,标签停留在单行中)。例如,我尝试在 Storyboard 中将值设置为自动,然后在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,它不起作用。

    这是 Storyboard 的样子。

    自动版面宽度:
    <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自动设置为唯一方法是通过 Storyboard ,因此我们这样做。

    为了消除上述警告,将行数设置为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中添加的。

    关于ios - 如何以编程方式将标签的preferredMaxLayoutWidth设置为自动?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27711853/

    10-13 04:01