Tại sao lại có thêm phần đệm ở đầu UITableView của tôi với kiểu UITableViewStylegrouped trong iOS7


635

Bắt đầu từ iOS7, có thêm không gian ở đầu trang của tôi UITableViewcó kiểu dángUITableViewStyleGrouped .

Đây là một ví dụ:

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

Chế độ xem bảng bắt đầu ở mũi tên đầu tiên, có 35 pixel đệm không giải thích được, sau đó tiêu đề màu xanh lá cây được UIViewtrả về bởiviewForHeaderInSection (trong đó phần là 0).

Bất cứ ai cũng có thể giải thích số lượng 35 pixel này đến từ đâu và làm thế nào tôi có thể thoát khỏi nó mà không cần chuyển sang UITableViewStylePlain?


Ghi chú:

Trong iOS 11 trở lên:

tableView.contentInsetAdjustmentBehavior = .never

Bạn có đang sử dụng iOS 7 mới nhất không? Một số LOẠI không nhất quán này (nhưng không phải tất cả, và có lẽ không phải cái này) đã được chữa khỏi trong các lần xem trước của nhà phát triển sau này. Tôi nên biết: Tôi đã trì hoãn rất nhiều vấn đề đã biến mất.
Dan Rosenstark

Kiểm tra câu trả lời tại đây - stackoverflow.com/a/18986158/1463604
Nishant

Câu trả lời ngắn gọn là phần đệm thêm này có thể là do tiêu đề xem bảng (không phải tiêu đề phần) và UITableViewkhông muốn được chỉ định một tiêu đề có chiều cao 0,0. Kiểm tra stackoverflow.com/a/31223403/1394534 để biết thêm chi tiết.
Aurelien Porte

30
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];lưu ý: 0.0fchỉ bị bỏ qua nếu bạn sử dụng nó trong chiều cao của trực tràng. Vì vậy, chúng tôi sử dụng CGFloat gần nhất có thể (ít nhất là "hoạt động" này đối với tôi ... chỉ là giải pháp không lý tưởng).
Alejandro Iván

1
@ AlejandroIván bình luận của bạn chỉ làm cho đêm của tôi. Tôi đã có một bảng Xem với các nguyên mẫu được nhóm. Tôi đang sử dụng numberSections = data.count và cài đặt numberRows = 1. Tôi đặt heightForFooterInSection để tạo khoảng trống giữa mỗi và vì một lý do nào đó, một bảngHeadView trống xuất hiện.
Ryan Alexander

Câu trả lời:


863

Tôi đã được giúp đỡ bằng cách sau:

YouStoryboard.storyboard> YouViewControll> Trình kiểm tra thuộc tính> Bỏ chọn - Điều chỉnh các phần tử xem cuộn.

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


42
Tôi nghĩ rằng đây là cách chính xác để loại bỏ phần đệm đó, thay vì giả mạo các giá trị edgeInset.
Hgeg 24/11/13

21
Điều này không hiệu quả với tôi - Tôi có một navBar mờ ở trên và điều này tắt đẩy nội dung bên dưới nó.
slycrel

5
Không hoạt động khi sử dụng tùy chỉnh collectionview. (Khi xem bàn bên trong collectionviewcell)
Akshit Zaveri

5
Không làm việc cho tôi; Chỉ có điều mà làm việc được chuyển sang đồng bằng thay vì nhóm
shim

28
Tôi gặp vấn đề này với TableViewControll bên trong khung nhìn container. Tôi đã phải đặt thuộc tính này không trực tiếp trên TableViewContoder đã được nhúng, nhưng trên bộ điều khiển khung nhìn có chứa khung nhìn container. Sau đó, nó làm việc.
Andy Mortimer

325

Tôi đã chơi xung quanh với nó nhiều hơn một chút và có vẻ như đây là một hiệu ứng phụ của việc thiết lập bảngView tableHeaderView = nil .

Bởi vì bảngView của tôi xuất hiện linh hoạt tableHeaderView, khi tôi cần ẩn tableHeaderView, thay vì làm self.tableView.tableHeaderView = nil;, tôi làm:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

Tôi thích giải pháp này tốt hơn là thiết lập một chút tùy ý contentInset.topvì tôi cũng sử dụng contentInset.topđộng. Phải nhớ để loại bỏ thêm 35px mỗi khi tôi tính toán lại contentInset.toplà tẻ nhạt.


4
Giải pháp tuyệt vời! Thật vậy, bạn phải đặt nó thành 0,01f để thoát khỏi chế độ xem tiêu đề xem bảng mặc định như trong mã của bạn.
Simone Manganelli

2
BTW, điều này cũng có thể được thực hiện với một lần kéo và thả trong Trình tạo giao diện. Dù sao cũng cảm ơn! :)
Rudolf Adamkovič

8
bạn xứng đáng nhận huy chương cho việc này
Vaibhav Gautam

7
Xin lưu ý rằng chế độ xem chiều cao 0,01f ở đầu chế độ xem bảng của bạn sẽ có nghĩa là tất cả các ô bên dưới bị sai lệch (ô đầu tiên có gốc Y là 0,01, tiếp theo là ô_height + 0,01, v.v.) nên nội dung của các ô đó sẽ bị sai lệch. (Bật Debug > Color Misaligned Imagestrình giả lập để thấy điều này cho chính bạn.) Bạn không muốn làm điều đó.
Simon Whitaker

2
Tốt hơn là sử dụng UITableViewHeaderFooterViewthay vì UIView. Và CGFLOAT_MINhoạt động giống như 0.01fnhưng tốt hơn trong lý thuyết.
Jaybo 14/2/2015

178

Đối với iOS 7 nếu bạn đang phân bổ chế độ xem bảng trong bộ điều khiển xem, bạn có thể xem xét

self.edgesForExtendedLayout = UIRectEdgeNone;

vấn đề của bạn có vẻ giống với tôi

Cập nhật:

Swift trong iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)

3
Làm việc trên đồng bằng của tôi UITableView. Các vấn đề bắt nguồn từ việc tôi UITableViewUIViewControllerbên trong UINavigationControllerkhiến nội dung bảng giảm 44 điểm nên nội dung ban đầu không nằm sau navBar. Điều đó không cần thiết với bố cục của tôi, vì vậy nó chỉ gây ra vấn đề. Cuối cùng, tôi đã thay đổi mã của mình để automaticallyAdjustsScrollViewInsetslàm việc.
DBD

Thuộc tính này chỉ được áp dụng để xem các bộ điều khiển được nhúng trong một thùng chứa, chẳng hạn như UINavestionControll. Trình điều khiển xem gốc của cửa sổ không phản ứng với thuộc tính này. Giá trị mặc định của tài sản này là tất cả. .. Tôi cảm thấy như mặc định nên là 0? Trường hợp này có một lợi thế.
Desh_

5
Thanh lịch hơn với Swift 3:edgesForExtendedLayout = []
Dave Batton

Xin chào @yeahdixon Bạn sử dụng phần mềm nào để tạo mũi tên màu hồng? cảm ơn trước
iArezki

174

Hãy thử thay đổi contentInsettài sản UITableViewthừa kế từ UIScrollView.

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);

Đó là một cách giải quyết, nhưng nó hoạt động


6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);làm việc tốt nhất với tôi vì có thêm 20 pixel ở trên cùng và dưới cùng.
Brian

1
Mặc dù giải pháp "sức mạnh vũ phu" này hoạt động, tôi nghĩ rằng những cái dưới cùng (cụ thể là các miếng lót điều chỉnh tự động) nên được xếp hạng cao hơn.
eladleb

134
self.automaticallyAdjustsScrollViewInsets = NO;

Hãy thử, bạn có thể đối phó với nó!


Điều này hoạt động rất tốt để ẩn bảngHeadView trong iOS 7.0, nhưng nó không được hỗ trợ trong các phiên bản cũ hơn.
Brian

Hoạt động tuyệt vời trong iOS 7.
StackRunner

3
Quan trọng: Đảm bảo bạn thực hiện việc này trong bộ điều khiển chế độ xem vùng chứa, nếu UITableView của bạn được đặt trên bộ điều khiển được nhúng vào bộ điều khiển khác, hãy thực hiện việc này trong bộ điều khiển nhúng, chứ không phải trực tiếp nơi bạn đặt UITableView (nơi AutoLayout sẽ chăm sóc mọi thứ).
James Stone

Điều này là tốt hơn uncheck Adjust scroll view insets. Bởi vì đôi khi chúng tôi không sử dụng bảng phân cảnh để xây dựng giao diện người dùng của mình.
JW.ZG

Điều này làm việc cho tôi. Tôi đã đính kèm chế độ xem vào thanh điều hướng và chế độ xem bảng, điều đó không xảy ra trong iOS 11, nhưng nó xảy ra trong iOS 10. Cảm ơn.
dobiho

78

Bạn có thể phát hiện xem ứng dụng của bạn có chạy iOS7 trở lên hay không và thêm hai phương thức này vào đại biểu xem bảng của bạn (thường là trong mã UIViewControll của bạn)

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

Đây có thể không phải là một giải pháp tao nhã nhưng hiệu quả với tôi

Phiên bản Swift:

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

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

1
Điều này làm việc cho tôi. UITableView thêm không gian trên đầu vì nhiều lý do khác nhau. Cụ thể, liên quan đến OP, vấn đề chỉ xảy ra đối với chế độ xem bảng kiểu được nhóm. Và giải pháp này đã khắc phục vấn đề.
RajV

5
Bạn có thể sử dụng CGFLOAT_MIN thay vì 0,001, nó mang lại cho bạn giá trị tuyệt đối nhỏ nhất của CGFloat.
eiKatte

2
Đây là câu trả lời đúng vì tính năng thực sự là phần đệm chỉ có trong chế độ xem bảng kiểu được nhóm và bị bỏ qua nếu bạn chỉ định tiêu đề / chân trang
Jakub Truhlář

Điều này nên được đánh dấu là câu trả lời chính xác. Một phương pháp ủy nhiệm để ghi đè và nó trả lời câu hỏi. Ít nhất hãy thử điều này trước nếu bạn đọc đến đây tất cả các bản hack. Hãy thử tweet: - (CGFloat) tableView: (UITableView *) tableView heightForHeaderInSection: (NSInteger) phần {// return CGFLOAT_MIN; trả lại 30,0f; }
Matthew Ferguson

Đẹp! Như một phần thưởng, nếu bạn muốn có một tiêu đề nhỏ trên đầu và nhiều hơn ở giữa các phần được nhóm, bạn có thể sử dụng như sau:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Freek Sanders

55

Tôi đã tìm ra nguyên nhân của lỗi ban đầu của mình và tạo một dự án mẫu trưng bày nó. Tôi tin rằng có một lỗi iOS7.

Kể từ iOS7, nếu bạn tạo UITableView với kiểu Nhóm, nhưng không có đại biểu được đặt trên bố cục đầu tiên, thì bạn đặt đại biểu và gọi reloadData, sẽ có một không gian 35px ở trên cùng sẽ không bao giờ biến mất.

Xem dự án này tôi đã thực hiện giới thiệu lỗi: https://github.com/esilverberg/TableViewDelayedDelegateBug

Cụ thể tệp này: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewControll.m

Nếu dòng 24 đang hoạt động,

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

sẽ có thêm một không gian 35 px ở trên cùng. Nếu dòng 27 đang hoạt động và 24 được nhận xét,

self.tableView.delegate = self;

không có không gian ở trên cùng. Giống như bảngView đang lưu một kết quả ở đâu đó và không vẽ lại sau khi ủy nhiệm được đặt và reloadData được gọi.


21
Tôi muốn nói thêm rằng ngay cả khi có một đại biểu nhưng đại biểu tableView:heightForHeaderInSection:tableView:heightForFooterInSection:trả về 0, bạn cũng sẽ gặp vấn đề này. Việc thực hiện các phương thức giao thức ở trên VÀ trả về 0,01f đã sửa nó cho tôi.
John Estropia

1
ĐÚNG!! Tôi đã thử 3 giải pháp được gọi là và đây là giải pháp! Rực rỡ, cảm ơn: D
Henrik Erlandsson

hoàn hảo. Bất cứ ai cũng báo cáo lỗi vì tôi nghĩ rằng đây không phải là hành vi dự định.
Pushparaj

tìm tuyệt vời Điều này vẫn xảy ra trong ios 9 (chúng tôi không sử dụng XIB) nhưng đặt đại biểu trên init đã cố định khoảng cách (không phải trong loadView hoặc viewDIdLoad). Cảm ơn bạn!
John Stricker

1
Thiết lập ước tính Độ cao cho tiêu đề đã giúp tôi
Viktor

49

Bỏ chọn "Điều chỉnh chế độ xem cuộn"

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


Tôi cần tùy chọn này cho một Trình điều khiển xem khác của tôi và rõ ràng khi tôi tạo một VC mới, sự thay đổi đã được thực hiện. Cám ơn vì cái này!
David

Vâng! Hoạt động, chỉ cần đặt nó trong ContainerView và hoạt động!
Felipe FMMobile

46

Một bình luận nhanh ... ngay cả trong XCode 6.1, có một lỗi với không gian dọc xuất hiện ở đầu UIScrollViews, UITextViewsUITableViews.

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

Đôi khi, cách duy nhất để khắc phục sự cố này là vào Bảng phân cảnh và kéo điều khiển sự cố để nó không còn là lượt xem đầu tiên trên trang.

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

(Tôi cảm ơn Oded đã chỉ cho tôi theo hướng này ... Tôi đang đăng bình luận này, chỉ để thêm một vài ảnh chụp màn hình, để chứng minh các triệu chứng và khắc phục.)


1
Lưu ý rằng lỗi này, errrr, sự cố cũng xảy ra trong iOS 8 nếu bạn có UITextView làm điều khiển phụ đầu tiên trên trang của mình ... vì vậy đây không chỉ là sự cố UITableView.
Mike Gledhill

1
Trong tất cả các giải pháp chỉ có hack này làm việc cho tôi. Một sửa chữa kỳ lạ cho một lỗi kỳ lạ. Tôi đã đối mặt với vấn đề này với UITableview.
Mesbah

4
1 triệu cảm ơn bạn! Đây là giải pháp duy nhất làm việc cho tôi.
dùng139816

1
(. Tôi ngạc nhiên của nó 18 tháng sau, và độc giả vẫn đang bỏ phiếu lên câu trả lời này đã nghiêm túc của Apple không cố định vấn đề này chưa?!)
Mike Gledhill

1
cứu cuộc đời tôi! cảm ơn. Bạn có biết mất bao lâu để tìm ra "sửa chữa" đơn giản này không? grrh.
Mc.Stever

40

Theo hướng dẫn chuyển đổi cho iOS7 của Apple, phần nội dung của chế độ xem cuộn được tự động điều chỉnh. Giá trị mặc định của tự độngAdjustScrollViewInsets được đặt thành CÓ.

Bộ điều khiển UIViewContaptor có UITableView sẽ đặt thuộc tính này thành NO.

self.automaticallyAdjustsScrollViewInsets = NO;

Điều này sẽ làm các mẹo.

CHỈNH SỬA 1:

Ngoài ra, người ta có thể thử -

self.navigationController.navigationBar.translucent = YES;

Điều này cũng loại bỏ phần đệm thêm trên đầu trang.


Câu trả lời rất hay, trừ khi nó không trả lời chính xác câu hỏi. Esilver nói về khoảng cách 35px, nhưng iOS7 thêm tiêu đề 20px: bằng chiều cao của thanh trạng thái.
Martin

Vấn đề vô lý. Cảm ơn câu trả lời.
Genki

Đây là câu trả lời cho một vấn đề khác.
entonio

Cảm ơn bạn, nó đã làm việc cho tôi, trong trường hợp cụ thể của tôi, tôi đã có một trình điều khiển bảng được nhúng trong trình điều khiển khung nhìn và bằng cách đặt tự độngAdjustScrollViewInsets = false trong trình điều khiển khung nhìn, khoảng cách trên cùng biến mất
Alexey

39

Trong khi sử dụng TableView được nhóm, hãy sử dụng cái này để tránh cắt đường viền trong viewWillAppear

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);

Đã thử tất cả những người khác. Đây là một trong những làm việc! Thx
Michael

36

Rất nhiều câu trả lời trước đây là quá hacky. Họ sẽ phá vỡ bất cứ lúc nào trong tương lai nếu Apple quyết định khắc phục hành vi bất ngờ này.

Nguồn gốc của vấn đề:

  1. a UITableViewkhông muốn có một tiêu đề có chiều cao 0,0. Nếu những gì bạn đang cố gắng làm là có một tiêu đề có chiều cao bằng 0, bạn có thể chuyển đến giải pháp.

  2. ngay cả khi sau này bạn chỉ định chiều cao không 0,0 cho tiêu đề của mình, ban đầu UITableViewbạn không muốn được chỉ định một tiêu đề có chiều cao 0,0.

Giải pháp:

Sau đó, cách khắc phục đơn giản và đáng tin cậy nhất là đảm bảo rằng chiều cao tiêu đề của bạn không bằng 0 khi bạn gán nó cho chế độ xem bảng của mình.

Một cái gì đó như thế này sẽ làm việc:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

Một cái gì đó như thế này sẽ dẫn đến vấn đề tại một số điểm (thường, sau khi cuộn):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;

Cuối cùng, tôi tìm thấy câu trả lời hoạt động. Cảm ơn. Ngoài ra, tôi đã học được rằng đó tableView.tableHeaderViewthực sự là một chế độ xem phụ kiện bên trên nội dung hàng. Tôi đã bối rối với các tiêu đề phần cho đến khi câu trả lời của bạn được đưa ra.
Joe Huang

1
CGFLOAT_MINđã được thay thế bằng CGFloat.leastNormalMagnitudetrong Swift 3
Clay Ellis

29

Bảng phân cảnh:

Chỉ cần bỏ chọn: Adjust Scroll View Insetstrong tùy chọn Xem của Trình điều khiển

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

Mã số:

self.automaticallyAdjustsScrollViewInsets = false

2
sử dụng xcode 7 Tôi không thấy Trình kiểm tra thuộc tính> Bố cục, tôi nên thêm self.automaticallyAdjustScrollViewInsets = false
alex

trong xem đã tải.
CW0007007

23

Đây là giải pháp cho iOS 10 bằng Swift 3:

Bạn có thể thoát khỏi phần đệm trên và dưới bằng cách thực hiện các phương pháp sau từ UITableViewDelegate.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{ 
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}

Trang thứ hai trên SO đã giúp tôi .... Tôi không biết tại sao, có thể vì AutomaticDimension, có thể vì những ràng buộc với VFL, dù sao đi nữa, cảm ơn bạn! ozi bua ist dũng cảm! : D
Pentarex

Đây là phần đầu trang và chân trang. Câu hỏi liên quan đến toàn bộ tiêu đề bảng. Ngoài ra, không có gì cụ thể đối với Swift3 hoặc iOS 10 trong cả hai phương thức ủy nhiệm (chúng đã tồn tại mãi mãi).
Nicolas Miari

14

Trong trường hợp của tôi đây là những gì đã giúp tôi. Tôi cũng đang hỗ trợ ios6.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}

Không chắc chắn những gì nó làm nhưng nó hoạt động hoàn hảo. Bạn có thể đưa ra một số lời giải thích?
Matt Wolfe

@MattWolfe Tôi đã bị lạc, và tìm thấy giải pháp này, không biết tại sao điều này lại xảy ra. Tôi đoán là bộ điều khiển đang quyết định rằng viewview cần một phần tử, vì thanh trạng thái (hoặc trong các trường hợp khác thanh công cụ / thanh tab) nên nó tự động thêm nó. Tôi thực sự vật lộn với một số "tính năng" mới của iOS7. Có lẽ ai đó hiểu nó, và có một lời giải thích thực sự về điều này?
Lukas

Đã dành 2 ngày qua để chuyển một ứng dụng tương đối nhỏ sang iOS 7 và vẫn gặp sự cố nhỏ .. Tôi sửa nó trong ios 7, nó bị hỏng trong 6 và ngược lại .. Lái xe cho tôi!
Matt Wolfe

Đây là một vấn đề khác với OP. Ngay cả với điều này, đối với chế độ xem bảng được nhóm, một không gian bổ sung được thêm vào trên cùng.
RajV

1
đây dường như là dòng chính: self.automaticallyAdjustScrollViewInsets = NO; chỉ cần thiết lập mà loại bỏ không gian thêm tôi có.
Mike M

14

Chỉ cần thêm các mục sau vào viewDidLoad trong VC của bạn:

self.automaticallyAdjustsScrollViewInsets = NO;

Khắc phục sự cố này đã hoạt động và tôi thích nó hơn là tự cài đặt các miếng lót bằng các số ma thuật. Cảm ơn!
imobilizer

14

Vì vậy, tôi đã thử mọi phương pháp ở đây, và lần này không ai trong số họ giúp được. Trường hợp của tôi là chế độ xem bảng được nhóm trên iOS 9. Tôi thực sự không biết tại sao và làm thế nào tôi tìm ra cái này, nhưng đối với tôi, việc thiết lập tableViewHeadervới một chiều cao UIViewtối thiểu có 0.01hiệu quả. CGRectZerokhông giúp đỡ, không có gì thực sự giúp đỡ:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))

10

Swift: iOS Tôi đã có chế độ xem bảng trên chế độ xem cuộn .. khi tôi nhấp vào "Quay lại" trên cùng một màn hình. Chế độ xem cuộn chiếm nhiều không gian hơn trên đầu .. để giải quyết điều này tôi đã sử dụng:

 self.automaticallyAdjustsScrollViewInsets = false

Giá trị Boolean cho biết liệu bộ điều khiển chế độ xem có tự động điều chỉnh các phần tử xem cuộn của nó hay không. Giá trị mặc định là true, cho phép bộ điều khiển chế độ xem điều chỉnh các phần tử xem cuộn của nó để đáp ứng với các khu vực màn hình được sử dụng bởi thanh trạng thái, thanh điều hướng và thanh công cụ hoặc thanh tab. Đặt thành false nếu bạn muốn tự mình quản lý chế độ xem cuộn cuộn, chẳng hạn như khi có nhiều hơn một chế độ xem cuộn trong phân cấp chế độ xem.


10

Nhờ câu trả lời của @Aurelien Porte. Đây là giải pháp của tôi

Nguyên nhân của vấn đề này: -

  1. một UITableView không muốn có một tiêu đề có chiều cao 0,0. Nếu những gì bạn đang cố gắng làm là có một tiêu đề có chiều cao bằng 0, bạn có thể chuyển đến giải pháp.
  2. ngay cả khi sau này bạn chỉ định chiều cao không 0,0 cho tiêu đề của mình, UITableView không muốn được chỉ định một tiêu đề có chiều cao 0,0 lúc đầu.

Trong ViewDidLoad: -

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

Không cần một cái gì đó như thế này: -

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

Trong heightForHeaderInSectionđại biểu: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

Trong viewForHeaderInSectionđại biểu: -

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}

10

Đây là cách có thể khắc phục dễ dàng trong iOS 11Xcode 9.1 thông qua Storyboard:

Chọn Chế độ xem bảng> Trình kiểm tra kích thước> Nội dung: Không bao giờ


1
Làm việc cho tôi :)
bhupinder

Tuyệt quá! Cảm ơn :)
Saeed Ir

1
Điều này thay vì automaticallyAdjustsScrollViewInsetstrong ios 11
Nik Kov

9

Tôi cho rằng đó chỉ là một phần của cái mới UITableViewStyleGrouped phong cách . Nó nằm trong tất cả các chế độ xem bảng được nhóm và dường như không có cách nào trực tiếp để kiểm soát không gian đó.

Nếu không gian đó được đại diện bởi a UIView, có thể tìm kiếm trong tất cả subviewscácUITableView để tìm chế độ xem cụ thể đó và chỉnh sửa trực tiếp. Tuy nhiên, cũng có khả năng là không gian chỉ là phần bù được mã hóa cứng trước khi các tiêu đề và ô bắt đầu và sẽ không có cách nào để chỉnh sửa nó.

Để tìm kiếm trong tất cả các lần xem xét (tôi sẽ chạy mã này khi bảng không có ô, để đọc đầu ra dễ dàng hơn một chút):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}

3
Nếu UITableViews (cụ thể hơn UITableViewCellScrollView) trên iOS7 đã dạy chúng ta một điều, thì đó là để lại hệ thống phân cấp chế độ xem của các lớp được xây dựng một mình.
Matthias Bauch

Điểm tốt. Tùy chọn khác là ... để tiếp tục hack cho mỗi iOS;)
Dan Rosenstark

Rất tiếc, vâng. Nhắc để viết cảnh báo đó nhưng quên.
Kevin

Kevin - tôi nghĩ bạn đúng, đây là do thiết kế. Dường như trả về 0 cho heightForHeaderInSection là cách dễ nhất để loại bỏ phần đệm này. Vì một số lý do trong trường hợp cụ thể đó, nó không hoạt động với tôi, nhưng nó hoạt động trên các UITableView khác.
esilver

1
Đó chắc chắn là "theo thiết kế". Nếu bạn tạm dừng thực thi và chạy: po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]bạn sẽ thấy tiêu đề bảng hoặc tiêu đề phần đầu tiên hoặc ô đầu tiên (tùy thuộc vào những gì bạn sử dụng) tự nhiên để lại đường viền 35px .... boo.
Ông T

9

Câu trả lời của tôi sẽ là câu trả lời chung chung hơn, nhưng cũng có thể được áp dụng cho điều này.

Nếu chế độ xem gốc (của ViewContoder ) hoặc con đầu tiên ( chế độ xem phụ ) của chế độ xem gốc là lớp con của UIScrollView (hoặc chính UIScrollView) và nếu

self.navigationController.navigationBar.translucent = YES;

khung sẽ tự động thiết lập nội dung được tính toán trước .


Để tránh điều này bạn có thể làm

self.automaticallyAdjustsScrollViewInsets = NO;

nhưng trong trường hợp của tôi, tôi đã không thể làm điều này, vì tôi đã triển khai SDK có thành phần UIView có thể được sử dụng bởi các nhà phát triển khác. Thành phần UIView đó chứa UIWebView (có UIScrollView là khung nhìn phụ đầu tiên). Nếu thành phần đó được thêm làm con đầu tiên trong hệ thống phân cấp chế độ xem của UIViewContoder, các bộ chèn tự động sẽ được hệ thống áp dụng.

Tôi đã sửa lỗi này bằng cách thêm chế độ xem giả với khung (0,0,0,0) trước khi thêm UIWebView.

Trong trường hợp này, hệ thống đã không tìm thấy lớp con của UIScrollView như là khung nhìn phụ đầu tiên và không áp dụng nội dung


lưu trực tiếp! cảm ơn bạnself.automaticallyAdjustsScrollViewInsets = false
ethanneff

8

Mã này đã làm việc cho tôi, Câu trả lời tốt nhất cho tôi được viết ở objective-Cphía bên trên nên tôi đã chuyển đổi nó thành Swift.

Dành cho Swift 4.0+

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

Chỉ cần viết nó vào viewDidLoad()và nó sẽ hoạt động như một lá bùa.


1
cảm ơn bạn rất nhiều, làm việc tốt cho tôi
Ângelo Polotto

1
chào mừng bạn mã hóa hạnh phúc
Vipul Kumar

7

Tôi đã sửa chữa tương tự như arielyz. Khi tôi đã di chuyển UITableView để không phải là khung nhìn phụ đầu tiên của chế độ xem chính, nó sẽ biến mất. Không gian của tôi là 20 px, không phải 35.

Tôi đã không thể tạo lại nó trong một xib chân dung, chỉ là một xib phong cảnh. Tôi sẽ báo lỗi radar sau nếu tôi có thể tái tạo nó trong một ứng dụng demo đơn giản.


Gặp vấn đề tương tự, không thể giải quyết nó bằng cách thay đổi contentInset nhưng phương pháp này đã hoạt động, mặc dù nó khá là hack. Để biết giá trị của nó, sử dụng công cụ gỡ lỗi trực quan, tôi có thể thấy rằng trong khi UITableView có chiều cao phù hợp, thì UITableViewWrapper bên trong nó lại không.
Mic Fok

Hoàn hảo. Điều này đã sửa lỗi cho tôi, trong XCode 6.1. Không có gợi ý nào khác trong trang StackOverflow này tạo ra sự khác biệt. Tôi đã có một UITableView trong một UIView và nó là cuộc phỏng vấn đầu tiên. Kéo nó để trở thành subview thứ 2 cố định nó hoàn hảo. (Nếu ai cần tôi, tôi sẽ ở trong quán rượu.)
Mike Gledhill

Cảm ơn bạn! Điều này cũng hoạt động nếu bạn có một bộ điều khiển xem bảng trong một container. Di chuyển container để nó không phải là cái đầu tiên trong chế độ xem của cha mẹ sẽ xóa khoảng cách ở trên cùng của chế độ xem bảng.
siết cổ

7

Tôi nghĩ rằng làm cho UIEdgeInsets -35 0 0 0 là tẻ nhạt. Trong trường hợp của tôi, tôi đã triển khai phương thức tableView: heightForHeaderInSection: và nó có khả năng trả về 0.

Khi tôi thay đổi 0 thành 0,1f, vấn đề đã biến mất.


1
Nếu tôi có thể, tôi sẽ nâng cao điều này hơn một lần. Phải là một trục trặc tự động kỳ lạ hoặc một cái gì đó ... Vì mọi thứ> 0 hoạt động, tôi đề nghị thay vì sử dụng FLT_EPSILON hoặc DBL_EPSILON, xem cả hai đều đại diện cho giá trị dương nhỏ như 1.0 + epsilon! = 1.0
Henri Normak

7

Điều duy nhất làm việc cho tôi là:

Swift :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Mục tiêu-C :

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

Ngoài ra, tôi vẫn còn một khoảng trống cho phần đầu tiên. Đó là bởi vì tôi đã sử dụng tableHeaderViewtài sản không chính xác. Đã sửa lỗi đó bằng cách thêm:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))

Làm việc cho tôi cho Swift 4.2. Cảm ơn
Sylar

Đã thử mọi thứ trong trang này, đối với chế độ xem bảng được nhóm của iOS13 với chế độ xem tiêu đề. self.tableView.tableHeaderView = UIView (khung: CGRect (x: 0, y: 0, width: tableView.frame.size. thong, height: 0.01)). đã khắc phục sự cố.
Ning

7

Mã Swift 4: Đối với chế độ xem bảng không có tiêu đề phần, bạn có thể thêm mã này:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

và bạn sẽ nhận được khoảng cách tiêu đề là 0.

Nếu bạn muốn một tiêu đề về chiều cao cụ thể của bạn vượt qua giá trị đó:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

và chế độ xem từ đại biểu viewForHeaderinSection.


Điều này không trả lời câu hỏi. Câu hỏi là về khoảng cách thêm đến từ đâu, không phải làm thế nào để thoát khỏi nó.
Stephen Newell

Điều kỳ lạ là nếu bạn trả về 0 trong heightForHeaderInsection, bạn vẫn có thêm không gian này. Nó hoạt động hoàn hảo với CGFloat.leastN normalMagnitude (số dương ít nhất)
ShadowToD 17/03/19

7

Để cụ thể, để loại bỏ không gian bảngviewHead khỏi đầu tôi đã thực hiện những thay đổi sau:

YouStoryboard.storyboard> YouViewControll> Chọn TableView> Trình kiểm tra kích thước> Bộ nội dung - Đặt thành không bao giờ.

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


Thông tin bổ sung nào khác ngoài ảnh chụp màn hình so với câu trả lời này ?
Artjom B.

Tôi đoán giống như vậy, tôi đã không tìm thấy câu trả lời đó khi tôi đang tìm giải pháp. Tôi có nên xóa câu trả lời của mình không ..?
dùng832

Không phải nếu bạn có thể mở rộng một chút về câu trả lời của mình bằng cách mô tả lý do tại sao Content insets = Chưa bao giờ thực sự giải quyết vấn đề này (tùy chọn này hoạt động như thế nào?).
Artjom B.

Khi nội dung được đặt thành không bao giờ, bảngView sẽ không cuộn lên khi chỉnh sửa textField.
mojtaba al moussawi

6

sử dụng cái này tôi nghĩ cái này giúp ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }

1
Xuất sắc! Hoạt động như một bùa mê trong iOS 9.2. Câu trả lời này là hoàn hảo vì trong một số trường hợp tôi cần phải loại bỏ tiêu đề đầu tiên trong khi trong những trường hợp khác cho thấy nó. Tôi thấy một câu trả lời khác sử dụng CGFloat.min, nó cũng hoạt động. Vì vậy, viewContoder của tôi hiện có thể cung cấp một số thực như 44.0 hoặc về cơ bản là 0.
David H

6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }

tự độngAdjustScrollViewInsets = công việc sai từ tôi! Cám ơn!
Daniel Kuta
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.