Độ rộng bố cục tối đa tự động ưa thích không có sẵn trên các phiên bản iOS trước 8.0


322

Tôi đã mở một dự án iOS hiện có với Xcode6 beta6 và Xcode liệt kê cảnh báo sau cho cả tệp Storyboard và Xib:

Độ rộng bố cục tối đa tự động ưa thích không có sẵn trên các phiên bản iOS trước 8.0

Tôi đã thử giải quyết cảnh báo bằng cách đặt chiều rộng như rõ ràng như dưới đây:

Tuy nhiên, điều này đã không giải quyết các cảnh báo. Làm thế nào họ có thể được gỡ bỏ?


3
Tôi đang sử dụng XCode 6.1 và cập nhật tất cả các nhãn của tôi thành Preferred Width = Explicit. Điều này đã giải quyết vấn đề cho tôi.
djburdick

Câu trả lời:


373

Cập nhật 3:
Cảnh báo này cũng có thể được kích hoạt bởi các nhãn đã numberOfLinesđược đặt thành bất cứ thứ gì trừ 1 nếu mục tiêu triển khai của bạn được đặt thành 7.1. Điều này là hoàn toàn có thể tái tạo với dự án xem đơn mới.

Các bước để sinh sản:

  1. Tạo một dự án đơn, mục tiêu-c mới
  2. Đặt mục tiêu triển khai thành 7.1
  3. Mở bảng phân cảnh của dự án
  4. Thả nhãn vào bộ điều khiển xem được cung cấp
  5. Đặt numberOfLines cho nhãn đó thành 2.
  6. Biên dịch

Tôi đã nộp radar sau:
rdar: // vấn đề / 18700567

Cập nhật 2:
Thật không may, đây là một điều một lần nữa trong phiên bản phát hành của Xcode 6. Lưu ý rằng phần lớn bạn có thể chỉnh sửa bảng phân cảnh / xib của mình để khắc phục sự cố. Per Charles A. trong các ý kiến ​​dưới đây:

Điều đáng nói là bạn có thể dễ dàng vô tình đưa ra cảnh báo này và chính cảnh báo đó không giúp ích gì trong việc tìm ra nhãn hiệu là thủ phạm. Điều này thật đáng tiếc trong một bảng phân cảnh phức tạp. Bạn có thể mở bảng phân cảnh dưới dạng tệp nguồn và tìm kiếm bằng biểu thức chính quy <label(?!.*preferredMaxLayoutWidth)để tìm nhãn bỏ qua thuộc tính / giá trị ưa thíchMaxLayoutWidth. Nếu bạn thêm vào ưa thíchMaxLayoutWidth = "0" trên các dòng như vậy, thì cũng giống như đánh dấu rõ ràng và đặt giá trị 0.

Cập nhật 1:
Lỗi này hiện đã được sửa trong Xcode 6 GM.

Câu trả lời gốc
Đây là một lỗi trong Xcode6-Beta6 và XCode6-Beta7 và hiện có thể bỏ qua một cách an toàn.

Một kỹ sư của Apple trong diễn đàn Apple Developer đã nói điều này về lỗi này:

Chiều rộng bố cục tối đa được ưu tiên là thuộc tính bố cục tự động trên UILabel cho phép nó tự động phát triển theo chiều dọc để phù hợp với nội dung của nó. Các phiên bản Xcode trước 6.0 sẽ đặt ưu tiênMaxLayoutWidth cho nhãn đa dòng thành kích thước giới hạn hiện tại tại thời điểm thiết kế. Bạn sẽ cần cập nhật thủ côngMaxLayoutWidth theo cách thủ công khi thời gian chạy nếu bố cục ngang của bạn thay đổi.

iOS 8 đã thêm hỗ trợ để tự động tính toán ưa thíchMaxLayoutWidth khi chạy, điều này giúp việc tạo nhãn đa dòng thậm chí còn dễ dàng hơn. Cài đặt này không tương thích ngược với iOS 7. Để hỗ trợ cả iOS 7 và iOS 8, Xcode 6 cho phép bạn chọn "Tự động" hoặc "Rõ ràng" cho ưa thíchMaxLayoutWidth trong trình kiểm tra kích thước. Bạn nên:

Chọn "Tự động" nếu nhắm mục tiêu iOS 8 để có trải nghiệm tốt nhất. Chọn "Rõ ràng" nếu nhắm mục tiêu <iOS 8. Sau đó, bạn có thể nhập giá trị của ưu tiênMaxLayoutWidth mà bạn muốn đặt. Kích hoạt mặc định "Rõ ràng" cho kích thước giới hạn hiện tại tại thời điểm bạn chọn hộp.

Cảnh báo sẽ xuất hiện nếu (1) bạn đang sử dụng bố cục tự động, (2) "Tự động" được đặt cho nhãn đa dòng [bạn có thể kiểm tra điều này trong trình kiểm tra kích thước cho nhãn] và (3) mục tiêu triển khai của bạn <iOS số 8.

Có vẻ như lỗi là cảnh báo này xuất hiện đối với các tài liệu không tự động thanh toán. Nếu bạn đang thấy cảnh báo này và không sử dụng bố cục tự động, bạn có thể bỏ qua cảnh báo.

Thay phiên, bạn có thể giải quyết vấn đề bằng cách sử dụng trình kiểm tra tệp trên bảng phân cảnh hoặc xib trong câu hỏi và thay đổi "Bản dựng cho" thành "Bản dựng cho iOS 8.0 trở lên" Trình kiểm tra tệp Xcode


15
Điều đáng nói là bạn có thể dễ dàng vô tình đưa ra cảnh báo này và chính cảnh báo đó không giúp ích gì trong việc tìm ra nhãn hiệu là thủ phạm. Điều này thật đáng tiếc trong một bảng phân cảnh phức tạp. Bạn có thể mở bảng phân cảnh dưới dạng tệp nguồn và tìm kiếm bằng biểu thức chính quy <label(?!.*preferredMaxLayoutWidth)để tìm nhãn bỏ qua preferredMaxLayoutWidththuộc tính / giá trị. Nếu bạn thêm preferredMaxLayoutWidth="0"vào các dòng như vậy, nó giống như đánh dấu rõ ràng và đặt giá trị 0.
Charles A.

6
Có cách nào để lập cấu hình một UILabel để tự động điều chỉnh ưa thíchMaxLayoutWidth, mà không thực sự phân lớp nó hoặc thực hiện nó ở đâu đó trong layoutSubview không? Nếu đây là hành vi mà IB có thể kích hoạt, điều đó cho thấy có một thuộc tính hoặc giá trị ma thuật có thể được đặt. Nhưng không có gì trong các tài liệu hoặc tiêu đề API nói điều đó.
tảo

2
@CharlesA. Tôi đã thử nghiệm với một dự án trống và tìm thấy một thuộc tính nhãn khác sẽ kích hoạt cảnh báo này: nếu numberOfLinesđược đặt thành bất cứ thứ gì trừ 1, cảnh báo sẽ xảy ra bất kể bạn có preferredMaxLayoutWidthđặt hay không.
memmons

2
@ MichaelG.Emmons Lạ, tôi không thể sao chép điều này với một dự án sạch và mục tiêu triển khai được đặt thành 7.1. Khi tôi đặt thành preferredMaxLayoutWidth0 rõ ràng, cảnh báo sẽ biến mất bất kể numberOfLinesgiá trị. Nhưng có lẽ điều này đã được sửa trong bản cập nhật Xcode sáng nay?
Charles A.

2
Vậy ... là giải pháp duy nhất để đặt số lượng dòng thành 1 và thay đổi nó từ mã? điều này có vẻ không chuyên nghiệp
jomafer

315

Để tìm (các) nhãn vấn đề trong bảng phân cảnh lớn, hãy làm theo các bước của tôi dưới đây.

  1. Trong Trình điều khiển sự cố của xCode, nhấp chuột phải vào lỗi và chọn "Hiển thị nhật ký". (Lưu ý: @Sam gợi ý bên dưới, hãy xem trình điều hướng báo cáo của xCode. Ngoài ra, @Rivera lưu ý trong các nhận xét rằng "Kể từ Xcode 6.1.1, nhấp vào cảnh báo sẽ tự động mở và làm nổi bật nhãn xung đột". ).

nhập mô tả hình ảnh ở đây

  1. Điều này sẽ hiển thị lỗi với một mã ở cuối tập tin bảng phân cảnh của bạn. Sao chép giá trị sau .storyboard

nhập mô tả hình ảnh ở đây

  1. Tiếp theo, tiết lộ bảng phân cảnh của bạn dưới dạng tệp nguồn. nhập mô tả hình ảnh ở đây

  2. Tìm kiếm. Bạn sẽ có thể nói nhãn đó là gì từ đây khá dễ dàng bằng cách xem nội dung. nhập mô tả hình ảnh ở đây

Khi bạn tìm thấy nhãn, giải pháp phù hợp với tôi là đặt "chiều rộng ưa thích" thành 0.

nhập mô tả hình ảnh ở đây

BTW, bạn luôn có thể nhanh chóng lấy id của một mục giao diện bằng cách chọn mục đó và xem bên dưới thanh tra nhận dạng. Rất tiện dụng.

nhập mô tả hình ảnh ở đây


36
Đây phải là câu trả lời được chấp nhận! Điều này thực sự giải quyết vấn đề. Nó thậm chí còn giúp tìm các vấn đề khác trong Storyboard mà không xuất hiện bình thường. Một điều: Tôi thấy rằng Trình điều hướng Báo cáo đáng tin cậy hơn nhiều so với nhấp chuột phải vào "Hiển thị trong Nhật ký"
Sam Spencer

1
Yêu câu trả lời này, rất đơn giản và cố định cảnh báo. Cám ơn rất nhiều!
Ethan Parker

1
Cảm ơn bạn rất nhiềuhhhhh :)
SR Nayak

2
Tại sao bạn đặt chiều rộng ưa thích thành 0 thay vì chiều rộng được hiển thị trong trình tạo giao diện?
Xe đạp

9
Câu trả lời tuyệt vời! Bạn có thể tìm kiếm id đối tượng trực tiếp từ chế độ xem IB của Storyboard. Chỉ cần làm một Ctrl-f. Không cần phải mở nó dưới dạng mã nguồn và sau đó phải chuyển về chế độ xem IB để thay đổi độ rộng ưa thích.
AndroidDev

36

Bạn có thể khắc phục sự cố này mà không cần mở bảng phân cảnh dưới dạng nguồn . Cảnh báo này được kích hoạt bởi UILabels nếu numberOfLines! = 1 và mục tiêu triển khai là <8.0

LÀM THẾ NÀO ĐỂ TÌM ĐƯỢC NÓ?

  1. Chuyển đến vấn đề điều hướng (CMD + 8) và Chọn cảnh báo mới nhất được xây dựng với cảnh báo nhập mô tả hình ảnh ở đây
  2. Định vị (các) cảnh báo ( tìm kiếm " Bố cục tối đa tự động ưa thích ") và nhấn nút mở rộng ở bên phải
    nhập mô tả hình ảnh ở đây
  3. Tìm ID đối tượng của UILabel nhập mô tả hình ảnh ở đây
  4. Mở Storyboard và TÌM KIẾM (CMD + f) cho đối tượng. Nó sẽ CHỌN VÀ CAO CẤP UILabel
  5. Đặt Độ rộng ưa thích = 0 "Rõ ràng" như những người khác đã đề xuất

23

Giải pháp khá đơn giản

Chỉ cần bật Builds cho iOS 8 trở lên

nhập mô tả hình ảnh ở đây


khá đơn giản và phá hoại. Chỉ 85% người dùng iOS có trên iOS8 + developer.apple.com/support/app-store
aryaxt 29/07/2015

6
@aryaxt Tôi rất tiếc phải nói bạn sai. Bạn có thể đặt mục tiêu triển khai trong cài đặt dự án thành iOS 7 hoặc thấp hơn và thay đổi Bản dựng cho trong Tài liệu IB thành iOS 8 trở lên và nó sẽ hoạt động trên iOS 7. Vui lòng xác minh và xóa phần mềm. Bạn có thể kiểm tra nó ở đây developer.apple.com/l
Library / ios / recipes / từ

1
Như mọi khi, câu trả lời hay nhất không phải là câu trả lời được chấp nhận ... :) Chúc mừng!
HepaKKes

CẬP NHẬT cho iOS9.3 trở lên: Các thiết bị iOS7 không còn hiển thị bảng phân cảnh với cài đặt ở trên. Điều này được sử dụng để làm việc trước khi cập nhật 9.3. Có vẻ như Apple đã thay đổi điều gì đó trong quy trình tự động trước khi phát hành.
pechar

4

Bây giờ phiên bản Xcode của tôi là 6.1. Nhưng tôi cũng nhận được cảnh báo này. nó làm phiền tôi rất nhiều sau khi tìm kiếm nhiều lần. Tôi tìm thấy giải pháp.

Lý do: Bạn phải đặt Dòng UILabel> 1 trong Bảng phân cảnh của mình.

Giải pháp: đặt thuộc tính UILabel Lines của bạn thành 1 trong Storyboard. khởi động lại Xcode của bạn. Nó làm việc cho tôi, hy vọng nó có thể giúp nhiều người hơn.

Nếu bạn thực sự cần hiển thị các từ của bạn nhiều hơn 1 dòng. bạn nên làm điều đó trong mã.

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.origin.x, self.UserNameLabel.frame.origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;

3
"Nếu bạn thực sự cần hiển thị các từ của bạn nhiều hơn 1 dòng. Bạn nên làm điều đó trong mã." Đây là một troll, phải không?
webstersx 10/2/2015

@webstersx Tôi nghĩ anh ấy nghiêm túc
Jasper

4

Tóm lại, đối với tôi, tôi làm theo hai hướng dẫn ở trên để thay đổi bất kỳ trường hợp nào trong đó numberOfLines = 0 thành 1 hoặc cao hơn và thêm thủ công ưu tiênMaxLayoutWidth = "0" vào mỗi phiên bản của nhãn trong nguồn bảng phân cảnh đã sửa tất cả các cảnh báo của tôi.


Anh bạn là một WIZZARD! Hoạt động ngay cả với một UIScrollerView như mong đợi. GIẢI PHÁP TỐT NHẤT cho đến nay vì tôi có thể rời khỏi mục tiêu triển khai của Nib trên iOS7.0
Yaro

3

Vì tôi không có 50 Stackoverflow danh tiếng nên sẽ không để tôi nhận xét về câu trả lời hay thứ hai. Tìm thấy một mẹo khác để tìm nhãn thủ phạm trong Storyboard.

Vì vậy, khi bạn biết id của nhãn, hãy mở bảng phân cảnh của bạn trong tab riêng biệt với các bộ điều khiển xem được hiển thị và chỉ cần thực hiện lệnh F và lệnh V và sẽ đưa bạn thẳng đến nhãn đó :)


Bạn có nghĩa là tìm kiếm trong dự án cho nhãn id.
Borzh

2

Tôi đã làm cho nó hoạt động bằng cách chọn bố cục ban đầu tôi có trong lựa chọn W / H. Storyboard đang hoạt động như mong đợi và lỗi đã biến mất.

Hãy chắc chắn rằng bạn đang phát triển cho iOS 8.0. Kiểm tra xem từ cài đặt chung của dự án.

Đây là nơi bạn nên nhấn.


1

Tôi đã có vấn đề này và đã có thể khắc phục bằng cách thêm các ràng buộc để xác định mức tối đa cho nhãn.

Khi thả nhãn multiline vào, không có ràng buộc nào được đặt để thực thi độ rộng bên trong khung nhìn cha. Đây là nơi PreferredMaxWidth mới phát huy tác dụng. Trên iOS 7 trở về trước, bạn phải tự xác định chiều rộng tối đa. Tôi chỉ cần thêm một ràng buộc 10px ở phía bên trái và bên phải của nhãn.

Bạn cũng có thể thêm <= ràng buộc chiều rộng cũng khắc phục sự cố.

Vì vậy, đây không thực sự là một lỗi, bạn chỉ cần tự xác định độ rộng tối đa. Tùy chọn rõ ràng được đề cập trong câu trả lời khác cũng sẽ hoạt động khi bạn đang đặt giá trị độ rộng này tuy nhiên bạn sẽ phải sửa đổi giá trị này nếu bạn muốn chiều rộng tối đa thay đổi dựa trên chiều rộng cha mẹ (vì bạn đã đặt rõ ràng chiều rộng).

Giải pháp trên của tôi đảm bảo chiều rộng luôn được duy trì cho dù tầm nhìn của phụ huynh lớn đến đâu.


1

Vì một số lý do, ngay cả khi thay đổi Mục tiêu triển khai iOS thành 8.0 trở lên, các tệp Xib không chấp nhận thay đổi đó và duy trì với các cài đặt trước đó trong Trình kiểm tra tệp

Trình kiểm tra tệp trong Xib sau khi thay đổi mục tiêu Triển khai iOS

Do đó, bạn nên thay đổi thủ công cho từng Xib Sau khi thay đổi thủ công

Sau khi thực hiện xong, cảnh báo sẽ biến mất :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.