427

Các thành viên, tôi gặp sự cố với AutoLayout trong Interface Builder (Xcode 5 / iOS 7). Nó rất cơ bản và quan trọng vì vậy tôi nghĩ mọi người nên biết cách hoạt động của nó. Nếu đây là một lỗi trong Xcode, thì đây là một lỗi nghiêm trọng!

Vì vậy, bất cứ khi nào tôi có một hệ thống phân cấp xem như thế này, tôi gặp rắc rối:

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)

UIScrollView có các ràng buộc vững chắc, ví dụ: 50 px từ mọi phía (không có vấn đề gì). Sau đó, tôi thêm một ràng buộc Không gian hàng đầu vào UILabel (không có vấn đề gì) (và tôi thậm chí có thể ghim chiều cao / chiều rộng của nhãn, không thay đổi gì, nhưng không cần thiết do kích thước nội tại của Nhãn)

Rắc rối bắt đầu khi tôi thêm một ràng buộc theo dõi vào UILabel:

Ví dụ: Trailing Space to: Superview Bằng: 25

Bây giờ có hai cảnh báo xảy ra - và tôi không hiểu tại sao:

A) Sự mơ hồ về kích thước nội dung có thể cuộn (Chế độ xem cuộn có chiều cao / chiều rộng nội dung có thể cuộn mơ hồ)

B) Lượt xem bị đặt sai (Nhãn dự kiến: x = -67 Thực tế: x = 207

Tôi đã làm ví dụ tối thiểu này trong một dự án mới mà bạn có thể tải xuống và tôi đã đính kèm một ảnh chụp màn hình. Như bạn có thể thấy, Trình tạo giao diện hy vọng Nhãn sẽ nằm ngoài ranh giới của UIScrollView (hình chữ nhật nét đứt màu cam). Cập nhật khung của Nhãn bằng Công cụ giải quyết vấn đề sẽ di chuyển nó ngay tại đó.

Xin lưu ý: Nếu bạn thay thế UIScrollView bằng UIView, hành vi sẽ như mong đợi (khung của Nhãn là chính xác và theo ràng buộc). Vì vậy, dường như có một vấn đề với UIScrollView hoặc tôi đang bỏ lỡ điều gì đó quan trọng.

Khi tôi chạy Ứng dụng mà không cập nhật khung của Nhãn như được đề xuất bởi IB, nó được đặt ở vị trí tốt, chính xác vị trí của nó và UIScrollView có thể cuộn được. Nếu tôi cập nhật khung thì Nhãn sẽ khuất tầm nhìn và UIScrollView không cuộn.

Giúp tôi Obi-Wan Kenobi! Tại sao bố trí mơ hồ? Tại sao quan điểm không đúng chỗ?

Bạn có thể tải xuống dự án mẫu tại đây và thử xem bạn có thể biết chuyện gì đang xảy ra không: https://github.com/Wirsing84/AutoLayoutPro Hiệu

Minh họa vấn đề trong Interface Builder

|
935

LƯU Ý: Trên iOS> 10.0, điều này chưa được thử nghiệm; do đó, giải pháp có thể không đầy đủ trong các tình huống nhất định.

Vì vậy, tôi chỉ sắp xếp theo cách này:

  1. Bên trong UIScrollView thêm một UIView(chúng ta có thể gọi đó contentView);

  2. Trong trường hợp này contentView, đặt lề trên, dưới, trái và phải thành 0 (tất nhiên từ scrollViewđó là superView); Đặt cũng căn giữa tâm theo chiều ngang và chiều dọc ;

Xong rồi .

Bây giờ bạn có thể thêm tất cả các chế độ xem của mình vào đó contentViewvà quan contentSizeđiểm scrollViewsẽ được tự động thay đổi kích thước theo contentView.

Cập nhật:

Một số trường hợp đặc biệt được bao phủ bởi video này được đăng bởi @Sergio trong các bình luận bên dưới.

|
  • 1

    Thật là tuyệt vời! Trung tâm X và Y là mảnh ghép quan trọng!

    – Tạ Chiêu Minh 07:13:59 23/03/2015
  • 1

    Gần như hoàn hảo, ngoại trừ việc scrollview không còn có thể đoán độ dài nội dung của bạn và thay đổi kích thước cho phù hợp với nội dung của nó để phù hợp với các đối tượng bên trong. Tôi có một chế độ xem bảng bên trong nội dung Xem có thay đổi chiều cao (thông qua ràng buộc) và cuộn xem không cho phép tôi cuộn.

    – Trịnh Thục Nhi 07:13:13 11/05/2015
  • 1

    Có lẽ video này có thể giúp khắc phục tất cả các vấn đề còn lại.

    – Trịnh Hải Quân 18:57:06 11/07/2015
  • 1

    Điều này không làm cho nó cuộn tho.

    – Tạ Tú Nguyệt 12:46:05 06/08/2015
  • 1

    Đối với bất kỳ ai gặp phải vấn đề với ScrollView không thể cuộn được, việc đặt đáy và căn chỉnh trung tâm ràng buộc theo chiều dọc với mức độ ưu tiên thấp đã là mẹo cho tôi!

    – Hồ Mỹ Huyền 08:49:13 13/05/2016
91

Lỗi này khiến tôi mất một lúc để theo dõi, ban đầu tôi đã thử ghim kích thước của ScrollView nhưng thông báo lỗi ghi rõ "kích thước nội dung". Tôi chắc chắn rằng mọi thứ tôi ghim từ đầu ScrollView cũng được ghim xuống phía dưới. Bằng cách đó, ScrollView có thể tính toán chiều cao nội dung của nó bằng cách tìm chiều cao của tất cả các đối tượng & ràng buộc. Điều này đã giải quyết được chiều cao nội dung mơ hồ, chiều rộng khá giống nhau ... Ban đầu tôi có hầu hết mọi thứ X tập trung trong ScrollView, nhưng tôi cũng phải ghim các đối tượng sang một bên của ScrollView. Tôi không thích điều này vì iPhone6 ​​có thể có màn hình rộng hơn nhưng nó sẽ loại bỏ lỗi 'độ rộng nội dung mơ hồ'.

|
  • 1

    Cảm ơn bạn vì câu trả lời! Nếu tôi hiểu bạn một cách chính xác, bạn đạt được để loại bỏ lỗi bằng cách ghim từng và mọi khung nhìn trong ScrollView lên trên cùng và dưới cùng. Tuy nhiên, điều này là không cần thiết. Bạn chỉ cần đảm bảo rằng có một cách để tạo một dòng ràng buộc liên tục từ đầu đến cuối của cuộn xem. [-XXX] Tôi hy vọng điều đó có thể hiểu được;>

    – Tạ Chiêu Minh 08:38:17 02/10/2013
  • 1

    Làm thế nào để khắc phục vấn đề nếu chế độ xem có độ cao thay đổi? Làm cách nào để thiết lập các ràng buộc sau đó để scrollview có thể tính toán kích thước?

    – Trịnh Thục Nhi 01:38:44 24/10/2013
  • 1

    'Bạn chỉ cần đảm bảo rằng có một cách để tạo ra một dòng ràng buộc liên tục từ đầu đến cuối cuộn giấy' <- cảm ơn vì câu đó

    – Trịnh Hải Quân 11:52:29 09/04/2014
  • 1

    Điều giúp tôi là đảm bảo chế độ xem cuộn được ghim vào giám sát và không phải là hướng dẫn bố cục trên cùng hoặc dưới cùng. Tôi đã loại bỏ các ràng buộc cho hướng dẫn bố cục dưới cùng và đi qua menu thay vì trình tạo giao diện. Trình chỉnh sửa -> Ghim -> Không gian dưới cùng để Superview.

    – Tạ Tú Nguyệt 17:28:50 18/08/2014
  • 1

    Nếu bạn muốn chiều rộng của cuộn xem theo chiều rộng của màn hình điện thoại của bạn hoặc bất kỳ yếu tố nào khác trong Giao diện người dùng của bạn (như UIView có chứa), bạn cần đặt "chiều rộng bằng nhau" trên nó bằng cách sử dụng một yếu tố khác nằm ngoài thước đo cuộn.

    – Hồ Mỹ Huyền 15:05:45 26/12/2014
60

Đó là câu trả lời cho câu hỏi tự trả lời của tôi UIScrollView + Chế độ xem trung tâm + Kích thước nội dung có thể cuộn mơ hồ + nhiều kích cỡ iPhone .

Nhưng nó hoàn toàn bao gồm trường hợp của bạn quá!

Vì vậy, đây là trạng thái ban đầu cho trường hợp đơn giản nhất:

  1. scrollView với 0 ràng buộc cho tất cả các cạnh
  2. Nút nằm giữa và ngang với các ràng buộc Chiều rộng và Chiều cao cố định
  3. Và, tất nhiên - cảnh báo gây phiền nhiễu Has ambiguous scrollable content widthHas ambiguous scrollable content height.

Tất cả, điều chúng ta phải làm là:

  • Thêm 2 ràng buộc bổ sung, ví dụ "0" cho dấu vết và / hoặc không gian dưới cùng cho chế độ xem của chúng tôi (xem ví dụ trên ảnh chụp màn hình bên dưới).

Quan trọng: bạn phải thêm các ràng buộc dưới và / hoặc dưới cùng . Không phải "hàng đầu và hàng đầu" - nó không hoạt động!

Bạn có thể kiểm tra nó trong dự án ví dụ của tôi , minh họa cách khắc phục vấn đề này.

PS

Theo logic - hành động này sẽ gây ra "các ràng buộc xung đột". Nhưng không!

Tôi không biết lý do tại sao nó hoạt động và làm thế nào Xcode phát hiện ràng buộc nào được ưu tiên hơn (vì tôi không đặt ưu tiên cho các ràng buộc này. Tôi sẽ biết ơn nếu ai đó giải thích, tại sao nó hoạt động trong các bình luận bên dưới.

|
  • 1

    Mẹo tuyệt vời! Cuối cùng tôi chỉ tạo ra một ràng buộc cho cạnh dưới và đặt mức độ ưu tiên ở mức trung bình hoặc thấp

    – Tạ Chiêu Minh 03:56:56 06/05/2015
  • 1

    dấu hoặc dưới đã làm điều kỳ diệu, kỳ lạ.

    – Trịnh Thục Nhi 06:31:28 10/11/2015
  • 1

    Điều này nghiêm túc không có ý nghĩa gì nhưng hoạt động! Cảm ơn bạn! Mục cuối cùng tôi có trong chế độ xem của mình, tôi đặt giới hạn dưới là 0 và BANG. Cuối cùng cũng làm việc.

    – Trịnh Hải Quân 14:00:02 24/11/2015
47

Bạn cần tạo một UIViewtiểu cảnh UIScrollViewnhư được mô tả dưới đây:

  • UIViewController
  • UIView 'Quan điểm chính'
    • UIScrollView
      • UIView 'Xem container'
        • [Nội dung của bạn]

Bước thứ hai là thực hiện các UIScrollViewràng buộc. Tôi đã làm điều này với các ràng buộc trên, dưới, dẫn và theo dõi đối với superView của nó.

Tiếp theo tôi đã thêm các ràng buộc cho vùng chứa UIScrollViewvà đây là nơi vấn đề bắt đầu. Khi bạn đặt các ràng buộc tương tự (trên cùng, dưới cùng, dẫn đầu và theo dõi), Storyboard sẽ đưa ra một thông báo cảnh báo:

"Có chiều rộng nội dung có thể cuộn mơ hồ" và "Có chiều cao nội dung có thể cuộn mơ hồ"

Tiếp tục với các khó khăn tương tự ở trên, và chỉ cần thêm những ràng buộc Equal HeightEqual Widthcho bạn container Xem liên quan đến chính Xemkhông để bạn UIScrollView. Nói cách khác, các ràng buộc của Container View được gắn với giám sát UIScrollViewcủa.

Sau đó, bạn sẽ không có cảnh báo trong Storyboard của mình và bạn có thể tiếp tục thêm các ràng buộc cho các bài phỏng vấn của mình.

|
24

Cuối cùng tôi đã tìm ra điều này, tôi hy vọng điều này dễ hiểu hơn.

Bạn thường có thể bỏ qua cảnh báo đó bằng cách thêm UIView cơ sở vào chế độ xem cuộn dưới dạng "chế độ xem nội dung", như họ đã đề cập và làm cho nó có cùng kích thước với chế độ xem cuộn của bạn và trên chế độ xem nội dung này, đặt 6 tham số này.

Như bạn thấy, bạn cần tổng cộng 6 tham số! Mà trong các trường hợp thông thường, bạn đang nhân đôi 2 ràng buộc nhưng đây là cách để tránh lỗi bảng phân cảnh này.

|
  • 1

    Ở trên hầu như có hiệu quả với tôi, vì tôi lo lắng về 3 độ rộng màn hình khác nhau (4/5, 6, 6+) Tôi đặt chế độ xem nội dung và chế độ xem cuộn có độ rộng bằng nhau. Bạn nói đúng, đó là một bản sao vì tôi đã nói với chế độ xem nội dung có 0 không gian dẫn và kết thúc.

    – Lý Thảo Hồng 01:07:34 04/11/2015
  • 1

    Bạn có thể đặt các ràng buộc về chiều rộng và chiều cao bằng nhau từ chế độ xem nội dung sang chế độ xem cuộn, thay vì các giá trị không đổi. Điều này sẽ làm việc trên tất cả các nghị quyết.

    – Tạ Hồng Quỳnh 12:59:06 10/07/2016
  • 1

    Tôi phải thực hiện tương tự, vì vậy bạn có thể giúp tôi rằng tôi phải đặt chiều cao và chiều rộng bằng nhau cho cả chế độ xem nội dung và chế độ xem cuộn không?

    – Vũ Trung Việt 14:14:24 25/04/2017
  • 1

    Có thể đáng để kiểm tra xem nếu bạn vẫn phải làm điều này. Tôi đã thiết lập một imageView trong một scrollview gần đây và có thể thoát ra chỉ bằng cách đặt 4 ràng buộc hiển thị ở trên cùng để làm cho lỗi biến mất trong Xcode 8.3

    – Trịnh Hoàng Oanh 04:53:52 26/04/2017
  • 1

    @Honey này đã được đăng hơn 3 năm trước. Họ chắc chắn đã cải thiện bảng phân cảnh kể từ đó. Tôi cũng nhận thấy rằng bạn có thể thoát khỏi mà không cần xem nội dung bây giờ. Tôi sẽ điều chỉnh câu trả lời của mình.

    – Tạ Giao Linh 17:43:27 27/10/2018
21

iOS 12, Swift 4

Cách đơn giản nhất autolayout:

  1. Thêm UIScrollViewvà ghim nó 0,0,0,0vào giám sát (hoặc kích thước mong muốn của bạn)
  2. Thêm UIViewvào ScrollView, ghim nó 0,0,0,0vào tất cả 4 mặt và căn giữa nó horizontallyvertically.
  3. Trong trình kiểm tra kích thước, thay đổi bottomalign center Yưu tiên thành 250. (đối với thay đổi cuộn ngang trailingalign center X)
  4. Thêm tất cả các khung nhìn mà bạn cần vào khung nhìn này. Đừng quên đặt ràng buộc dưới cùng ở chế độ xem thấp nhất.
|
  • 1

    Tôi không thể đặt chiều cao nội dung của scrollview nhưng nó hoạt động. :)

    – Đặng Ðức Thành 06:01:57 24/05/2018
  • 1

    Gợi ý: theo tôi nó chỉ hoạt động, nếu tôi loại bỏ trung tâm theo chiều ngang và chiều dọc và thay thế nó bằng chiều rộng bằng nhau (scrollView + view bên trong scrollView) VÀ thêm chiều cao dựa trên nội dung, có nghĩa là phần tử cuối cùng của chế độ xem cần ràng buộc dưới cùng. Xem tại đây để biết thêm thông tin: stackoverflow.com/a/54577278/5056173

    – Lý Nhân Đức 15:58:56 07/02/2019
  • 1

    Sean, tôi đang sử dụng điều này theo nghĩa đen mỗi ngày và tôi chưa bao giờ gặp vấn đề với cách tiếp cận này khi nói đến cuộn cuộn dọc và ngang. Có lẽ bạn đã quên đặt một ràng buộc dưới cùng cho phần tử thấp nhất / cuối cùng. Không có điều đó, điều này sẽ không hoạt động.

    – Trịnh Tố Quyên 17:12:23 07/02/2019
15

Tôi biết tôi có thể bị trễ, nhưng giải pháp tiếp theo giải quyết loại vấn đề này mà không cần thêm mã , chỉ cần sử dụng bảng phân cảnh:

Đối với chế độ xem nội dung của bạn, bạn cần đặt các ràng buộc cho không gian hàng đầu / dấu / trên / dưới thành cuộn xem và điều này sẽ không thay đổi khung nhìn nội dung , như sau:

Tất nhiên bạn cần tạo các ràng buộc bổ sung cho chế độ xem nội dung để chế độ xem cuộn có thể biết kích thước nội dung. Ví dụ đặt chiều cao cố định và tâm x.

Hi vọng điêu nay co ich.

|
6

Kiểm tra điều này thực sự nhanh chóng và hướng dẫn điểm về cách làm cho chế độ xem cuộn hoạt động và hoàn toàn có thể cuộn với bố cục tự động. Bây giờ, điều duy nhất vẫn còn khiến tôi bối rối là tại sao kích thước nội dung của chế độ xem cuộn luôn lớn hơn cần thiết ..

http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/

|
3

Tôi nghĩ rằng đó là một công việc 10 giây kể từ bây giờ. Tôi đã quan sát nó trong XCode 7.3 và tạo một video về nó. Kiểm tra tại đây:

https://www.youtube.com/watch?v=yETZKqdaPiI

Tất cả bạn phải làm, thêm một khung nhìn phụ UIScrollViewvới cùng chiều rộng và chiều cao. Sau đó chọn ViewContoder và nhấn Reset to suggested constraint. Vui lòng kiểm tra video để hiểu rõ hơn.

Cảm ơn

|
3

Xem bên dưới: chế độ xem nội dung trong cuộn dọc và ngang tập trung. bạn gặp lỗi không rõ ràng, luôn đảm bảo hai cái được thêm vào scrollview từ chế độ xem nội dung của bạn là 1) .bảng không gian cho container.2) dấu cách để theo dõi ràng buộc được tô sáng trong ảnh chụp màn hình,

các ràng buộc này có nghĩa là trong cuộn là số lượng bạn có thể cuộn sau khi xem chiều cao hoặc chiều rộng của nội dung.

nó có thể giúp bạn

|
2

tất cả các cuộc phỏng vấn bên trong một cuộn xem phải có các ràng buộc chạm vào tất cả các cạnh của chế độ xem cuộn, như được giải thích trong tài liệu, chiều cao và chiều rộng của chế độ xem cuộn được tính tự động bằng các biện pháp trong các cuộc phỏng vấn, điều này có nghĩa là bạn cần phải có Trailing và ràng buộc hàng đầu cho chiều rộng và ràng buộc trên và dưới cho chiều cao.

|
2

Tôi đã giải quyết loại vấn đề này cho chế độ xem của mình bằng cách sử dụng "Giải quyết sự cố bố cục tự động"> "Thêm các ràng buộc bị thiếu" cho Chế độ xem được chọn

Hai ràng buộc sau đây giải quyết vấn đề của tôi:

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

trong đó: trailing, bottom là trailing, bottom của UIScrollView

|
2

Những người đang vật lộn với uiscrollview không cuộn chỉ đặt giới hạn dưới cùng của chế độ xem nội dung của bạn với bố cục dưới cùng của chế độ xem cuối cùng (nằm trong chế độ xem nội dung của bạn). Đừng quên loại bỏ ràng buộc trung tâm Y.

Phần còn lại tất cả các ràng buộc giống như được xác định ở trên. Scrollview chỉ quan tâm đến việc lấy chiều cao tối đa từ chế độ xem nội dung của nó và chúng tôi đang đặt nó làm giới hạn dưới cùng của chế độ xem cuối cùng, điều đó có nghĩa là scrollview sẽ tự động thay đổi nội dung bù.

Trong trường hợp của tôi, chế độ xem trước là UILable không có thuộc tính dòng = 0 (tự động điều chỉnh chiều cao tùy thuộc vào nội dung của nó) để nó tự động tăng chiều cao của uilable và cuối cùng diện tích cuộn của chúng tôi tăng lên vì bố cục dưới cùng của uilable được căn chỉnh với đáy của chế độ xem nội dung mà buộc scrollview để tăng bù nội dung của nó.

|
2

Đối với tôi thêm một contentViewkhông thực sự làm việc như đề xuất. Hơn nữa, nó tạo ra một chi phí do chế độ xem được thêm vào (mặc dù tôi không coi đây là một vấn đề lớn). Điều làm việc tốt nhất với tôi chỉ là tắt tính năng kiểm tra sự mơ hồ cho tôi scrollView. Mọi thứ đang diễn ra tốt đẹp nên tôi nghĩ nó ổn trong những trường hợp đơn giản như của tôi. Nhưng hãy nhớ rằng, nếu các ràng buộc khác cho bạn scrollViewnghỉ, Trình tạo giao diện sẽ không cảnh báo bạn thêm về điều đó.

|
  • 1

    Điều này sẽ chỉ loại bỏ cảnh báo và không làm gì để giải quyết vấn đề.

    – Hồ Duy Nhân 22:09:34 18/06/2017
  • 1

    Bạn. của tôi anh hùng. Không nhận ra điều này tồn tại và vui mừng khi tìm thấy nó! Tôi đã thử "Xác minh vị trí chỉ" mà bạn mong đợi, tôi không biết, chỉ xác minh vị trí nhưng không cho phép vấn đề "kích thước nội dung" lỗi này. Phải đi với "Không bao giờ xác minh". Cảm ơn!

    – Hồ Gia Phong 20:28:21 03/01/2019
2

Câu trả lời của @Matteo Gobbi là hoàn hảo, nhưng trong trường hợp của tôi, cuộn xem không thể cuộn, tôi xóa " căn chỉnh trung tâm Y " và thêm " height> = 1 ", cuộn xem sẽ có thể cuộn được

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.