Cách tắt cuộn trong bảng UITableView khi nội dung vừa với màn hình


240

Tôi có một vài bảng (kiểu được nhóm) trong ứng dụng iphone của mình (chỉ trên một phần của màn hình và được thêm vào Interface Builder, không được phân lớp từ UITableViewController) rằng 80% thời gian là nhỏ và sẽ vừa với màn hình. Khi bảng vừa với màn hình, tôi muốn tắt tính năng cuộn, để làm cho nó sạch hơn một chút. Nhưng nếu bảng tắt màn hình (khi các hàng được thêm vào sau đó), tôi muốn bật lại cuộn (vì nếu không bạn không thể thấy nội dung đó.)

Có cách nào để làm việc này không? Tôi dường như không thể tìm ra nó. Tôi biết phải làm:

tableView.scrollEnabled = NO;

nhưng tôi không chắc chắn ở đâu, hoặc nếu tôi phải tính toán kích thước đối tượng bảng hoặc thứ gì đó để làm việc này.


Cập nhật : Đây là giải pháp cuối cùng có hiệu quả với tôi:

if (table.contentSize.height < table.frame.size.height) {
   table.scrollEnabled = NO;
 }
else {
   table.scrollEnabled = YES;
 }

Tôi chạy mã này sau khi gọi reloadDatatrên bàn, và nó tính toán kích thước phù hợp và có vẻ hoạt động.

table.frame.size.heightlà kích thước thực tế của đối tượng (bạn có thể thấy điều này Interface Builder) được hiển thị trên màn hình, trong khi đó table.contentSize.heightlà chiều cao của: tiêu đề, chân trang và chiều cao của mỗi ô được thêm vào với nhau.


1
Cảm ơn. Giải pháp đó đã làm việc cho tôi. Tuy nhiên, cuối cùng tôi đã mở rộng UITableView và ghi đè reloadData để vô hiệu hóa scrollEnables. Lý do là chế độ xem bảng được tải khi trình điều khiển xem của tôi được tạo. Bằng cách đó, bạn không phải gọi reloadData hai lần.
Brandon O'Rourke

@JoeBlow Tôi nghĩ bạn đã bỏ lỡ quan điểm của OP. Câu hỏi không phải là làm thế nào để vô hiệu hóa thoát, đó là cách chỉ bật cuộn (và rất có thể) khi xem bảng cần cuộn.
Kyle Clegg

Có lẽ tốt hơn để sử dụng giới hạn, bởi vì tôi nghĩ rằng nếu bạn xoay một chút bảng của bạn, frame.height sẽ thay đổi.
Ricardo

Cần phải có: if (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

Câu trả lời:


395

Tôi nghĩ bạn muốn thiết lập

tableView.alwaysBounceVertical = NO;

6
Điều này hoạt động tốt hơn contentSize <frame khi bạn đang sử dụng AutoLayout. Nên chấp nhận trả lời.
Vũ điệu Joshua

1
Tôi đang sử dụng bố trí tự động và câu trả lời này là chính xác những gì tôi cần.
Ngón tay cái vàng

3
tốt hơn là vô hiệu hóa cuộn
Kirit Vaghela

5
hoạt động như một bùa mê, bạn cũng có thể vô hiệu hóa nó từ interface builderbằng cách bỏ bật nảy và nảy theo chiều ngang / chiều dọc.
Ahsan Ebrahim

11
cho Swift - tableView.alwaysBounceV
vertical

44

Bạn có thể xác minh số lượng ô hiển thị bằng chức năng này:

- (NSArray *)visibleCells

Phương thức này sẽ trả về một mảng với các ô có thể nhìn thấy, vì vậy bạn có thể đếm số lượng đối tượng trong mảng này và so sánh với số lượng đối tượng trong bảng của bạn .. nếu nó bằng nhau .. bạn có thể vô hiệu hóa cuộn bằng cách sử dụng:

tableView.scrollEnabled = NO;

Như @Ginny đã đề cập .. chúng ta có thể gặp vấn đề với các ô hiển thị một phần, vì vậy giải pháp này hoạt động tốt hơn trong trường hợp này:

tableView.scrollEnabled = (tableView.contentSize.height <= CGRectGetHeight(tableView.frame));

Trong trường hợp bạn đang sử dụng autoLayout, giải pháp này thực hiện công việc:

tableView.alwaysBounceVertical = NO.

Cảm ơn bạn! Điều này chủ yếu là làm việc cho tôi bây giờ. Vấn đề duy nhất tôi gặp phải bây giờ là khi các ô hiển thị một phần, chúng vẫn được tính là hiển thị và do đó cuộn bị vô hiệu hóa khi trong trường hợp đó tôi muốn nó được bật.
Ginny

6
Tìm ra! Hóa ra bạn hoàn toàn không thể sử dụng các Hiển thị, vì vấn đề ô hiển thị một phần, nhưng điều này hoạt động: if (table.contentSize.height < table.frame.size.height)>> xem chỉnh sửa trong bài viết gốc.
Ginny

42

Trong Swift:

tableView.alwaysBounceVertical = false

18
Tôi luôn luôn nâng cao như vậy "viết lại" vì chuyển đổi sang cú pháp hiện đại đòi hỏi thời gian.
Dmitry Isaev

14

Vì vậy, có nhiều câu trả lời và yêu cầu tất cả nội dung cùng một lúc nên tôi thêm câu trả lời này:

Nếu bạn đang sử dụng AutoLayout, bằng cách cài đặt này chỉ phù hợp với bạn:

  • Trong mã:

tableView.alwaysBounceVertical = false

  • hoặc trong Trình tạo giao diện:

Chỉ cần tìm tùy chọn này và untick"Bounce Vertically ".

Đây là tài liệu tham khảo:

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

Nếu bạn không sử dụng AutoLayout:

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }

13

thử cái này

[yourTableView setBounces:NO];

@kyle - cảm ơn bạn đã lưu ý! - nhưng hãy xem đó là những gì xảy ra tự động. Nếu nó ngắn hơn màn hình (hoặc giá đỡ khác), nó KHÔNG cuộn (và rõ ràng là sẽ không bị trả lại, vì nó thậm chí sẽ không cuộn). Nếu nó dài hơn màn hình, nó sẽ cuộn (và thực sự nảy). Không??
Fattie

Có lẽ tôi đã sử dụng chế độ xem bộ sưu tập quá nhiều ... có thể nó hoạt động như tôi mô tả cho chế độ xem bộ sưu tập, nhưng không phải cho UITableView ??
Fattie

9

Bạn có thể đặt bật / tắt bật hoặc cuộn chế độ xem bảng bằng cách chọn / bỏ chọn các mục này trong khu vực Chế độ xem cuộn

Khu vực chỉnh sửa Scroll View


3

Bạn có thể chỉnh sửa điều này trong bảng phân cảnh của mình (nếu bạn đang sử dụng nó). Trong chế độ xem bảng có một hộp kiểm cho biết "Đã bật cuộn". Bỏ chọn nó và bạn đã hoàn tất.


3

// Enable scrolling based on content height self.tableView.scrollEnabled = table.contentSize.height > table.frame.size.height;


3
Tôi nghĩ rằng tôi đã giác ngộ sau khi đọc giải pháp của bạn. Rất cám ơn
Arash

Tôi đã sử dụng điều này trong viewDidAppear của tôi
Maria

1
Ý tôi là viewDidLayoutSubview không xemDidAppear
Maria

0

Tôi tin rằng chiều cao mặc định là 44,0f cho một ô xem bảng. Bạn phải có nguồn dữ liệu của bạn trong một mảng? Sau đó, chỉ cần kiểm tra xem có [array count]*44.0fvượt quá giới hạn khung không và nếu được đặt tableview.scrollEnabled = NO, thì thiết lập khác thành CÓ. Làm điều đó khi bạn tìm ra nguồn dữ liệu cho chế độ xem bảng cụ thể đó.


Các ô trong bảng của tôi có các kích thước khác nhau (và có thể thay đổi kích thước bất kỳ lúc nào; tôi đang sử dụng phương thức heightForRowAtIndexPath) vì vậy tôi có thể không muốn mã hóa cứng 44.0f. Tôi tin rằng con số đó vẫn giống như bảngView.rowHeight?
Ginny

Sau đó, bạn sẽ thực hiện tính toán tổng chiều cao của bạn trong phương pháp đó. Đơn giản phải không? Nếu vượt quá giới hạn màn hình, hãy bật cuộn, nếu không nó sẽ bị vô hiệu hóa. Phương thức này sẽ được gọi cho tất cả các ô hiển thị. Nếu bạn không có đủ dữ liệu để vượt quá màn hình, bạn có thể tính tổng chiều cao ngay trong phương pháp đó. Tiếp tục thêm vào một biến toàn cục chiều cao mà nó trả về cho mỗi cuộc gọi và bạn có tổng chiều cao của mình.
Bourne

Câu trả lời của Roberto là một cách dễ dàng hơn để đạt được tất cả những điều này và để lại sự tính toán cho bàn xem.
Bourne
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.