2014-12-30 15 views
13

tôi nhận được các lỗi sau đây khi tôi cố gắng để thiết lập một nhãn Preferred Width để Automatic trong một kịch bản:Cách đặt mức ưu tiên của nhãnMaxLayoutWidth thành tự động theo chương trình?

Attribute Unavailable: Tự động Preferred Max Giao diện rộng không có sẵn trên các phiên bản iOS trước 8,0

Vì tôi cần bố trí của tôi để làm việc trên cả iOS 7 và 8, tôi đã lên kế hoạch thực hiện như sau:

  1. Đặt giá trị thành Rõ ràng trong bảng phân cảnh.
  2. Trên iOS 7, đặt giá trị thành độ rộng rõ ràng, được tính toán theo chương trình.
  3. Trên iOS 8, đặt giá trị thành tự động theo chương trình.

1 và 2 thật dễ dàng. Làm cách nào để thực hiện bước 3? Có một hằng số tôi có thể đặt nó?


Dưới đây là những gì tôi đã cố gắng cho đến nay ...

Nếu bạn thiết lập giá trị để tự động trên một cốt truyện và bạn kiểm tra preferredMaxLayoutWidth, bạn sẽ thấy rằng nó là 0.

Tuy nhiên, cố gắng đặt thành 0, ngay cả khi nó đã là 0, không hoạt động đúng cách (ví dụ: nhãn vẫn là một dòng). Ví dụ, tôi đã cố gắng thiết lập các giá trị cho tự động trong kịch bản, và trên viewDidLoad, tôi chạy như sau:

self.label.preferredMaxLayoutWidth = self.label.preferredMaxLayoutWidth; 

Khi tôi không chạy đoạn mã trên, các nhãn có kích thước đúng. Tuy nhiên, khi tôi chạy mã trên (mà không nên làm gì), nó vẫn là một dòng (hành vi không mong muốn).


Các tập tin tiêu đề cho UILabel nói:

// 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); 

Theo như một hằng số, tôi không thể tìm thấy bất cứ điều gì. Hằng số gần nhất tôi có thể nghĩ đến những gì tôi muốn là UITableViewAutomaticDimension, không hoạt động.

Dưới đây là những gì mà kịch bản trông giống như ....

Automatic chiều rộng bố trí:

<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> 

Explicit bố trí width:

<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> 

Sự khác biệt duy nhất là sau này có:

preferredMaxLayoutWidth="560" 
+0

Để tham khảo, có một chuỗi liên quan trên biểu mẫu nhà phát triển của Apple: https: // devforums .apple.com/message/1061142 # 1061142 – Senseful

Trả lời

8

Tôi đã không tìm ra cách để làm điều này theo lập trình, nhưng có một cách giải quyết khá tốt.

Bất kỳ workaround hợp lệ phải đáp ứng các yêu cầu này:

  • Sử dụng tự động preferredMaxLayoutWidth trên iOS 8, và rõ ràng trên iOS 7.
  • Phải không có cảnh báo.

Các chỉ cách để thiết lập preferredMaxLayoutWidth để tự động là thông qua một kịch bản, vì vậy chúng tôi làm như vậy.

Để ngăn chặn cảnh báo trên, đặt số lượng Đường là 1.

Bây giờ, lập trình, làm như sau:

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

Để tham khảo, đây là how to find out the iOS version, và đây là cách để có được những screen width. Lưu ý rằng bạn phải tìm kiếm riêng iOS 8 và không hay không đối tượng phản hồi với preferredMaxLayoutWidth, vì thuộc tính đó đã được thêm vào iOS 6.

Các vấn đề liên quan