Xóa không gian trống trước các ô trong UITableView


172

Tôi hiện đang cố gắng đặt một UITableViewvị trí khác chứ không phải ở đầu bộ điều khiển xem của tôi. Như đã nói, nó đang cố gắng thêm tiêu đề ở trên cùng để tính đến thanh điều hướng, nhưng điều này là không cần thiết vì tôi không có ở đầu bộ điều khiển của mình.

Nếu tôi đặt góc trên cùng bên trái của UITableViewnơi tôi muốn các ô ở đó, thì nó sẽ không đặt các ô ở đó:

Bây giờ, nếu tôi chỉ di chuyển chế độ xem bảng lên để các ô ở đúng vị trí, tôi sẽ gặp một vấn đề khác - các ô có thể được di chuyển lên đó khi cuộn (đây là ngón tay của tôi phía trên bộ điều khiển điều hướng):

Khi tôi buông tay, vâng - các ô sẽ nằm ngay bên dưới thanh tìm kiếm, nhưng đây rõ ràng là một vấn đề làm thế nào bạn có thể đưa chúng lên trên nó.

Tôi sẽ đi đâu để tới đó? Có cách nào dễ dàng hơn không?

Câu trả lời:


378

Làm các tế bào của UITableView chương trình trên không gian trống khi bạn cuộn xuống?

Nếu vậy, vấn đề có thể là phần bổ sung được thêm vào UITableView vì bộ điều khiển Điều hướng bạn có trong chế độ xem của mình. Hình nhỏ được thêm vào chế độ xem bảng để nội dung được đặt bên dưới thanh điều hướng khi không xảy ra cuộn. Khi bảng được cuộn, nội dung sẽ cuộn và hiển thị dưới một thanh điều hướng trong suốt. Hành vi này tất nhiên chỉ muốn nếu chế độ xem bảng bắt đầu ngay dưới thanh điều hướng, đây không phải là trường hợp ở đây.

Một điều cần lưu ý là iOS chỉ điều chỉnh phần nội dung cho chế độ xem đầu tiên trong cấu trúc phân cấp chế độ xem nếu nó là UIScrollViewhoặc là hậu duệ (ví dụ UITableViewUICollectionView). Nếu hệ thống phân cấp chế độ xem của bạn bao gồm nhiều chế độ xem cuộn, automaticallyAdjustsScrollViewInsetssẽ chỉ điều chỉnh cho chế độ xem đầu tiên.

Đây là cách thay đổi hành vi này:

a) Trình tạo giao diện

  • Chọn bộ điều khiển xem
  • Thanh tra thuộc tính mở
  • Có một thuộc tính được gọi là "Điều chỉnh phần tử xem cuộn" trong trình kiểm tra thuộc tính của IB (khi bộ điều khiển chế độ xem được chọn) được bật theo mặc định. Bỏ chọn tùy chọn này:


    (Hình ảnh lịch sự của Dheeraj D )

Tôi không chắc phiên bản Xcode nào đã giới thiệu tùy chọn này (không phát hiện ra trong ghi chú phát hành), nhưng ít nhất nó có sẵn trong phiên bản 5.1.1.

Chỉnh sửa: Để tránh nhầm lẫn, đây là tùy chọn thứ ba được đề cập trong các nhận xét

b) Lập trình

Thêm phần này vào tức là viewDidLoad(ghi có vào câu trả lời của Slavco Petkovski và bình luận của Cris R )

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c) Điều này có thể phù hợp với học sinh cũ

Bạn có thể khắc phục điều này bằng cách thêm

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

Hoặc nếu bạn đang sử dụng IB và nếu thanh điều hướng không trong suốt (không thể nói từ ảnh chụp màn hình)

  • Chọn bộ điều khiển xem
  • Thanh tra thuộc tính mở
  • Trong tùy chọn Trình điều khiển xem Mở rộng phần Edges bỏ chọn "Dưới thanh trên cùng"

2
Bỏ chọn "Under Top Bars" trên UIView chỉ hoạt động tốt với tôi. Cảm ơn.
Andreas verland

Tôi đã phát điên khi sử dụng "Paging En bật" và cuộn chỉ dịch chuyển theo chiều cao của thanh điều hướng thay vì toàn bộ ô. Cảm ơn.
LordParsley

8
Tùy chọn thứ ba: bỏ chọn "Điều chỉnh phần trong chế độ xem cuộn" - hoạt động như một nét duyên dáng. cảm ơn lekksi!
Stas Zhukovskiy

2
self.automaticallyAdjustScrollViewInsets = false trong Swift làm việc "de pelos"!
Cris R

1
Cảm ơn cài đặt UIEdgeInsetsZero là bắt buộc nếu sử dụng lại một bảng trong bộ điều khiển bảng mới mỗi khi nó hiển thị nếu không cùng một khoảng trắng xuất hiện và ngày càng lớn hơn.
malhal

71

Tôi đã có cùng một vấn đề và tôi khá chắc chắn rằng tôi đã có một UIView ở đó tại một thời điểm. Chỉ cần sao chép toàn bộ chế độ xem bảng, xóa nó và dán lại một lần nữa đã sửa nó cho tôi.


7
Điều này thực sự rất lạ. Điều này đã giải quyết vấn đề. Bất cứ ý tưởng khi điều này xảy ra?
MiQUEL

Tôi nghĩ bạn có thể giải quyết dễ dàng hơn nhiều bằng cách làm theo câu trả lời của tôi từ ngày 10 tháng 10 năm 13
Netshark1000

Có vấn đề tương tự. Loại bỏ nó và readding cũng làm việc cho tôi.
sma

3
Theo như tôi biết, các phần tử nội dung của chế độ xem cuộn được điều chỉnh tự động (nếu tự độngAdjustScrollViewInsets = YES, theo mặc định là) chỉ khi chế độ xem cuộn là con đầu tiên trong phân cấp chế độ xem của trình điều khiển xem. Tôi đoán là giải pháp này hoạt động vì sau khi dán sao chép chế độ xem bảng, nó không còn là chế độ xem đầu tiên trong phân cấp chế độ xem.
lekksi

Điều gì xảy ra là khi bảngView là thứ đầu tiên bạn thêm vào khung nhìn, hệ thống nghĩ rằng nó phải chừa chỗ cho điều hướng. Tôi đoán ở đây là một số người thêm bảngView và sau đó là tiêu đề. Sau một số vấn đề, sau đó họ xóa bảngView và thêm lại, điều xảy ra sau đó là tiêu đềView là điều đầu tiên trên hệ thống phân cấp, vì vậy hệ thống không phải điều chỉnh nữa, vấn đề đã được giải quyết. Tôi biết bởi vì tôi chỉ sử dụng mã, vì vậy trong trường hợp của tôi phải thêm tiêu đề đầu tiên và sau đó là bảng để sửa nó.
Lluis Gerard

40

Chọn chế độ xem bảng trong bảng phân cảnh của bạn và đảm bảo rằng kiểu được đặt thành "Đồng bằng", thay vì "Được nhóm". Bạn có thể tìm thấy cài đặt này trong tab Inspector thuộc tính.


thật tuyệt vời .. đây là giải pháp cho tôi một cách kỳ lạ .. Tôi vừa sao chép và dán toàn bộ trình điều khiển chế độ xem nhưng bằng cách nào đó, bảng này của trình điều khiển khung nhìn đã dán có phần bù lạ. Câu trả lời này đã giải quyết vấn đề của tôi
daisura99 27/07/18

Điều này đã giải quyết vấn đề nhưng bây giờ các phần tiêu đề hoạt động khác nhau. Bất kỳ ai?
Bruno Muniz

Ban phước cho bạn Dù bạn ở đâu trên thế giới này. Chúc lành cho bạn mãi mãi
gabuchan

9

Trong trường hợp của tôi, tôi đã có một UILabel theo UITableView trong cấu trúc phân cấp xem.

Tôi di chuyển nó "về phía trước" và không gian trống xuất hiện. Không chắc chắn tại sao nhưng nó hoạt động như thế này, nếu có bất cứ thứ gì dưới bảngView, nó sẽ ẩn không gian trống.

Ngoài ra, bạn có thể thử kiểm tra / bỏ chọn "Điều chỉnh các phần tử xem cuộn" trên trình kiểm tra trình điều khiển xem của bạn trên bảng phân cảnh.

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


2
Tôi có một UITableView được nhóm và bỏ chọn "Điều chỉnh các phần tử xem cuộn" đã hoạt động.
Matt

5

Không có gì ở trên đã giúp tôi. nhưng làm điều này đã giúp :

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

thay vì '-64', bạn có thể đặt bất kỳ số nào khác tùy thuộc vào chiều cao của thanh điều hướng.


4

Có thể được thêm vào trước UIRefreshControl. Tôi có vấn đề với mã như thế này:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

Như bạn thấy, tôi đặt self.refreshControllerngay sau đóinit

Nhưng, nếu bạn đặt refreshControlsau khi thiết lập, thì không gian trên cùng sẽ không can thiệp vào bạn.

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}

Tôi không thể tin rằng đây là vấn đề thực sự. Đó chỉ là một vấn đề đối với tôi vào <= 9.3.5. Làm thế nào trên thế giới bạn đã tìm ra điều này?
Còi báo

4

Nếu bạn đang làm điều này trên iOS 11, tự độngAdjustScrollViewInsets sẽ không hoạt động vì nó không được dùng nữa, đoạn mã sau sẽ hoạt động với tôi theo câu trả lời trong bài đăng này: https://stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }

Hi vọng điêu nay co ich.


4

Trong Bảng phân cảnh, đặt contentInsetscủa bạn tableviewthành Không bao giờ

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


3

Tôi không thể chắc chắn nhưng có vẻ như bạn đã có thêm một UIView bị kẹt giữa nơi các Nguyên mẫu bắt đầu và trên cùng của UITableView. Hình ảnh của tôi trông giống hệt hình ảnh của bạn nếu bạn xóa văn bản / dòng tôi đã thêm vào.

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


3

Tôi vẫn không chắc điều gì đã gây ra không gian thừa đó ở trên cùng, nhưng tôi thấy rằng việc xóa UITableView với không gian đó và thay thế nó bằng một không gian mới đã lấy đi không gian đó.

Tôi đã vô tình kéo một UIView trong đó, nhưng tôi không thể chọn nó để tôi không thể xóa.


3

Swift 5

Thử với loại bỏ bảngHeaderViewtableFooterView

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)

2

Kiểm tra khung xem bàn của bạn trong bảng phân cảnh hoặc xib. Của tôi theo mặc định có giá trị vị trí ay, do đó lỗi


2

Trong ứng dụng của tôi cũng đã trải qua một vấn đề như thế này. Tôi đã đặt phần trên cùng của bảngView zero. Cũng đã thử thiết lập falsecho automaticallyAdjustsScrollViewInsets. Nhưng đã không làm việc.

Cuối cùng tôi đã có một giải pháp làm việc. Tôi không biết đây là cách chính xác. Nhưng thực hiện heightForHeaderInSectionphương pháp đại biểu làm việc cho tôi. Bạn phải trả về giá trị khác không để làm việc này (trả về 0 sẽ hiển thị cùng một không gian như trước).

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 0.1
}

2

Trong năm 2017, những gì đang làm việc cho tôi chỉ đơn giản là một dòng này

navigationContoder? .navulationBar.isTranslucent = false

Tôi không biết tại sao điều đó thậm chí sẽ ảnh hưởng đến nó. Có lẽ ai đó có thể giải thích. Nhưng tôi khá chắc chắn đây là câu trả lời mà hầu hết mọi người sẽ tìm kiếm.


Điều đó đã làm điều đó cho tôi là tốt. Cảm ơn!
scurioni

2

Trong iOS 11 trở lên, apple đã thay đổi thuộc tính để điều chỉnh nội dung chèn. Sử dụng contentInsetAdjustmentBehaviorvà thiết lập .neverđể loại bỏ thêm không gian trên UICollectionView, UIScrollView, UITableView.

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

Tôi hy vọng điều này sẽ giúp bạn.


1

Đối với tôi, vấn đề xảy ra khi tôi kéo một ô nguyên mẫu từ menu vào chế độ xem bảng. Vì vậy, tôi đã xóa nó và chỉ đặt ô nguyên mẫu thành 1 trong các thuộc tính trình kiểm tra xem bảng


1

Tôi đang thực hiện việc này theo chương trình và tôi chỉ cần di chuyển addSubview (tableView) của mình xuống phía dưới sau khi thêm tất cả các cuộc phỏng vấn khác và nó đã giải quyết vấn đề của tôi!

Không chắc chắn tại sao điều này chỉ xuất hiện trên thiết bị chứ không phải trình giả lập của tôi, nhưng dù sao thì ít nhất cũng có một giải pháp đơn giản!


1

Miễn là UITableView không phải là khung nhìn phụ đầu tiên của bộ điều khiển khung nhìn, không gian trống sẽ không xuất hiện.

Giải pháp: Thêm một đối tượng xem ẩn / rõ (khung nhìn, nhãn, nút, v.v.) làm khung nhìn phụ đầu tiên của bộ điều khiển khung nhìn (cùng cấp với UITableView nhưng trước nó).


Tôi đã dành rất nhiều thời gian để cố gắng tìm ra điều này, thử nhiều gợi ý ở đây và trên các bài đăng khác. Đây là một trong những giải quyết nó. Cảm ơn bạn! Bạn có thể giải thích tại sao mặc dù hoặc đăng một liên kết đến một số tài liệu không? Tôi chỉ đang học dev iOS và nó rất khác so với Android! :)
Đánh dấu

0

UIView có thể được chèn ở đầu và cuối bảng (kéo và thả). Đặt thuộc tính của chúng là trong suốt và chiều cao 1 px. Điều này là để loại bỏ phần đệm thêm ở phía trước các ô.


0

Tôi cũng gặp vấn đề này, viewView không phải là khung nhìn cuối cùng trong hệ thống phân cấp. Trong trường hợp của tôi, tôi đã có một khung nhìn ở trên (mặc dù chúng không chồng chéo lẫn nhau), vì vậy tôi đã kéo nó lên trên bảngView trong hệ thống phân cấp và điều đó đã tạo ra nó.


0

Tôi chỉ tìm thấy một giải pháp cho việc này.

Chỉ cần chọn viewview và clic Editor -> Arrange -> Send to Front

Nó làm việc cho tôi và hy vọng nó sẽ giúp tất cả các bạn.


0

Trong trường hợp của tôi, tôi đã sử dụng ContainerViewControll và đặt UITableViewControll vào đó. Sau khi loại bỏ ContainerViewControll. Các vấn đề biến mất.


0

Lỗi mã Xcode 8

Hãy thử điều này trước nếu kiểu UITableView của Storyboard của bạn được đặt thành Plain.

Đặt kiểu của bảng thành Nhóm rồi quay lại Đồng bằng. Điều này đã loại bỏ không gian trong ứng dụng của tôi ở đầu UITableView của tôi.


0

Trong trường hợp của tôi, tôi đã sử dụng chế độ xem vùng chứa (Chế độ xem chính -> Chế độ xem Contaner -> UITableView)

Không gian thêm ở trên cùng, tôi nghĩ, giống như không gian của thanh thông báo thiết bị (nơi hiển thị thời gian, pin). Tôi thực sự làm, đó không phải là một giả định.

Những gì tôi đã làm là từ UI Builder:

  • chọn Bộ điều khiển xem bảng hoàn tất
  • Thanh tra thuộc tính mở
  • Chuyển đến -> Xem Trình điều khiển -> Bố cục -> "Chọn Toàn màn hình"

0

Bạn có thể sử dụng mã này vào viewDidLoad hoặc viewDidAppear nơi bảng của bạn được tạo:

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];


0

đặt Edges Extended Viewges trong bảng phân cảnh để thuộc underTopBartính không được chọn.


0

Đã có cùng một vấn đề. Tôi đã giải quyết nó bằng cách thêm phần sau vào viewDidLoad.

self.extendedLayoutIncludesOpaqueBars = true


-2

kiểm tra

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • đề cập đến chức năng ủy nhiệm bảng xem cellForRowAtIndexPath:
  • nó có thể xử lý cả ios 6 và 7.
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.