UITableView đang bắt đầu với phần bù trong iOS 7


115

Tôi đã kéo một UITableView jane đơn giản vào một UIViewControll trong iOS 7.

Bây giờ có một khoảng trống dọc của không gian trước khi ô đầu tiên bắt đầu. Làm sao để tôi bỏ nó đi? Tôi muốn dòng đầu tiên gần hơn với cạnh trên cùng của nơi UITableView thực sự bắt đầu. Tôi không yêu cầu bù đắp lớn phải không?

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

Có ý kiến ​​gì không?


43
Tôi đã được trợ giúp bởi những điều sau đây: 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.
Alexander

17
btw, bạn có thể chụp ảnh màn hình Trình mô phỏng iOS bằng phím Command + S
Hemang

@Alexander: Tôi cũng được giúp đỡ với các đề xuất của bạn, tuy nhiên việc bỏ chọn ExtendEdges.UnderTopBars lại khiến không gian bù dọc xuất hiện. Tôi không chắc liệu đây có phải là một trong (nhiều?) Lỗi trong Xcode6 không, nhưng thỉnh thoảng những vấn đề này khiến tôi khá đau đầu!
iOS

Câu trả lời:


81

Theo mặc định, bộ điều khiển xem bảng sẽ đệm nội dung xuống dưới thanh điều hướng để bạn có thể cuộn nội dung bên dưới và xem nó, ở trạng thái mờ, bên dưới thanh điều hướng / thanh công cụ.

Có vẻ như bạn đang định vị nó ở mức 44 (có thể là 64) px để di chuyển nó ra khỏi dưới thanh điều hướng, nhưng nó đã bù đắp cho điều này để bạn có một khoảng cách lớn.

Chuyển đến bảng phân cảnh / xib trong IB và bỏ chọn nội dung hiển thị dưới nội dung thanh điều hướng.


6
Xin lỗi, nhận xét về NDA trên iOS7 không liên quan như thế nào? Đây là một diễn đàn để giúp mọi người.
Cocoadelica

Trong Xcode Phiên bản 5.1 trên Trình điều khiển View, bỏ chọn các cạnh mở rộng> Bên dưới các thanh trên cùng để xóa phần nội dung UITableView hàng đầu
Emel Elias

3
Vì vậy, đâu là nội dung hiển thị dưới thanh thigo nav? Tôi không thể tìm thấy nó.
Anup Kattel

10
@FrankGorman trong Xcode 5.1.1 có một tùy chọn trong bảng phân cảnh cho trình điều khiển chế độ xem cụ thể là Adjust Scroll View insetsxóa dấu tích.
Hàn Quốc prashant

1
này @koratprashant. bình luận rất hữu ích.
KDeogharkar

107

Việc triển khai UIViewControll trên iOS 7 mới có một bộ tùy chọn mới cho phép nhà phát triển lựa chọn nếu hệ thống sẽ tự động thêm các phần tử cho UIScrollView , UITableView và các dẫn xuất.

Để vô hiệu hóa hành vi này, bỏ chọn các hộp này cho tất cả các UIViewControllers mong muốn của bạn trong InterfaceBuilder, trên trình kiểm tra đối tượng được chọn của UIViewContoder :

Xem thanh tra điều khiển

Để biết thêm chi tiết:

  1. Gửi ứng dụng iOS 7 của bạn ngay hôm nay.
  2. Hướng dẫn chuyển đổi giao diện người dùng iOS 7> Ngoại hình và hành vi

Cảm ơn! Bạn đã cứu tôi.
rsc

68

Từ hướng dẫn chuyển đổi iOS7:

Nếu bạn không muốn các bộ chèn nội dung của chế độ xem cuộn được tự động điều chỉnh, hãy đặt tự độngAdjustScrollViewInsets thành NO. (Giá trị mặc định của tự độngAdjustScrollViewInsets là CÓ.)

   self.automaticallyAdjustsScrollViewInsets = NO;

9
Điều này cũng có thể được đặt trong XCode trên trình kiểm tra thuộc tính. Bỏ chọn Adjust Scroll View Insetshộp kiểm cho bố trí trình điều khiển xem.
Andrew

1
Nếu bạn tải UIViewControll theo chương trình (không sử dụng XIB) thì cái này hoạt động như một lá bùa. Đặt automaticallyAdjustsScrollViewInsets = NOtrong bộ điều khiển xem.
KabraBoja

Đây là nó cho tôi. Nhầm lẫn vì TableView của tôi nằm trong chế độ xem container và ban đầu có vẻ ổn. Nhưng nó đã bị hỏng khi bật trở lại từ một bộ điều khiển xem khác.
n13

Tuyệt quá! Tiết kiệm cho tôi rất nhiều thời gian!
inix

34

tôi đã gặp một vấn đề tương tự, sau khi loại bỏ viewContoder, nội dung Offerset từ bảngView của tôi đã được đổi thành (0, -64).

Giải pháp của tôi hơi kỳ lạ, tôi đã thử tất cả các câu trả lời khác nhưng không thành công, điều duy nhất khắc phục vấn đề của tôi là chuyển vị trí bảngView trong cây điều khiển của .xib

đó là điều khiển đầu tiên trong phần Xem cha mẹ như thế này:

trước

Tôi đã di chuyển bảngView ngay sau ImageView và nó hoạt động:

sau

có vẻ như việc đặt chế độ xem bảng ở vị trí đầu tiên đã gây ra sự cố và việc chuyển chế độ xem bảng sang vị trí khác đã khắc phục sự cố.

PD Tôi không sử dụng autoLayout cũng không phải bảng phân cảnh

hy vọng điều này có thể giúp ai đó!


Tôi đa ghi chu điêu tương đương! Tôi không đặt bất kỳ chế độ xem bổ sung nào, nhưng đơn giản bù lại khoảng cách di chuyển đỉnh UITableView -44. Trong IB có vẻ như tôi phải di chuyển -64px, nhưng trong thời gian chạy -64px khiến tablview che phủ thanh điều hướng và -44px là OK. Tôi không thể giải thích nó. Tôi đã tìm thấy vấn đề này trong chế độ xem popover của iPad, khi tôi không nhận thấy bất kỳ vấn đề tương tự nào trong bảng phân cảnh iPhone.
Mike Keskinov

Vấn đề này phát sinh ngay cả với uiview. nếu chế độ xem hiển thị trong giao diện người dùng được đặt không theo cùng một thứ tự.
Rinku

2
Tôi đã có cùng một vấn đề ngày hôm nay, với XCode 6.1. Phấn hoa thêm 2-3 giờ lãng phí, cố gắng khắc phục lỗi của Apple ...
Mike Gledhill

3
Điều này là vô cùng hữu ích và đáng được chú ý hơn! Không có vấn đề gì với cài đặt bộ điều khiển chế độ xem hoặc phần bù / bù nội dung được trợ giúp, nhưng việc thay đổi thứ tự các khung nhìn trong bảng phân cảnh đã giải quyết vấn đề cho tôi.
Caleb

1
Apple, ý tôi là ... WTF? Cảm ơn người đàn ông, điều này cũng cố định bảng phân cảnh với autolayout.
Borzh

30

nó giải quyết vấn đề tương tự của tôi:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}

1
Bạn nên kiểm tra phiên bản hệ thống theo cách này bằng cách sử dụng:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
RCkoenes

Điều này làm việc cho tôi về vấn đề khoảng cách tôi gặp phải nhưng bây giờ trình điều khiển kéo để làm mới của tôi hiển thị bị che khuất một phần & bên dưới menu trên cùng của tôi. Có ai thấy cái này không? Bất kỳ cách giải quyết?
Nick

@ nickv2002 hãy thử tạo bảng Xem theo chương trình
Alex

Tôi đã thử tất cả các giải pháp khác nhưng chỉ có giải pháp này hiệu quả với tôi
DanielR

13

Hãy thử sử dụng cái này

tableView.separatorInset = UIEdgeInsetsZero;

Rõ ràng, nếu bạn hỗ trợ bất cứ điều gì ít hơn iOS7, bạn sẽ cần đảm bảo rằng đối tượng phản hồi với bộ chọn này trước khi gọi nó.


4
không chắc chắn lý do tại sao điều này được bỏ phiếu ... separatorInset chỉ thay đổi các khoảng cách giữa các ô được chèn từ cạnh của khung nhìn. Câu hỏi là hỏi về không gian bên trên và bên dưới các tế bào
Rembrandt Q. Einstein

Hình ảnh gây hiểu lầm, nhưng một tìm kiếm phổ biến của google cho vấn đề lề mang lại trang này.
Sẽ

9

Nghiêm túc mà nói, thay đổi contentOffsetkhông phải là giải pháp. Bạn chỉ đang khắc phục một vấn đề và không khắc phục nguyên nhân. Tôi đã phải đối mặt với cùng một vấn đề và hóa ra các bảng xem được nhóm lại có phần đệm ở trên cùng. Trong trường hợp của tôi, việc đặt loại thành đơn giản đã thực hiện thủ thuật.

Hy vọng nó sẽ cứu ai đó vài phút. Z.


1
Tôi đã bỏ lỡ nó hoàn toàn, rất vui vì tôi đã tìm thấy câu trả lời của bạn, UPVOTE
AamirR

8

Với iOS 9, không có câu trả lời nào khác từ trang này hoạt động với tôi (tức là bỏ chọn các hộp trong Storyboard, đặt automaticallyAdjustsScrollViewInsetsthành NO).

Cách giải quyết của tôi Tôi thực sự không hài lòng về điều này:

- (void)viewDidAppear:(BOOL)animated {
    self.tableView.contentOffset = CGPointMake(0.0, 0.0);
    self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

Các dòng tương tự trong viewWillAppearhoặc viewDidLoadkhông hiệu quả.


Đây sẽ là câu trả lời duy nhất cho uitableviewcontroll iOS 9 .... thực sự, không có gì khác giúp được, và tôi đã thử tất cả, bạn đã tìm thấy cái này ở đâu, hoặc bạn đã tìm ra nó như thế nào? nhiều 10
Erez

Bỏ chọn Adjust Scroll View insetshộp kiểm hoạt động cho iOS 9.
Adam

Điều chỉnh Scroll View insets không hoạt động cho tôi bất kỳ giải pháp nào khác?
Yogesh Patel

5

Đôi khi, tôi nhận được một 64khoảng cách chiều cao ở đầu Chế độ xem bảng của mình khi UIViewControllerđược nhúng bên trong Bộ điều khiển điều hướng.

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

Trong quá khứ, tôi sẽ chỉ tạo lại mọi thứ, hy vọng rằng các ràng buộc biến thành chính xác sau khi một bảng xếp hạng sạch sẽ.

TIL: Nếu bạn không muốn tạo một ràng buộc dọc cho Top Layout Guide, bạn có thể giữ Optionphím để truy cập Container Margin.

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

Sau đó, đảm bảo Top Space to Superviewhằng số được đặt thành 0. Điều này làm việc cho tôi ít nhất.

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


1,5 năm sau, nhưng điều đó đã giải quyết buổi tối của tôi. Cảm ơn!
asp_net

4

Cái này làm việc cho tôi:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}

2

Nếu bạn thêm một UIView trống trước UITableView (hoặc bất kỳ chế độ xem nào có thể cuộn được như ScrollView và TextView), bạn có thể gặp may mắn.


1

Tôi đã có một UITableViewControll được nhúng trong một khung nhìn container. Để loại bỏ 64 điểm không gian theo chiều dọc không mong muốn, tôi cần bỏ chọn 'Điều chỉnh các phần tử xem cuộn' trong Trình tạo giao diện và đặt nội dung của UITableView trong chế độ xem UITableViewContoder của tôi như bên dưới.

Kích thước của không gian dọc xuất hiện để khớp với chiều cao khung của thanh điều hướng và độ lệch y. Sự cố chỉ xảy ra trên iOS 7.

- (void)viewWillAppear:(BOOL)animated;
{
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        const CGRect navBarFrame = self.navigationController.navigationBar.frame;
        const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
        self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
    }
}

1

Trong Xamarin iOS, tôi đã gặp phải sự cố này trên UITableViewControll nền sau khi hộp thoại phương thức nền trước bị loại bỏ. Trong quá trình di chuyển vào nền trước, UITableViewCont kiểm soát đã được đặt bộ (ở đâu đó bởi iOS):

Lớp học này đã giải quyết nó

public class UITableViewControllerWithBugFix : UITableViewController {
    public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
    }

    public override void ViewWillLayoutSubviews() {
        if (TableView.ContentInset.Top != 0.0f)
            TableView.ContentInset = UIEdgeInsets.Zero;
        if (TableView.ScrollIndicatorInsets.Top != 0.0f)
            TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;

        base.ViewWillLayoutSubviews();
    }
}

1

Thỉnh thoảng tôi lại quay lại tình huống tồi tệ này và tôi nhận thấy rằng nó vẫn còn khá xa lạ. Vì vậy, cho trí nhớ trong tương lai ...

Gần đây, tôi đang sửa chữa với cách giải quyết này.

  1. Thêm một khung nhìn phụ ở đầu UITableView, với chiều cao pixel bằng không. Hoạt động với Autolayout hoặc không.
  2. Nếu tôi cảm thấy tự tin :-) Tôi xóa chế độ xem giả mạo này, sửa các ràng buộc ở trên cùng và thật kỳ diệu là nó hoạt động.

Đừng hỏi tôi tại sao, tôi vẫn nghĩ đó là một lỗi sâu trong UIKit.


0

Nếu bạn đi đến bảng phân cảnh, bạn có thể thay đổi phần bù bằng cách chọn bảng và bên dưới phần Chế độ xem bảng trong Trình kiểm tra thuộc tính, bạn chỉ cần thay đổi Dấu phân cách ở bên trái thành 0.


0

Tôi nghĩ rằng giải pháp thực sự là thiết lập các ràng buộc trên và dưới của bạn trên chế độ xem bảng bằng với topMargin và bottomMargin. Không phải là hướng dẫn bố trí trên cùng và hướng dẫn bố trí dưới cùng. Điều này cho phép bạn giữ tự độngAdjustScrollViewInsets là đúng.


0

Giải pháp Swift 3:

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}

0

Nếu bạn đã nhúng TableViewContaptor của mình trong NavigationContoder hoặc ContainerView , You have to constraint to margins instead of top Layout guide in Storyboard. Check constraint to margins when you are doing the constraintsKhông có cách nào khác làm việc cho tôi. Tôi không thể bình luận vì vậy tôi chỉ nhắc lại câu trả lời của Robert Chens.


0

Tôi đã thử một vài câu trả lời. Thay đổi cài đặt trong bảng phân cảnh gây ra sự cố gợn với trình đơn lớp phủ xuất hiện từ bên trái.

Tôi chỉ có một UIViewControll trống trong bảng phân cảnh, nếu không mọi thứ đều được tạo theo chương trình.

Tôi gặp vấn đề tương tự với UITableView bên trong UIView bên trong UIViewControll. Cụ thể, các tiêu đề phần bắt đầu quá xa khi UIViewContoder được nhúng trong Bộ điều khiển Điều hướng. W / o bộ điều khiển điều hướng mọi thứ hoạt động tốt.

Để khắc phục sự cố, tôi đã tạo một UILabel và với các ràng buộc đã đặt ràng buộc dưới cùng của UILabel = ràng buộc trên cùng của UIView (để nó không hiển thị trên màn hình. Bây giờ với điều khiển bổ sung (Nhãn mới), TableView hoạt động đúng.

    inputsContainerView.addSubview(titleLabel)
    inputsContainerView.addSubview(tableView)

    // inputsContainerView
    ///////////////////////////////////////
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
    inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true

    // tableView
    ///////////////////////////////////////
    tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true

    // titleLabel - inserted to stop bad section header behavior
    ///////////////////////////////////////
    titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true

0

Tôi gặp vấn đề tương tự ở iOS 11 và xib, UITableviewControll và tôi đã giải quyết nó như dưới đây

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
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.