iOS 7: UITableView hiển thị dưới thanh trạng thái


219

Màn hình đầu tiên của ứng dụng của tôi là UITableViewControllerkhông có thanh điều hướng, có nghĩa là nội dung chảy dưới thanh trạng thái nên có rất nhiều xung đột văn bản. Tôi đã điều chỉnh cả hai thuộc tính cho Under top barsAdjust scroll view insetsthực sự ngăn không cho nó cuộn xuống, nhưng với chi phí giữ đầu bảng xem bên dưới. Tôi đã cố gắng đặt UITableViewkhung hình để bù 20 pixel, nhưng nó dường như không có hiệu lực và vì hiện tại tôi cần ứng dụng tương thích với iOS 6, tôi không thể chuyển sang Bảng phân cảnh iOS 7 để buộc tự động sử dụng hướng dẫn chiều cao hàng đầu. Có ai tìm thấy một giải pháp hoạt động cho cả hai phiên bản?

Những điều tôi đã thử: cài đặt edgesForExtendedLayout, thay đổi cài đặt trong Storyboard cho Under top barsAdjust scroll view, buộc khung hình sang một khu vực mới.

Một bưc tranh đang gia ngan lơi noi: Thanh trạng thái chảy dưới


2
Cách xử lý nhanh có thể là thêm tiêu đề 20 pixel trống vào bảng khi chạy trên iOS 7.
EricS

@EricS: Tôi đã có một UITableViewtiêu đề trong đó, nó cũng chảy dưới thanh trạng thái.
Nicholas Smith

Tại sao không sử dụng hướng dẫn bố cục tự động trên iOS 6? Nó hoạt động.
Steven Fisher

Câu trả lời:


366

Đối với bất kỳ ai quan tâm đến việc nhân rộng này, chỉ cần làm theo các bước sau:

  1. Tạo một dự án iOS mới
  2. Mở bảng phân cảnh chính và xóa mặc định / ban đầu UIViewController
  3. Kéo ra một cái mới UITableViewControllertừ Thư viện đối tượng
  4. Đặt nó làm trình điều khiển xem ban đầu
  5. Cung cấp cho bảng một số dữ liệu thử nghiệm

Nếu bạn làm theo các bước trên, khi bạn chạy ứng dụng, bạn sẽ thấy không có gì, kể cả điều chỉnh các hộp kiểm của Xcode thành "Mở rộng Edges Under {Top, bottom, Opaque} Bars" để ngăn hàng đầu tiên xuất hiện dưới thanh trạng thái, Bạn cũng không thể giải quyết vấn đề này theo chương trình.

Ví dụ: Trong kịch bản trên, những điều sau đây sẽ không có hiệu lực:

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

Vấn đề này có thể rất bực bội và tôi tin rằng đó là một lỗi ở phần cuối của Apple, đặc biệt là vì nó xuất hiện trong chính tiền điện tử UITableViewControllercủa họ từ thư viện đối tượng.

Tôi không đồng ý với tất cả những người đang cố gắng giải quyết vấn đề này bằng cách sử dụng bất kỳ hình thức "Số ma thuật" nào, ví dụ: "sử dụng đồng bằng 20px". Kiểu lập trình kết hợp chặt chẽ này chắc chắn không phải là điều Apple muốn chúng ta làm ở đây.

Tôi đã phát hiện ra hai giải pháp cho vấn đề này:

  • Giữ nguyên UITableViewControllercảnh của :
    Nếu bạn muốn giữ UITableViewControllerbảng phân cảnh, mà không đặt thủ công vào chế độ xem khác, bạn có thể nhúng UITableViewControllervào UINavigationController(Trình chỉnh sửa> Nhúng vào> Trình điều khiển Điều hướng) và bỏ chọn "Hiển thị Thanh điều hướng" trong trình kiểm tra . Điều này giải quyết vấn đề mà không cần chỉnh sửa thêm, và nó cũng giữ nguyên UITableViewControllercảnh của bạn trong bảng phân cảnh.

  • Sử dụng AutoLayout và nhúng UITableViewvào chế độ xem khác (tôi tin rằng đây là cách Apple muốn chúng tôi làm điều này) :
    Tạo một sản phẩm trống UIViewControllervà kéo bạn UITableViewvào đó. Sau đó, Ctrl-kéo từ của bạn UITableViewvề phía thanh trạng thái. Khi chuột ở dưới cùng của thanh trạng thái, bạn sẽ thấy bong bóng Tự động xóa có nội dung "Hướng dẫn bố cục hàng đầu". Nhả chuột và chọn "Khoảng cách dọc". Điều đó sẽ cho hệ thống bố trí đặt nó ngay bên dưới thanh trạng thái.

Tôi đã thử cả hai cách trên một ứng dụng trống và cả hai đều hoạt động. Bạn có thể cần phải thực hiện một số điều chỉnh bổ sung để làm cho chúng hoạt động cho dự án của bạn.


5
FYI, tùy chọn 1 (nhúng trong bộ điều khiển điều hướng) dẫn đến các ô được hiển thị phía sau thanh trạng thái mờ khi bạn cuộn qua bảng.
RyanR

4
@RyanR Tôi cũng nhận thấy điều đó, nhưng tôi nghĩ rằng nó ổn ở một số điểm. Apple đã làm điều tương tự trong chế độ xem tab đã mở của Safari trên thiết bị di động, các tab sẽ được hiển thị bên dưới thanh trạng thái. Giải pháp điều khiển điều hướng là cách giải quyết đơn giản nhất, tôi root cho nó. Tuy nhiên, thanh trạng thái mờ là một ý tưởng ngu ngốc.
Tự hào Chung

6
Khi tôi thực hiện thao tác kéo điều khiển từ chế độ xem bảng lên, tôi không bao giờ chạy vào thanh trạng thái. Không có thanh trạng thái hiển thị trong chế độ xem, không chắc ý của bạn ở đây ...
Jesse

4
Tùy chọn 2 không còn hoạt động trong Xcode 5. Hành động được mô tả (kéo ctrl) sẽ không bao giờ hoạt động, vì đó thuộc sở hữu của hệ thống Outlets, nhưng ngay cả khi bạn kéo thủ công vào Cây cảnh bên trái, hướng dẫn bố cục trên cùng KHÔNG LÀM VIỆC (nó nên làm, AFAICT - Tôi tin rằng đây vẫn là một lỗi lớn khác trong AutoLayout :( :()
Adam

3
@PrideChung có vẻ ngu ngốc khi sử dụng một tiêu đề với chế độ xem bảng, tiêu đề được cố định ở trên cùng và các phần tử sẽ biến mất phía sau - và xuất hiện phía sau thanh trạng thái trong suốt ...
Ixx

86

Nếu bạn đang làm mọi thứ theo chương trình và đang sử dụng UITableViewControllermà không cần UINavigationControllerđặt cược tốt nhất của bạn là thực hiện như sau viewDidLoad:

Swift 3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

Swift sớm hơn

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);

Di UITableViewControllerchúc vẫn sẽ di chuyển phía sau thanh trạng thái nhưng sẽ không nằm dưới thanh đó khi cuộn lên trên cùng.


1
Bạn có thể thêm một kiểm tra cho phiên bản HĐH> 7 và cũng hỗ trợ các HĐH cũ hơn (không có nội dung nào cho các hệ điều hành đó). Nếu không, điều này làm việc tốt cho mục đích của tôi.
Simps Offer

8
Giá trị chiều cao mã hóa không phải là ý tưởng tốt nhất.
Maciej Kozieł

3
Có, sử dụng topLayoutGuidechiều dài thay thế.
lipka

10
Tôi sẽ sử dụng UIApplication.sharedApplication.statusBarFrame.size.heightthay vì 20.
mojuba

Điều đó đã được cập nhật lên UIApplication. Shared.statusBarFrame.size.height những ngày này.
asetniop

23

Xin lưu ý: Điều này làm việc cho tôi cho cấu hình sau:

  • Không có thanh điều hướng ở phía trên màn hình (chế độ xem bảng đáp ứng thanh trạng thái)
  • Chế độ xem bảng không thể cuộn

Nếu hai yêu cầu trên không đáp ứng được, bạn có thể thay đổi.

Bài gốc

Tôi đã tạo ra quan điểm của mình theo lập trình và điều này đã kết thúc với tôi:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

Nguồn (trong phần topLayoutGuide ở cuối trang 39).


Thật thú vị ... Tôi đã có thể gọi nó như vậy trong dự án của mình mà không có vấn đề gì ... Tôi có thể có cấu trúc bố cục xem đơn giản hơn bạn đã làm. Đề nghị của bạn là chính xác, tôi sẽ thực hiện thay đổi đó trong câu trả lời của tôi.
Stunner

Tôi tình cờ vấp phải vấn đề khi tôi xoay ứng dụng của mình. Nếu bạn bị vô hiệu hóa vòng quay, bạn có thể sẽ không gặp vấn đề gì.
Jeremy

Tôi không kích hoạt xoay vòng trong dự án của mình và tôi đã gặp phải vấn đề, nhưng vâng, vẫn là một điểm tốt.
Stunner

1
Đối với bất kỳ ai thực hiện bộ điều khiển Container của riêng họ, đây là cách điều chỉnh chính xác cho trạng thái hoặc thanh điều hướng nằm dưới!
Rafael Nobre

Nếu bạn thay đổi điểm gốc, nhưng không phải là chiều cao của giới hạn lượt xem, phần dưới cùng sẽ không bị cắt bởi cạnh dưới của màn hình bằng số tiền bạn đã thay đổi điểm gốc? (vì vậy không thể nhìn thấy một vài pixel cuối cùng)
Tenfour04

20

Thêm vào câu trả lời hàng đầu:

Sau khi phương pháp thứ 2 ban đầu có vẻ không hiệu quả, tôi đã thực hiện một số sửa đổi bổ sung và đã tìm ra giải pháp.

TLDR; Giải pháp thứ 2 của câu trả lời hàng đầu gần như hoạt động, nhưng đối với một số phiên bản của xCode ctrl + kéo đến "Hướng dẫn bố cục hàng đầu" và chọn Khoảng cách dọc không làm gì cả. Tuy nhiên, trước tiên, bằng cách điều chỉnh kích thước của Chế độ xem bảng và sau đó chọn "Hướng dẫn bố trí không gian trên cùng trên cùng"


  1. Kéo một ViewContoder trống vào bảng phân cảnh. Xem bộ điều khiển

  2. Kéo một đối tượng UITableView vào View. (Không phải UITableViewControll). Đặt nó ở chính giữa bằng cách sử dụng các hướng dẫn bố trí màu xanh.

Xem bảng Hình ảnh trung tâm

  1. Kéo một UITableViewCell vào TableView. Đây sẽ là ô tái sử dụng nguyên mẫu của bạn, vì vậy đừng quên đặt Mã nhận dạng tái sử dụng trong tab Thuộc tính hoặc bạn sẽ gặp sự cố.

Thêm ô xem bảng Tái sử dụng định danh

  1. Tạo lớp con tùy chỉnh của bạn UIViewControll và thêm các <UITableViewDataSource, UITableViewDelegate>giao thức. Đừng quên đặt ViewContoder của bảng phân cảnh của bạn vào lớp này trong Trình kiểm tra danh tính.

  2. Tạo một lối thoát cho TableView trong tệp thực hiện của bạn và đặt tên là "tableView"

Tạo ổ cắm bảng xem

  1. Nhấp chuột phải vào TableView và kéo cả dataSource và đại biểu vào ViewContoder của bạn.

đại biểu nguồn dữ liệu

Bây giờ cho phần không cắt vào thanh trạng thái.

  1. Lấy cạnh trên của Chế độ xem bảng của bạn và di chuyển nó xuống một trong các hướng dẫn bố cục tự động màu xanh nét đứt nằm gần trên cùng

thay đổi kích thước

  1. Bây giờ, bạn có thể điều khiển kéo từ Chế độ xem bảng lên trên cùng và chọn Hướng dẫn không gian hàng đầu lên trên

Hướng dẫn không gian hàng đầu đến bố cục hàng đầu

  1. Nó sẽ cung cấp cho bạn một lỗi về bố cục mơ hồ của TableView, chỉ cần thêm các ràng buộc thiếu và bạn đã hoàn thành.

Thêm các ràng buộc thiếu

Bây giờ bạn có thể thiết lập chế độ xem bảng của mình như bình thường và nó sẽ không cắt thanh trạng thái!


11
- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/l Library / ios / document / userexperience / conconual / TraitionGuide / SupportingEarlieriOS.html # / // num_Vf / doc / uid / TP40013174-CH14-SS1


2
chuyển <= sang> và xóa khối if nếu trống
pfrank

1
Đọc self.topLayoutGuide.lengthtừ viewDidLayoutSubviewssẽ làm hỏng bố cục của quan điểm trẻ em.

@OLzh trong khi làm như bạn mô tả, self.tableView không thể cuộn.
DawnSong 6/03/2015

8

Chọn UIViewControll trên bảng phân cảnh của bạn một tùy chọn bỏ chọn Mở rộng các cạnh bên dưới các thanh trên cùng. Đã làm cho tôi. :)


Than ôi, đã không làm việc cho tôi. Hoàn toàn mặc định UITableViewCont kiểm soát vẫn chồng lấp thanh trạng thái. Tôi không nghĩ thanh trạng thái được tính là Top Bar. Chỉ cần thanh điều hướng và thanh tab.
Andrew Duncan

Giải pháp duy nhất phù hợp với tôi, ty. (Lưu ý bạn phải "rút ngắn" chế độ xem bảng dưới thanh trạng thái trong IB và các ràng buộc cập nhật).
Martin Makarsky

Đã làm việc với tôi trên Xcode 8 với UITableViewControll.
Edouard Barbier

8

Đây là cách viết nó trong "Swift" Điều chỉnh câu trả lời của @ lipka:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)

Không được phép nhanh chóng ở đây?
uplearnedu.com 14/1/2015

Giải pháp duy nhất hiệu quả với tôi, điều đó không khiến tôi tạo ra một UIVIewControll
Shereef Marzouk

1
Điều này ít hơn lý tưởng bởi vì nó giữ mức cao nhất ở mức 20, ngay cả trong phong cảnh nơi không có thanh trạng thái mặc định trong ios8
voidref 8/03/2015

Biến thể này xử lý tốt mọi cấu hình đối với tôi:- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
qix

5

Đối với Xcode 7, bỏ chọn dấu kiểm 'mờ' cho Thanh điều hướng làm việc cho tôi.

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


Đơn giản nhất, nhanh nhất, dễ nhất, an toàn nhất? giải pháp. Không biết tại sao điều này có quá ít upvote so với mọi thứ khác.
Gruntcakes

3

Điều này sẽ sửa nó cho một UITableViewControll (không có bất kỳ số ma thuật nào). Điều duy nhất tôi không thể sửa nó là nếu bạn đang thực hiện một cuộc gọi điện thoại, trong trường hợp đó, phần trên cùng của bảngView bị đẩy xuống quá nhiều. Nếu bất cứ ai biết làm thế nào để giải quyết điều đó, xin vui lòng cho chúng tôi biết.

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()    
        configureTableViewTop()
    }

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition({ (context) -> Void in
            }, completion: { (context) -> Void in
                self.configureTableViewTop()
        })
    }

    func configureTableViewTop() { 
        tableView.contentInset.top = UIApplication.sharedApplication().statusBarFrame.height
    }
}

2

Tôi không biết Kosher là như thế nào, nhưng tôi thấy rằng lược đồ này di chuyển khung nhìn của ViewContoder xuống và cung cấp thanh trạng thái với một nền tảng vững chắc:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Shove everything down if iOS 7 or later
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0f) {

        // Move the view down 20 pixels
        CGRect bounds = self.view.bounds;
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];

        // Create a solid color background for the status bar
        CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
        UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
        statusBar.backgroundColor = [UIColor redColor];
        [self.view addSubview:statusBar];
    }

Tất nhiên, thay thế redColorbằng bất kỳ màu nào bạn muốn cho nền.

Bạn phải thực hiện riêng một trong các swizzles để đặt màu của các ký tự / ký hiệu trong thanh trạng thái. Tôi sử dụng View controller-based status bar appearance = NOStatus bar style = Opaque black styletrong phần chính, để làm điều này trên toàn cầu.

Có vẻ như để làm việc, và tôi rất muốn nghe về bất kỳ lỗi hoặc vấn đề với nó.


2

Câu trả lời của chappjc hoạt động rất tốt khi làm việc với XIB.

Tôi đã tìm thấy giải pháp sạch nhất khi tạo TableViewControllers bằng lập trình bằng cách gói đối tượng UITableViewControll trong một UIViewControll khác và đặt các ràng buộc tương ứng.

Đây là:

UIViewController *containerLeftViewController = [[UIViewController alloc] init];
UITableViewController *tableViewController = [[UITableViewController alloc] init];

containerLeftViewController.view.backgroundColor = [UIColor redColor];

hostsAndMoreTableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[containerLeftViewController.view addSubview:tableViewController.view];

[containerLeftViewController addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:containerLeftViewController];

NSDictionary * viewsDict = @{ @"tableView": tableViewController.view ,
                              @"topGuide": containerLeftViewController.topLayoutGuide,
                              @"bottomGuide": containerLeftViewController.bottomLayoutGuide,
                              };
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide][tableView][bottomGuide]"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];

Chúc mừng, Ben


1

Tôi nghĩ rằng cách tiếp cận để sử dụng UITableViewControll có thể hơi khác một chút so với những gì bạn đã làm trước đây. Nó đã làm việc cho tôi, nhưng bạn có thể không phải là một fan hâm mộ của nó. Những gì tôi đã làm là có một bộ điều khiển xem với chế độ xem container trỏ đến UItableViewControll của tôi. Bằng cách này, tôi có thể sử dụng TopLayoutGuide được cung cấp cho bảng phân cảnh của mình. Chỉ cần thêm các ràng buộc vào chế độ xem container và bạn sẽ được chăm sóc cho cả iOS7 và iOS6.


1

Tôi đã kết thúc bằng cách sử dụng một chế độ xem thêm với nền mong muốn, được thêm sau TableView và được đặt dưới thanh trạng thái:

    self.CoverView = [[UIView alloc]init];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

    self.CoverView.frame = CGRectMake(0,0,self.view.bounds.size.width,20);
    }

    self.CoverView.backgroundColor = [UIColor whiteColor];
    self.TableView = [[UITableView alloc]initWithFrame:CGRectMake(0,
    self.CoverView.bounds.size.height,XXX, YYY)];
    [self.view addSubview:self.TableView];
    [self.view addSubview:self.CoverView];

Nó không đẹp lắm, nhưng đó là giải pháp khá đơn giản, nếu bạn cần làm việc với các chế độ xem không có xib và cả IOS6 và IOS7


1

Tôi đã thực hiện điều này cho màn hình Retina / Non-Retina như

BOOL isRetina = FALSE;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}

if (isRetina) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}

1

Giải pháp sau đây hoạt động đủ tốt trong mã mà không cần sử dụng các hằng số ma thuật và tài khoản cho người dùng thay đổi lớp kích thước, ví dụ như thông qua các phép quay hoặc ứng dụng phụ trên ipad:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // Fix up content offset to ensure the tableview isn't underlapping the status bar.
    self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0);
}

1

Hoạt động cho swift 3 - Trong viewDidLoad ();

let statusBarHeight = UIApplication.shared.statusBarFrame.height

let insets = UIEdgeInsets(top: statusBarHeight, left: 0, bottom: 0, right: 0)
tableView.contentInset = insets
tableView.scrollIndicatorInsets = insets

Mã này: 1. Lấy chiều cao của thanh trạng thái 2. Cung cấp phần trên cùng của bảng để xem nội dung bằng với chiều cao của thanh trạng thái. 3. Cung cấp cho chỉ báo cuộn cùng một hình nhỏ, để nó xuất hiện bên dưới thanh trạng thái.


1

Đối với những người như tôi, những người không muốn nhúng chúng UITableViewControllervào UIViewControllerthử:

Một UITableViewControllerlớp con tùy chỉnh có thể nối thêm khung nhìn mặt nạ vào giám sát của bảngView. Thêm mặt nạ trên viewDidAppear và xóa mặt nạ trên viewWillDisappear.

private var statusBarMaskView: UIView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let superview = self.tableView.superview {
        self.statusBarMaskView = UIView(frame: CGRect.zero)
        superview.insertSubview(self.statusBarMaskView, aboveSubview: self.tableView)
        self.statusBarMaskView.backgroundColor = self.tableView.backgroundColor

        // using a nice constraint layout library to set the frame
        self.statusBarMaskView.pinTop(to: superview)
        self.statusBarMaskView.pinLeft(to: superview)
        self.statusBarMaskView.pinRight(to: superview)
        self.statusBarMaskView.addHeightConstraint(with: 22.0)
        ////
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.statusBarMaskView.removeFromSuperview()
    self.statusBarMaskView = nil
}

0

Tôi đã có một UISearchBar ở đầu UITableView của tôi và sau đây đã hoạt động;

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

Chia sẻ và tận hưởng...



0

Giải pháp của Abrahamchez https://developer.apple.com/l Library / ios / qa / 977 / _index.html đã làm việc cho tôi như sau. Tôi đã có một bộ điều khiển UITableview như là quan điểm ban đầu của tôi. Tôi đã thử mã bù và nhúng vào một điều hướng nhưng không giải quyết được tính minh bạch của thanh trạng thái.

Thêm một Trình điều khiển và làm cho nó xem ban đầu. Điều này sẽ cho bạn thấy Hướng dẫn bố trí trên & dưới quan trọng.

Kéo Tableview cũ vào View trong bộ điều khiển mới.

Thực hiện tất cả các công cụ để trang bị thêm bảng vào bộ điều khiển mới:

Thay đổi tập tin view.h cũ của bạn thành kế thừa / lớp con từ UIViewControll thay vì UITableViewCont điều khiển.

Thêm UITableViewDataSource và UITableViewDelegate vào .h.

Kết nối lại bất cứ thứ gì cần thiết trong bảng phân cảnh, chẳng hạn như Thanh tìm kiếm.

Điều quan trọng là để có được các ràng buộc được thiết lập, như trong Hỏi & Đáp của Apple. Tôi không buồn chèn một thanh công cụ. Không nhất định trình tự chính xác. Nhưng một biểu tượng màu đỏ xuất hiện trên Hướng dẫn bố cục, có lẽ khi tôi xây dựng. Tôi đã nhấp vào nó và để Xcode cài đặt / dọn dẹp các ràng buộc.

Sau đó, tôi nhấp vào mọi nơi cho đến khi tôi tìm thấy ràng buộc Không gian dọc và thay đổi giá trị hàng đầu của nó từ -20 thành 0 và nó hoạt động hoàn hảo.


0

Tôi đang sử dụng một UISplitViewControll với bộ điều khiển điều hướng và bộ điều khiển xem bảng. Điều này làm việc cho tôi trong chế độ xem chính sau khi thử nhiều giải pháp ở đây:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {

    // Move the view down 20 pixels
    CGRect bounds = self.view.bounds;
    bounds.origin.y -= 20.0;
    [self.navigationController.view setBounds:bounds];

    // Create a solid color background for the status bar
    CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor whiteColor];
    [statusBar setAlpha:1.0f];
    [statusBar setOpaque:YES];
    [self.navigationController.view addSubview:statusBar];
}

Nó tương tự như giải pháp của Hot Licks nhưng áp dụng chế độ xem phụ cho navigationContoder.


Đây là câu trả lời duy nhất đã làm việc cho tôi trong iOS 8!
SamB

0
override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}

0

Đây là Swift 2.3. Giải pháp (Xcode 8.0). Tôi đã tạo một lớp con của UITableView.

class MYCustomTableView: UITableView
{   
    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        contentInset    = UIEdgeInsetsZero
    }
}

Nội dung Inset phải luôn là Zero (theo mặc định). Tôi đang cài đặt Zero bằng tay. Bạn cũng có thể thêm một phương thức kiểm tra để thực hiện kiểm tra và nếu đó là bất cứ điều gì khác ngoài những gì bạn muốn thì chỉ cần lấy đúng. Thay đổi sẽ chỉ phản ánh khi bảng xem được vẽ (điều này không xảy ra thường xuyên).

Đừng quên cập nhật TableView trong IB của bạn (trong TableViewContaptor hoặc chỉ TableView bên trong ViewContoder của bạn).


0

Tôi đã phải đối mặt với vấn đề này trong ios 11 nhưng bố cục đã đúng cho ios 8 - 10.3.3. Đối với trường hợp của tôi, tôi đặt ràng buộc không gian theo chiều dọc thành Superview.Top Margin thay vì Superview.Top hoạt động cho ios 8-11.

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


0

Tôi đã tìm thấy cách dễ nhất để làm điều này, đặc biệt nếu bạn thêm chế độ xem bảng của mình bên trong thanh tab là trước tiên thêm chế độ xemsau đó thêm chế độ xem bảng bên trong chế độ xem đó . Điều này cung cấp cho bạn các hướng dẫn lề hàng đầu mà bạn đang tìm kiếm.

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


-1

xem tất cả các giải pháp: dự án của tôi chỉ sử dụng xib, vì vậy, giải pháp với bảng phân cảnh không hiệu quả với tôi. self.edgesForExtendsLayout = UIRectEdgeNone; chỉ hoạt động cho bộ điều khiển nếu thanh điều hướng hiển thị. nhưng nếu chế độ xem của bạn chỉ có thanh trạng thái, điều đó sẽ không hoạt động. vì vậy tôi kết hợp hai conditons.

- (void) viewDidLayoutSubviews {
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {
    CGRect bounds = self.view.bounds;
    if(self.navigationController == nil || self.navigationController.isNavigationBarHidden == YES){
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];
    }
    else{
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }
}

giúp việc này


-2

Nếu bạn cũng cần hỗ trợ iOS 6, bạn sẽ phải di chuyển nó xuống một cách có điều kiện. Nghĩa là, trong iOS 7, bạn chỉ cần di chuyển nó xuống 20 điểm (thông qua framethao tác hoặc sử dụng bố cục tự động) và trong iOS 6, bạn để nó một mình. Tôi không tin rằng bạn có thể làm điều này trong IB, vì vậy bạn sẽ phải làm điều đó bằng mã.

BIÊN TẬP

Bạn thực sự có thể làm điều này trong IB, bằng cách sử dụng đồng bằng iOS6 / iOS7. Đặt vị trí của bạn trong iOS 7, sau đó đối với iOS 6, đặt delta Y thành -20 điểm. Xem câu hỏi SO này để biết thêm thông tin.


Đặt khung xuống không làm thay đổi nó không may.
Nicholas Smith

Điều gì không làm việc về nó? Chế độ xem bảng không di chuyển xuống?
Scott Berrevoets

Vâng, nó vẫn ở vị trí tương tự. Tôi đã thử self.view.frameself.tableView.frame, trong cả hai viewWillAppearviewDidLoad. Để an toàn tôi cũng thiết lập setContentNeedsDisplayđể buộc vẽ lại.
Nicholas Smith

Là tự động bố trí?
Scott Berrevoets

Vâng, đó là autolayout và Storyboard.
Nicholas Smith
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.