2014-09-22 20 views
13

Tôi muốn có AutoLayout hoạt động với UIScrollView và có một chút rắc rối với nó. Dưới đây là những gì tôi đã làm:UIScrollView AutoLayout Vertical Chỉ

  1. Thêm một UIScrollView bên trong chính View với khung: [top: 0, trái: 0, width: 320, chiều cao: 568]

  2. Thêm UIView "contentView" bên trong UIScrollView có khung và màu đen: [trên cùng: 0, bên trái: 0, chiều rộng: 320, chiều cao: 568]

  3. Thiết lập UIScrollView ràng buộc: [top: 0, bottom: 0, left: 0, right: 0]

  4. Setup "contentView" trở ngại: [top: 0, đáy: 0, trái: 0, phải: 0]

  5. Align các mục bên trong "contentView"

  6. Set Main Xem bgcolor xám (để xem những gì đang xảy ra)

đây là một ảnh chụp màn hình của vấn đề: http://imgur.com/P8s9lB0

Đối với một số lý do, những hạn chế làm cho xem nội dung được ở giữa màn hình. Ngoài ra, nó cuộn theo mọi hướng. Tôi muốn nội dung chỉ có thể cuộn theo hướng thẳng đứng như trong UITableView, để tôi không thể di chuyển nó như thế: http://imgur.com/lBCwfAS

Tôi đang làm gì sai? Tôi đã kiểm tra tất cả các hướng dẫn và câu trả lời tôi có thể tìm thấy trong StackOverflow và Google, và không có ai thực sự chỉ có một vấn đề kỳ lạ, vì vậy tôi yêu cầu giúp đỡ.

EDIT: Tôi cũng đã thêm chiều rộng và chiều cao của ContentView làm hạn chế và cũng không giúp ích gì.

Trả lời

16

Đối với việc vô hiệu hóa các cuộn ngang, bạn có thể thiết lập kích thước nội dung trong (void) phương pháp scrollViewDidScroll.

[self.scrollView setContentOffset: CGPointMake(0, self.scrollView.contentOffset.y)]; 

Bạn cũng sẽ muốn đặt khóa định hướng sao cho chỉ sử dụng 1 hướng cuộn tại một thời điểm. https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScrollView_Class/index.html#//apple_ref/occ/instp/UIScrollView/directionalLockEnabled

self.scrollView.directionalLockEnabled = YES; 
+0

Cảm ơn bạn! Cuộn ngang bị tắt. – Gasim

+0

không có prob .. cho vấn đề bố cục tự động, bạn có đang sử dụng trình tạo giao diện hoặc sử dụng bố cục tự động thông qua mã không? – Derek

+0

Tôi đang sử dụng trình tạo giao diện. Tôi đã thay đổi ràng buộc trái và phải thành -16 và nó hoạt động. Tôi không tin hành vi đúng của nó. Có cách nào để làm cho nó hoạt động với 0? – Gasim

1

Đưa nội dung xem chiều cao rõ ràng và hạn chế chiều rộng

+0

tôi đã làm -> Width: 568, Height: 320. Không may mắn – Gasim

+0

lẽ xem nội dung của bạn shrinker bởi subviews của nó. Bạn có nhận được ngoại lệ bố cục tự động không? – mustafa

+0

Không, không phải là duy nhất. Đây là điều.Tôi bắt đầu chơi với các giá trị ràng buộc và đặt -16 cho cả ràng buộc hàng đầu và đuôi thực sự cố định khung nhìn ở giữa ... Tôi thực sự không muốn dựa vào một con số như thế. Điều gì có thể là nguyên nhân của vấn đề này? Ý của bạn là gì? Hơn nữa, bây giờ mặc dù scrollview hoạt động, nó không di chuyển đến vị trí mong muốn. – Gasim

3

Tôi đã viết chức năng cho phép cuộn nội dung theo chiều dọc nhưng không theo chiều ngang. Nó tạo ra một UIView với chiều rộng giới hạn bên trong scrollview và nhúng tất cả các bản xem trước cuộn trong đó.

TegScrolledContent.createContentView(scrollView) 

https://github.com/exchangegroup/scrollable-content-ios

enter image description here

+0

Cảm ơn evegenii, thư viện của bạn thực sự giúp tôi ở Chế độ xem đăng nhập của tôi khi đi đến phong cảnh trái và phải .. –

6

Để tóm tắt các Leszek S' câu trả lời:

Để có một cái nhìn di chuyển theo chiều dọc, tất cả các quan điểm bên trong xem di chuyển phải có của họ giới hạn chiều rộng được đặt. Dễ dàng chỉ cần thiết lập để giám sát của xem cuộn.

Lý do là chế độ xem cuộn sẽ không cuộn theo chiều ngang, miễn là không có phần con nào của nó cần cuộn theo chiều ngang. Ví dụ: nếu bạn có một nhãn, được đặt thành 0 dòng, bố cục tự động sẽ cố gắng tạo nhãn rộng như trước khi bắt đầu thêm dòng và ngắt dòng. Nếu không có ràng buộc chiều rộng rõ ràng trên nhãn, nó sẽ chỉ làm cho vùng nội dung xem cuộn lớn hơn. Các ràng buộc cho dấu trang cuộn được bỏ qua.

Nếu bạn có một loạt lượt xem, bạn có thể muốn đặt chúng bên trong một chế độ xem có chứa đơn lẻ như trong video đó. Đối với trường hợp của tôi, tôi chỉ có 5 hoặc 6 nhãn có thể tự động thay đổi chiều cao, nhưng không bao giờ nên thay đổi chiều rộng vì vậy tôi chỉ làm cho chúng có cùng độ rộng như chế độ xem cuộn. Và bingo, chế độ xem cuộn theo chiều dọc với các nhãn tăng hoặc thu nhỏ tùy thuộc vào văn bản.

1

Dưới đây là đoạn trích mà tôi đã sử dụng để đạt được chế độ xem cuộn dọc. Tính năng này hoạt động bằng cách thêm chế độ xem nội dung dưới dạng chế độ xem con của chế độ xem cuộn, sau đó hạn chế chiều rộng của chế độ xem nội dung đó thành chiều rộng của chế độ xem cuộn chính. Từ đó, tất cả các bản xem phụ phải được thêm vào chế độ xem nội dung thay vì chế độ xem cuộn.

// View that will contain content of scroll view. Width is constrained to the width of the scroll view. 
UIView *contentView = [[UIView alloc] init]; 
contentView.translatesAutoresizingMaskIntoConstraints = NO; 
[scrollView addSubview:contentView]; 

views[@"contentView"] = contentView; 
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]]; 
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:views]]; 

// Now, add all your subviews to contentView 
7

Bạn có thể thực hiện việc này hoàn toàn bằng các ràng buộc và thực sự dễ dàng.

UIScrollView chỉ cần hiểu mức độ rộng và không gian bên trong nó. Vì vậy, cần phải có thứ gì đó được ghim vào các ràng buộc Leading, Trailing, Top & Bottom. Cũng chiều rộng và chiều cao của nội dung cần phải được cố định (điều này không có nghĩa là tôi phải chỉ định nó. Tôi vẫn có thể sử dụng các ràng buộc để đạt được điều này.)

  1. Thêm một UIScrollView và vị trí theo yêu cầu.
  2. Thêm UIView bên trong UIScrollView cho nội dung.
  3. Đặt Leading, Trailing, Top & Bottom hạn chế của nội dung UIView bằng 0.
  4. Thêm một hạn chế Equal Width đến UIScrollViewUIView. Điều này sẽ làm cho nó di chuyển theo chiều dọc chỉ.
  5. Bây giờ bạn cần đặt chiều cao của nội dung UIView. Sau đó, bạn có thể chỉ định chiều cao của chế độ xem nội dung (blech) hoặc sử dụng chiều cao của các điều khiển chứa bên trong bằng cách đảm bảo rằng điều khiển dưới cùng bị hạn chế ở cuối chế độ xem nội dung.

Tôi đã làm điều này và nó đã làm việc một điều trị.

+1

Đây là câu trả lời tôi đang tìm kiếm. Tôi đã có contentView bằng superview của UIScrollView. Cảm ơn –

1

Cùng với câu trả lời của @ derek Tôi muốn thêm cài đặt nội dung đóBật luôn luôn trong scrollViewDidScroll sẽ gây ra vấn đề về hiệu suất. Vì vậy, hãy kiểm tra chỉ nếu x không phải là 0 sau đó thiết lập contentOffset

if(contentOffset.x != 0){ 
     setContentOffset(CGPointMake(0, contentOffset.y), animated: false) 
    } 

và có đến scrollview

directionalLockEnabled = true 
Các vấn đề liên quan