Có một tùy chọn trong IB để bỏ chọn cuộn dọc trên chế độ xem cuộn, nhưng nó dường như không hoạt động.
Làm cách nào để đặt chế độ xem cuộn để chỉ cuộn theo chiều ngang và không cuộn theo chiều dọc trong mã thay vì IB?
Có một tùy chọn trong IB để bỏ chọn cuộn dọc trên chế độ xem cuộn, nhưng nó dường như không hoạt động.
Làm cách nào để đặt chế độ xem cuộn để chỉ cuộn theo chiều ngang và không cuộn theo chiều dọc trong mã thay vì IB?
Câu trả lời:
Thử đặt chiều cao của contentSize thành chiều cao của scrollView. Sau đó, cuộn dọc nên bị vô hiệu hóa vì sẽ không có gì để cuộn theo chiều dọc.
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);
kể từ iOS7:
đầu tiên: chiều rộng kích thước nội dung phải bằng chiều rộng chế độ xem cuộn của bạn
thứ hai: trong initWithNibName của bạn:
self.automaticallyAdjustsScrollViewInsets = NO;
Đó là nó.
vâng, câu trả lời của pt2ph8 là đúng,
nhưng nếu vì một lý do kỳ lạ nào đó, kích thước contentSize của bạn phải cao hơn UIScrollView, bạn có thể tắt tính năng cuộn dọc đang triển khai phương thức giao thức UIScrollView
-(void)scrollViewDidScroll:(UIScrollView *)aScrollView;
chỉ cần thêm cái này vào UIViewController của bạn
float oldY; // here or better in .h interface
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
[aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, oldY)];
// or if you are sure you wanna it always on top:
// [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, 0)];
}
nó chỉ là phương thức được gọi khi người dùng cuộn UIScrollView của bạn và làm như vậy bạn buộc nội dung của nó phải luôn giống nhau .y
float oldY;
tham khảo đoạn mã trên. Đó là ký hiệu biến kiểu C cho mỗi ứng dụng, biến PHẢI được khai báo như một thành viên thể hiện của lớp bộ điều khiển.
Bao gồm phương pháp sau
-(void)viewDidLayoutSubviews{
self.automaticallyAdjustsScrollViewInsets = NO;
}
và đặt chiều rộng kích thước nội dung của dạng xem cuộn bằng chiều rộng của dạng xem cuộn.
Bạn cần vượt qua 0 trong kích thước nội dung để vô hiệu hóa theo hướng bạn muốn.
Để tắt tính năng cuộn dọc
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);
Để tắt tính năng cuộn ngang
scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);
Tôi đã cập nhật kích thước nội dung để tắt tính năng cuộn dọc và khả năng cuộn vẫn còn. Sau đó, tôi phát hiện ra rằng tôi cũng cần phải tắt tính năng trả lại dọc, để tắt hoàn toàn cuộn.
Có thể có những người có vấn đề này quá.
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
[aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];
}
bạn phải xác nhận UIScrollViewDelegate
aScrollView.delegate = self;
Chỉ cần đặt chữ y luôn ở trên cùng. Cần phải tuân theo UIScrollViewDelegate
func scrollViewDidScroll(scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
Điều này sẽ giữ hiệu ứng Giảm tốc / Tăng tốc của cuộn.
Trên iOS 11, hãy nhớ thêm phần sau, nếu bạn quan tâm đến việc tạo chế độ xem cuộn dính vào giới hạn màn hình hơn là một khu vực an toàn:
if (@available(iOS 11.0, *)) {
[self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}
Từ iOS11, người ta có thể sử dụng thuộc tính sau
let frameLayoutGuide: UILayoutGuide
Nếu bạn đặt chế cho frameLayoutGuide.topAnchor và frameLayoutGuide.bottomAnchor đến neo cùng của một số subview của bạn scrollview sau đó cuộn dọc sẽ bị vô hiệu hóa và chiều cao của scrollview sẽ bằng chiều cao của subview của nó.
Giải pháp rõ ràng nhất là cấm thay đổi tọa độ y trong lớp con của bạn.
override var contentOffset: CGPoint {
get {
return super.contentOffset
}
set {
super.contentOffset = CGPoint(x: newValue.x, y: 0)
}
}
Đây là giải pháp phù hợp duy nhất trong các tình huống:
Rất nhiều câu trả lời bao gồm việc đặt contentOffset
thành 0. Tôi đã gặp một trường hợp trong đó tôi muốn chế độ xem bên trong scrollView được căn giữa. Điều này đã làm công việc cho tôi:
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = -scrollView.contentInset.top
}