Tắt tính năng cuộn dọc trong UIScrollView


84

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:


121

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);

Bạn vừa giúp tôi tiết kiệm rất nhiều thời gian khi gỡ lỗi vấn đề kỳ lạ này. Cảm ơn!
jpm

2
@fabb làm thế nào để biết khi nào khung được thay đổi?
Sam

137

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ó.


Giải pháp tuyệt vời. Làm việc như người ở. Nó có ảnh hưởng đến kích thước của phần còn lại của khung nhìn trong ViewController của tôi không? (Buttons, Nhãn ..) Ý tôi là, "tự" là một UIViewController trong trường hợp của tôi
voghDev

@voghDev không, nó không ảnh hưởng đến các lượt xem phụ trong lượt xem cuộn của bạn.
Mirko Brunner

Amazing đã thêm điều này vào phương thức viewdidload trên bộ điều khiển chế độ xem của tôi đang gặp sự cố.
StackRunner

nếu bạn đang sử dụng navigationController và chế độ xem cuộn của bạn nằm sau tiêu đề của navigationBar như cách tôi sử dụng theo phương thức viewDidLoad. Nó giải quyết.
EFE

1
Bạn có thể đạt được điều tương tự trong cài đặt bảng phân cảnh trực tiếp mà không cần bất kỳ dòng mã nào. Chỉ cần chọn bộ điều khiển chế độ xem cuộn và bỏ chọn "Điều chỉnh nội bộ chế độ xem cuộn" trong trình kiểm tra thuộc tính.
Morpheus78

49

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


6
Chúa Trời! Vui lòng KHÔNG khai báo biến oldY trong tệp .m như 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.
Itachi

21

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.


1
Đây cũng có thể được thực hiện trong Storyboard bằng cách chọn View Controller và bỏ chọn bất động sản có
justColbs

1
Tôi không thích điều này vì nó đặt nó cho tất cả các chế độ xem cuộn ... Chúc bạn có thể hiểu cụ thể về một chế độ xem cuộn trên sơ đồ để tạo một lớp ScrollView mới, v.v.
visc

20

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);

1
Điều này sẽ đặt kích thước contentSize của dạng xem có 0 trên trục bạn đã đặt. ContentSize đề cập đến kích thước của nội dung, vì vậy chúng tôi muốn chuyển chiều cao của màn hình để tắt tính năng cuộn dọc bên ngoài khung đó. giải pháp được đánh dấu là đúng, là đúng.
hệ thống

Điều này làm việc tốt cho tôi. thiết lập chiều cao là chiều cao của contentSize vẫn giúp tôi cuộn theo chiều dọc.
KoreanXcodeWorker

1
Điều này đã không làm việc cho tôi. Cũng đã cố gắng self.automaticallyAdjustsScrollViewInsets
StackRunner

Đây chính là nó! Đặt thành chiều cao của Chế độ xem cuộn không phù hợp với tôi, nhưng điều này đã làm được
Echizzle

18

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á.


Bạn đã cứu tôi. Kích thước và khung nội dung của tôi giống nhau và tôi không thể suốt đời tìm ra điều gì sai trái. Cảm ơn nhiều!!
yuf 13/12/12

2
Câu trả lời của bạn là lý do tại sao tôi thích stackoverflow! :-) Khói thánh ... điều này làm tôi phát điên lên! Bạn đúng rồi. Đó là hiệu ứng trả lại. Tôi muốn hiệu ứng thoát, nhưng không phải khi không cần cuộn, vì vậy tôi sẽ tìm cách tắt / bật lại hiệu ứng đó ngay bây giờ trong mã tùy thuộc vào việc có cần cuộn hay không.
Erik van der Neut

2
Được rồi, rất dễ dàng để bật / tắt các trang bị trả lại trên UIScrollView trong thời gian chạy. Trong trường hợp của tôi, tôi chỉ quan tâm đến chiều cao của nội dung cuộn và điều này đã thực hiện thủ thuật: self.scrollView.bounces = (BOOL) (self.scrollView.contentSize.height> self.scrollView.frame.size.height);
Erik van der Neut

12
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];

}

bạn phải xác nhận UIScrollViewDelegate

aScrollView.delegate = self;

4

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.


4

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];
}

1
sau tất cả. Xin cảm ơn ông ngàn lần! bạn đã cứu ngày của tôi
ha100,

0

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.topAnchorframeLayoutGuide.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ó.


0

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:

  1. Bạn không được phép hoặc không muốn sử dụng quyền ủy quyền.
  2. Chiều cao nội dung của bạn lớn hơn chiều cao vùng chứa

0

Rất nhiều câu trả lời bao gồm việc đặt contentOffsetthà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
}
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.