Thanh điều hướng xuất hiện trên các chế độ xem với iOS7 SDK mới


113
CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

Trong các phiên bản trước, nó hoạt động bình thường. Thanh tìm kiếm sẽ xuất hiện bên dưới statusbarthanh điều hướng và. Các tableviewxuất hiện bên dưới thanh tìm kiếm

Nhưng khi tôi chạy tính năng này Xcode 5 sdk iOS 7, thanh tìm kiếm không hiển thị (tôi nghĩ rằng nó được đặt dưới thanh trạng thái và thanh điều hướng), và thanh điều hướng cũng xuất hiện trên chế độ xem bảng.

Nó sẽ được sửa với iOS 7bản phát hành ổn định?

Hay đó là vấn đề mã hóa của tôi?

Hay chúng ta nên xử lý nó bằng cách thêm (y = statubar height + nav bar height)giá trị y cho iOS 7?

Gần đây tôi đã tải xuống Xcode 5 DP để kiểm tra các ứng dụng của mình trong iOS 7. Điều đầu tiên tôi nhận thấy và xác nhận là giới hạn chế độ xem của tôi không phải lúc nào cũng được thay đổi kích thước để tính cho thanh trạng thái và thanh điều hướng.

Trong viewDidLayoutSubviews, tôi in các giới hạn của chế độ xem:

{{0, 0}, {320, 568}}

Điều này dẫn đến nội dung của tôi xuất hiện bên dưới thanh điều hướng và thanh trạng thái.

Tôi biết mình có thể tự tính chiều cao bằng cách lấy chiều cao của màn hình chính, trừ đi chiều cao của thanh trạng thái và chiều cao của thanh điều hướng, nhưng điều đó dường như là công việc bổ sung không cần thiết.

Có ai khác có kinh nghiệm vấn đề này?

CẬP NHẬT:

Tôi đã tìm thấy một giải pháp cho vấn đề cụ thể này. Đặt thuộc tính trong suốt của thanh điều hướng thành KHÔNG:

self.navigationController.navigationBar.translucent = NO;

Điều này sẽ sửa chế độ xem không bị đóng khung bên dưới thanh điều hướng và thanh trạng thái.

Tuy nhiên, tôi vẫn chưa tìm ra cách khắc phục cho trường hợp bạn muốn thanh điều hướng trong mờ. Ví dụ, khi xem ảnh toàn màn hình, tôi muốn thanh điều hướng trong mờ và chế độ xem được đóng khung bên dưới nó. Điều đó hoạt động, nhưng khi tôi chuyển đổi hiển thị / ẩn thanh điều hướng, tôi đã gặp phải những kết quả thậm chí còn kỳ lạ. Lượt xem phụ đầu tiên (a UIScrollView) nhận được gốc y của nó thay đổi mỗi lần.


4
Phần mềm beta. Các diễn đàn dành cho nhà phát triển của Apple dễ chấp thuận hơn. Ngoài ra, vấn đề được đề cập rõ ràng trong hướng dẫn chuyển đổi.
Sulthan

Câu trả lời:


188

Điều đó không hoàn toàn đúng. Đã có một thuộc tính mới được giới thiệu trong iOS 7 cho phép bạn điều chỉnh hành vi bố cục như trong các phiên bản iOS trước. Đặt đoạn mã này vào bộ điều khiển chế độ xem của bạn và bạn nên thực hiện! Không gian mà thanh điều hướng của bạn chiếm sẽ được tính toán tự động

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

Bạn cần thêm những điều trên trong -(void)viewDidLoadphương pháp của mình .

Lưu ý: Bạn nên sử dụng phiên bản GM mới nhất của iOS 7 và Xcode 5 ngay bây giờ vì API đã thay đổi từ các phiên bản beta.


trong mã của tôi, nó nói là edgeForExtendedLayout. Sử dụng mã định danh chưa được khai báo UIExtendedEdgeNone. Xin vui lòng giúp đỡ.

6
Nó được đổi thành UIRectEdgeNone
Simon

6
Đó chính xác là lý do tại sao một câu hỏi như vậy không nên được hỏi hoặc trả lời ở đây.
Sulthan

Tôi không undestand do tại sao nếu bạn muốn giữ lại khả năng tương thích với iOS6 bạn buộc phải đưa ra một trường hợp có điều kiện theo mã để kiểm tra nếu bộ điều khiển có tài sản đó hay không ..
jerrygdm

12
Điều này dường như chỉ hoạt động nếu chế độ xem được nhúng trong UINavigationController.
pojo

37

Ảnh chụp màn hình từ bảng phân cảnh

Nếu bạn đang làm việc trong Storyboard (mà tôi thực sự khuyên bạn nên làm!) Thì đây là giải pháp: Bạn có thể tắt "Mở rộng các cạnh" của ViewController trong storyboard. Bạn phải làm điều này cho mỗi viewController. Bạn có thể vô hiệu hóa các cạnh mở rộng bằng cách nhấp vào biểu tượng viewController trong bảng xếp hạng (bên cạnh productOwner bên dưới chính chế độ xem) và sau đó chọn trình kiểm tra thuộc tính (Giống như hình ảnh hiển thị).

Thao tác này cũng sẽ thiết lập các đường căn chỉnh giống như iOS 6.

Một công cụ tuyệt vời khác trong xCode 5 là "Xem trước": nhấp vào Nút quản gia (trợ lý biên tập) và chọn Xem trước. ở đó, bạn có thể chọn iOS 6 và xem thiết kế bảng phân cảnh của mình sẽ như thế nào trên iOS 6.

Thật tuyệt vời: D

[Cập nhật]

Hãy cẩn thận: việc tắt "Mở rộng cạnh" có thể dẫn đến ánh sáng đen trên thanh điều hướng khi ứng dụng chuyển sang chế độ nền trên iOS7. ánh sáng cũng sẽ hiển thị trên chế độ xem đa nhiệm (nhấn đúp vào nút trang chủ). điều này có thể được giải quyết bằng cách đặt màu nền của chế độ xem thanh điều hướng thành màu trắng.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];

Vâng, đây là giải pháp đến từ góc độ bảng phân cảnh. Cảm ơn bạn.
jpittman

12

Như OP đã nói, có một giải pháp đơn giản cho điều này là đặt thanh điều hướng ở chế độ mờ. Thay vì làm điều này trong mã, chỉ cần bỏ chọn "Mờ" cho thanh điều hướng gốc của bạn:

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


8

self.edgesForExtendedLayout=UIRectEdgeNone;

Nó hoạt động trên trình mô phỏng iOS 7 (Xcode 5 DP5)


2
điều này hoạt động tốt trong ios7 nhưng nếu tôi chạy ứng dụng trên ios 6 trở về trước thì các chế độ xem lại bị chuyển lên. Bất kỳ giải pháp cho điều này? Ngoài ra chúng ta cần đặt thuộc tính này trong mỗi phương thức tải viewdid của bộ điều khiển chế độ xem?
loganathan

bạn luôn có thể kiểm tra xem iOS hiện tại có phải là 7 hay không bằng cách này nếu:if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Aviel Gross 14/10/13

2

những câu trả lời này đều hữu ích, đặc biệt là MQoder, nhưng đối với tôi, tôi cũng phải đặt thanh trên cùng mặc định thành "điều hướng màu đen mờ".

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


1

Câu trả lời của @One Man Crew là đúng, nhưng:

Tôi khuyên bạn nên sử dụng mã này để tránh lỗi khi chạy ứng dụng trên các phiên bản cũ hơn:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif

0

self.edgesForExtendedLayout = UIRectEdgeNone;

Và bạn cần thực hiện việc này trên ứng dụng AppDelegate #: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

Nếu không, màu nền của Thanh điều hướng sẽ chuyển thành màu xám. Vì Thanh điều hướng trong suốt chồng lên cửa sổ.


0

Nếu bạn muốn giữ độ trong suốt khi người dùng cuộn chế độ xem bảng của bạn, bạn có thể đặt ContentInset của nó:

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);

-1

Một giải pháp là sử dụng Bộ điều khiển Điều hướng. Điều này tự động giải quyết vấn đề. Cũng sử dụng Xcode 5 thay vì các phiên bản Xcode Preview vì chúng là phiên bản beta.

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.