IOS7: UIScrollView bù đắp trong UINavestionControll


126

Tôi hiện đang di chuyển ứng dụng của mình trên ios 7 và tôi đã bị kẹt hàng giờ trong quản lý thanh / điều khiển mới.

Trước đây, khi chúng tôi có bộ điều khiển điều hướng, chúng tôi đã có một đoạn như thế này:

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

Trong trình tạo giao diện, chúng tôi có lựa chọn đặt một thanh điều hướng hiện có cho chế độ xem và mọi thứ khớp với nội dung của chế độ xem thực.

Bây giờ, tôi không biết làm thế nào để thiết kế đúng với trình tạo giao diện. Tôi vẫn có đoạn mã của mình để khởi tạo bộ điều khiển. Tuy nhiên, trong trình xây dựng giao diện cho MainViewControll của tôi nếu tôi đặt thanh trạng thái thành thanh điều hướng mờ hoặc mờ, tôi có độ lệch 44px ở trên cùng (xem bên dưới).


Trình tạo giao diện.


Bây giờ, nếu tôi đặt thanh trạng thái thành không, không có phần bù nào ở trên nhưng vì chế độ xem trên trình giả lập nhỏ hơn do thanh điều hướng, phần dưới của chế độ xem trong trình tạo giao diện bị cắt.

Trình tạo giao diện.

Tôi đoán rằng tôi thực sự đang thiếu một cái gì đó ở đây nhưng tôi không thể tìm thấy bất kỳ chủ đề hoặc thông tin táo nào trong Hướng dẫn chuyển đổi iOS7 về điều đó.

Cảm ơn bạn đã giúp đỡ


BIÊN TẬP

Như chúng ta có thể thấy trong các hình ảnh, đứa trẻ đầu tiên của chế độ xem là một UIScrollView chứa cả hai nhãn, vấn đề không xuất hiện khi không có cuộn xem. Nó cũng xuất hiện nếu đó là UITableView. Nếu một nhãn nằm ngoài UIScrollView, không có phần bù nào cho nhãn đó.


Bạn có thể muốn sử dụng Autolayout nếu không, vì vậy bạn có thể chắc chắn rằng một số chế độ xem nhất định nằm cách xa trên / dưới / bên của màn hình
erdekhayser

Tôi thực sự không sử dụng Autolayout, nhưng sử dụng nó (đánh dấu vào hộp kiểm) không giải quyết được vấn đề.
streem

Với Autolayout, bạn phải đặt các ràng buộc để các chế độ xem giữ nguyên vị trí. Xcode không biết bạn muốn gì tự động.
erdekhayser

Nhìn thấy chỉnh sửa trước đó của bạn, tôi mới phát hiện ra vấn đề của bạn. Thật không may, nó không phải là giải pháp rõ ràng nhất. Thay vì cố gắng giải thích lại, tôi đã sử dụng video này trên Youtube để tìm hiểu cách thiết lập chế độ xem cuộn. youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be Chúc may mắn. Tôi phải mất một vài lần để xem nó để hiểu đầy đủ những gì anh ấy đang làm.
erdekhayser

Câu trả lời:


286

OK vì vậy tôi tìm thấy giải pháp, tôi đã đặt trong bộ điều khiển của mình thuộc tính:

self.automaticallyAdjustsScrollViewInsets = false

Tôi thực sự không hiểu lợi ích thực sự của tài sản này, (hoặc tại sao giá trị mặc định là đúng)

Tài liệu duy nhất tôi tìm thấy là ở đó:

Cập nhật

Trong iOS 11 automaticallyAdjustsScrollViewInsetskhông dùng nữa

Bây giờ bạn nên sử dụng:

self.tableView.contentInsetAdjustmentBehavior = .never

Tôi cũng khuyến khích bạn kiểm tra câu hỏi này và câu trả lời của nó để hiểu rõ hơn về các tính chất đó


12
Tuyệt vời tìm thấy. UIScrollView trong cốt truyện thực sự phức tạp. Tôi ước Apple làm cho nó một chút liền mạch trong các phiên bản Xcode trong tương lai.
p0lAris

4
Mã này ngăn tôi UIScrollViewcuộn. Nhưng không có điều này, tôi không thể thoát khỏi sự bù đắp. Đã mệt mỏi ...
đáng sợ

9
Cờ này cũng có thể được tắt trong bảng phân cảnh / ngòi của bạn, Trình điều khiển xem có hộp kiểm "Điều chỉnh phần xem cuộn xem". Tôi đã đập đầu vào tường trong một thời gian dài để cố gắng giải quyết các vấn đề của tôi với chế độ xem cuộn và bố cục tự động, phức tạp hơn nữa bằng cách hỗ trợ iOS 6 & 7. Vì vậy, cảm ơn rất nhiều vì cuối cùng đã cung cấp giải pháp!
Newtz

2
Tài liệu ứng dụng sẽ cho bạn biết rằng cài đặt navigationbar.translucent = YES sẽ ngăn thanh điều hướng đẩy nội dung xuống. Đó là lời nói dối lớn nhất và khiến tôi mất nhiều giờ làm việc cho đến khi đăng bài này. Ngoài ra, bạn phải đặt self.automaticallyAdjustScrollViewInsets = NO; Cảm ơn bạn rất nhiều cho bài viết này !!!!!!! Táo và táo?
dùng779764

Tôi thấy rằng điều này khiến giới hạn của UIScrollView của tôi thay đổi theo chiều cao của thanh điều hướng (-64 điểm). Tôi đã tự điều chỉnh quá mức này thành 0, nhưng thấy UISrollView vẫn sẽ cuộn theo trục y và "snap" đến một dòng tưởng tượng ở -64. Giải pháp của bạn đã giải quyết điều này.
gdbj

92

Câu trả lời của @ Justafinger cũng có tác dụng như một cơ duyên đối với tôi.

Chỉ muốn thêm rằng cài đặt này cũng có thể được điều chỉnh dễ dàng từ trình tạo giao diện.

  1. Chọn bộ điều khiển xem của bạn
  2. Nhấp vào tab 'Thanh tra thuộc tính'
  3. Bỏ chọn 'Điều chỉnh phần tử xem cuộn'
  4. Thưởng thức!

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


Đã dành nhiều tuổi tìm kiếm tùy chọn này trong các thuộc tính UIScrollView chứ không phải Trình điều khiển xem! Cảm ơn!
Đaminh Williams

11

Tôi đã gặp vấn đề tương tự, nhưng tôi đã tìm thấy một thuộc tính khá kỳ lạ trên ViewContoder trong trình xây dựng giao diện dường như đã gây ra điều này cho tôi. Có một bộ hộp kiểm "Mở rộng Edges". Tôi đã xóa kiểm tra "Dưới thanh trên cùng" và mọi thứ bắt đầu được đặt ra cho tôi.


Phải, cái này hoạt động với tôi tốt hơn "Điều chỉnh các phần tử xem cuộn"
Dmytro

2

Với AutomaticAdjustScrollViewInsets được đặt thành CÓ (cài đặt mặc định), có một sự không phù hợp trong định vị cuộn xem giữa ios6 và ios7, vì vậy để chúng phù hợp, bạn cần phải tắt cài đặt này. Tuy nhiên, ios6 sẽ gặp sự cố nếu nó tự động xuất hiệnAdAdScScViewViewInsets, do đó bạn cần thực hiện thay đổi tự động theo chương trình củaAdAdScustScrollViewInsets có điều kiện trên ios7 hoặc nếu không thì tắt tùy chọn sử dụng bảng phân cảnh / NIB


2

Tôi đã gặp một vấn đề tương tự, sau khi loại bỏ viewContoder, nội dung Offerset từ bảngView của tôi đã được đổi thành (0, -64).

Giải pháp của tôi hơi kỳ lạ, tôi đã thử tất cả các câu trả lời khác nhưng không thành công, điều duy nhất khắc phục vấn đề của tôi là chuyển vị trí bảngView trong cây điều khiển của .xib

đó là điều khiển đầu tiên trong phần Xem cha mẹ như thế này:

trước

Tôi đã di chuyển bảngView ngay sau ImageView và nó hoạt động:

sau

có vẻ như việc đặt chế độ xem bảng ở vị trí đầu tiên đã gây ra sự cố và việc chuyển chế độ xem bảng sang vị trí khác đã khắc phục sự cố.

PD Tôi không sử dụng autoLayout cũng không phải bảng phân cảnh

hy vọng điều này có thể giúp ai đó!


Tôi nhận thấy hành vi kỳ lạ này, tôi tin rằng logic đằng sau là scrollViewInsets sẽ tự động được điều chỉnh khi scrollview là đứa trẻ đầu tiên. Nếu không, nó không thực sự có ý nghĩa bởi vì cuộn của bạn là probaby không toàn màn hình.
streem

1

Tôi cũng phải đối mặt với vấn đề này.

UIScrollView kích thước nội dung được HĐH tính toán như các kích thước khác, nguồn gốc được cung cấp bởi hệ thống ràng buộc - đó là lý do tại sao HĐH có sự nghi ngờ.

Cách khắc phục - Bạn nên xác định rõ ràng kích thước nội dung của UIScrollView:

  1. Nhúng nội dung có thể cuộn thành UIView(Tôi đổi tên thành ContentView)
  2. Thêm các ràng buộc:

ContentView.Weight = View.WeightContentView.Height = View.Height

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


0

Có vẻ như một giải pháp xoay quanh việc xem tệp bảng phân cảnh là "iOS 6.1 trở về trước" (chọn tệp bảng phân cảnh-> Trình kiểm tra tệp-> Tài liệu trình tạo giao diện-> Xem dưới dạng. Các vị trí xem trong chế độ này hiển thị phần bù.


Vâng, tôi không sử dụng bảng phân cảnh. Tuy nhiên tôi không chắc đó là sự cố ios6 đến ios7, ví dụ trên đã được tạo hoàn toàn với iOS 7. Hơn nữa, tôi đã chỉnh sửa câu hỏi của mình, nó chỉ xuất hiện (theo như tôi biết) với uiscrollview và uitableview.
streem

Hmm thú vị ... Nhìn vào điều này, bạn có thể thêm biến thể = "6xAndEarlier" vào đầu XIB trong phần tử tài liệu, vì đây là điểm khác biệt khi lật bit tôi đã đề cập ở trên. Và FYI vấn đề này cũng xảy ra với uiwebview đối với tôi.
swhitman

0

Cảm ơn các bạn cho các giải pháp! Tôi đã vật lộn hàng giờ để cố gắng giải quyết vấn đề. Mọi thứ đều ổn khi không có Thanh điều hướng liên quan nhưng nó đã gặp trục trặc ngay khi tôi nhúng ViewContoder vào NavigationContoder.

Tôi đã giải quyết nó bằng cách bỏ chọn các Điều chỉnh trong Chế độ xem cuộnThanh dưới cùng . Cả hai thứ này đều nằm trong Trình kiểm tra thuộc tính của ViewContoder. Cảm ơn rất nhiều!

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.