Tôi có một UIView
chiếc Springboard giống như iPhone. Tôi đã tạo nó bằng cách sử dụng UIScrollView
và UIButtons
. Tôi muốn tắt tính năng cuộn ngang trên chế độ xem cuộn đã nói. Tôi chỉ muốn cuộn dọc. Làm cách nào để thực hiện điều này?
Tôi có một UIView
chiếc Springboard giống như iPhone. Tôi đã tạo nó bằng cách sử dụng UIScrollView
và UIButtons
. Tôi muốn tắt tính năng cuộn ngang trên chế độ xem cuộn đã nói. Tôi chỉ muốn cuộn dọc. Làm cách nào để thực hiện điều này?
Câu trả lời:
Bạn phải đặt thuộc contentSize
tính của UIScrollView
. Ví dụ: nếu UIScrollView
chiều rộng của bạn là 320 pixel (chiều rộng của màn hình), thì bạn có thể làm như sau:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
Sau UIScrollView
đó, di chúc chỉ cuộn theo chiều dọc, vì nó đã có thể hiển thị mọi thứ theo chiều ngang.
CẬP NHẬT: (Sau khi @EranMarom chỉ ra nhận xét của anh ấy)
Bạn có thể dừng cuộn ngang hoặc cuộn dọc trong ScrollViewDelegate
Phương pháp. Đây là cách,
Dừng cuộn ngang:
Nếu bạn muốn cuộn theo chiều ngang, thì bạn cần tăng contentOffset.x. Ngăn chặn việc dừng cuộn chế độ xem cuộn theo hướng ngang.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
Dừng cuộn dọc:
Nếu bạn muốn cuộn theo chiều dọc, thì bạn cần phải tăng contentOffset.y. Ngăn chặn việc dừng cuộn chế độ xem cuộn theo hướng dọc.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
Đoạn mã trên ngăn chặn những thay đổi trong x
và y
của a scrollview contentOffset
và nó dẫn đến việc dừng scrollViewDidScroll:
phương thức cuộn trong .
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
để tắt tính năng cuộn ngang. Tôi thấy nó dễ đọc hơn, nó nhỏ hơn và không có ích gì khi thực hiện bài kiểm tra cho điểm 0 vì hầu như không có chi phí nào với mã chạy điều này không thường xuyên (tức là tối đa vài chục lần mỗi giây).
scrollView.contentOffset.y = 0.0
để dừng cuộn dọc và scrollView.contentOffset.x = 0.0
dừng cuộn ngang, trong scrollViewDidScroll()
chức năng đại biểu. Tuy nhiên, tôi tin rằng việc đảm bảo giá trị scrollView.contentSize
bằng scrollView.frame.size
là một giải pháp tốt hơn (đúng). Xem câu trả lời của @danbeaulieu.
kể từ khi sử dụng iOS7
self.automaticallyAdjustsScrollViewInsets = NO;
// và tạo cho bạn cuộn trang với 3 trang
self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
self.collectionView.pagingEnabled = YES;
đã giúp tôi giải quyết vấn đề với việc cuộn trơn tru (không kéo). Vấn đề là ở phương thức scrollViewWillEndDragging:
- targetContentOffset giống như scrollView.contentOffset và logic phát hiện trang không hoạt động bình thường.
Giải pháp nhanh chóng
Tạo hai cửa hàng, một cho chế độ xem của bạn và một cho chế độ xem cuộn của bạn:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
Sau đó, trong viewDidLayoutSubviews của bạn, bạn có thể thêm mã sau:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
Những gì chúng tôi đã làm là thu thập chiều cao và chiều rộng của chế độ xem và đặt kích thước nội dung scrollViews để phù hợp với nó. Điều này sẽ ngăn chế độ xem cuộn của bạn cuộn theo chiều ngang.
Suy nghĩ thêm:
CGSizeMake lấy chiều rộng và chiều cao bằng cách sử dụng CGFloats. Bạn có thể cần sử dụng chiều cao hiện có của UIScrollViews cho tham số thứ hai. Nó sẽ trông như thế này:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
Trong trường hợp của tôi, chiều rộng của contentView lớn hơn chiều rộng của UIScrollView và đó là lý do dẫn đến việc cuộn ngang không mong muốn. Tôi đã giải quyết nó bằng cách đặt chiều rộng của contentView bằng chiều rộng của UIScrollView.
Hy vọng nó sẽ giúp ai đó
Tôi đã đấu tranh với điều này trong một thời gian cố gắng không thành công các đề xuất khác nhau trong chủ đề này và các chủ đề khác.
Tuy nhiên, trong một chuỗi khác (không chắc chắn ở đâu), ai đó đã gợi ý rằng việc sử dụng một ràng buộc tiêu cực trên UIScrollView đã làm việc cho anh ta.
Vì vậy, tôi đã thử kết hợp nhiều ràng buộc khác nhau với kết quả không nhất quán. Điều cuối cùng làm việc với tôi là thêm các ràng buộc đầu và cuối của -32 vào chế độ xem cuộn và thêm chế độ xem văn bản (ẩn) với chiều rộng là 320 (và căn giữa).
Được giới thiệu trong iOS 11 là một thuộc tính mới trên UIScrollView
var contentLayoutGuide: UILayoutGuide
Tài liệu nói rằng bạn:
Sử dụng hướng dẫn bố cục này khi bạn muốn tạo các ràng buộc Bố cục Tự động liên quan đến vùng nội dung của dạng xem cuộn.
Cùng với bất kỳ trở ngại Autolayout khác mà bạn có thể có thêm bạn sẽ muốn hạn chế widthAnchor
của UIScrollView
's contentLayoutGuide
để có kích thước tương tự như 'khung'. Bạn có thể sử dụng frameLayoutGuide
(cũng được giới thiệu trong iOS 11) hoặc bất kỳ chiều rộng bên ngoài nào (chẳng hạn nhưsuperView
.)
thí dụ:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
Tài liệu: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
Khi tôi đã thay thế UIScrollView bằng UITableView chỉ có 1 ô, nó hoạt động tốt.
Sử dụng dòng đơn này.
self.automaticallyAdjustsScrollViewInsets = NO;