2013-09-24 43 views
17

Tôi (giống như mọi người khác ở đây) đang chạy vào cùng một thanh Trạng thái trùng lặp vấn đề mà mọi người khác, với một chút vặn xoắn, và đó là lý do tại sao tôi mở một câu hỏi mới về điều này.Thanh trạng thái chồng chéo UISearchBar trong iOS

Dường như có một số cơ chế cho phép UISearchBar biết vị trí tự đặt vị trí đó, là hoàn toàn trong tổng số.

câu trả lời jaredsinclair tại đây (iOS 7 status bar back to iOS 6 default style in iPhone app?), giải thích chi tiết cách các kỹ sư của Apple cho phép chúng tôi giới thiệu logic cho ứng dụng của chúng tôi để hòa trộn càng nhiều càng tốt với môi trường của người dùng.

Tôi đã trải qua quá trình kiểm tra cẩn thận từng UIViewController trong ứng dụng của mình và thực hiện sửa đổi nhỏ nhất có thể.

Trong hầu hết các trường hợp tôi đã có thể giải quyết vấn đề bằng cách sử dụng mã dưới đây mà tôi tìm thấy accross nhiều SO trả lời

// Do any additional setup after loading the view. 
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]){ 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
} 

Tuy nhiên điều này sẽ không làm việc không có vấn đề gì tôi làm trong một cái nhìn đặc biệt nơi UINavigationBar là ẩn.

UISearchBar on top of status bar

Dựa trên các giải pháp tìm thấy trên SO tôi đã có thể giải quyết vấn đề này bằng cách thêm các mảnh sau của logic để đặc biệt này UIViewController

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { 
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 
    viewFrame.origin.y = viewFrame.origin.y+statusBarFrame.size.height; 
} 

này đẩy UIViewController n pixel xuống "tùy thuộc" vào chiều cao của thanh trạng thái.

Hiệu quả của việc này là hiển thị ở đây

Hacked position UISearchBar

Vấn đề là khi tôi bước vào lĩnh vực tìm kiếm UISearchBar thêm bởi chính nó là một lớp đệm 20px trên đỉnh, mà bù đắp lại toàn bộ giao diện người dùng.

enter image description here

Điều này dẫn tôi đến kết luận rằng UISearchBar cố gắng điều chỉnh bản thân, và bởi sự trùng hợp nó tự điều chỉnh số tiền chính xác giống như chiều cao thanh trạng thái của.

Nếu tôi không hack vị trí, khi tôi nhập trường tìm kiếm, điều chỉnh tự động này sẽ căn chỉnh UISearchBar gọn gàng bên dưới thanh trạng thái.

Tôi hy vọng tôi đã nêu chi tiết sự nhầm lẫn của mình, tôi tự hỏi liệu có ai có ý tưởng nào về giải pháp hay không.

+0

Bất kỳ may mắn về vấn đề này? Tôi đang gặp vấn đề tương tự. Tôi nhận thấy trong ảnh chụp màn hình của bạn, bạn đang sử dụng một số loại Slide Out Nav. Bộ điều khiển. Tôi cũng vậy, có lẽ đó là một phần của vấn đề? – Chilly

+0

Xin chào @Chilly không có giải pháp nào đáng tiếc, nhưng tuần tới, chúng tôi đang bắt đầu một lần lặp lại giao diện người dùng và tôi sẽ xem xét thêm về vấn đề này, cho đến lúc chúng tôi phát hành với phiền toái đó, tôi sẽ giữ cho bạn được đặt ra –

Trả lời

27

Nếu Navigationbar có thể nhìn thấy làm như sau trong viewDidLoad:

self.edgesForExtendedLayout = UIRectEdgeNone; 

Nếu Navigationbar ẩn làm như sau trong viewDidLoad:

Điều chỉnh tất cả các yếu tố UIView bằng cách chuyển chúng 20pt

+0

Phát ngay. Nếu bạn sử dụng Trình tạo giao diện, bạn có thể sử dụng dấu trang iOS6/7: Đầu tiên, "xem dưới dạng iOS 6.0", sau đó đặt đồng bằng "20" để đạt được độ lệch +20 trong iOS 7 (phải đặt trên tất cả các chế độ xem cần nhấn xuống). –

+0

Thanh tìm kiếm của tôi bị ẩn và tôi đặt một nút chuyển đổi trong thanh điều hướng. Trong iOS 6 nó hoạt động tốt, và bây giờ nó hoạt động ok trong iOS với thiết lập self.edgesforExtendedLayout. Cảm ơn! – Ismael

+0

Hãy giúp tôi cách thay đổi tất cả các yếu tố UIView – Anees

4

Đấu tranh xung quanh với vấn đề này. Bạn cần phải đặt điều này vào phương thức viewContid viewVidLoad của bạn.

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
} 

Điều này sẽ khắc phục. Nó cũng được nêu trong Hướng dẫn chuyển đổi iOS 7. https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1

+0

Cảm ơn Ben, nếu bạn đọc câu hỏi của tôi, tôi đã thử điều đó. Và ngay cả khi nó làm việc nó không giải quyết điều chỉnh tự động của UISearchBar 20px –

+0

Xin lỗi vì tôi không thể giúp bạn. Dù sao trong ứng dụng của tôi nó làm việc và khi tôi đặt edgeForExtendedLayout khung trường tìm kiếm vẫn như nó được khi nó không hoạt động. Không có bù đắp 20px. –

0

Tôi không thực sự rõ ràng về bit về thanh tìm kiếm điều chỉnh chiều cao của riêng nó - thanh tìm kiếm của tôi không làm điều đó? Nhưng.

Bạn có thể thêm một ràng buộc vào Hướng dẫn bố cục hàng đầu trong IB, cho thanh tìm kiếm. Điều này sẽ làm cho nó dính vào dưới cùng của thanh trạng thái trong cả ios 6 và ios 7. Nếu bạn sau đó loại bỏ các mã nơi bạn tự điều chỉnh chiều cao của thanh trạng thái. Điều đó sẽ chăm sóc nó. Bạn có thể xem ví dụ về cách thực hiện điều đó tại đây: https://developer.apple.com/library/ios/qa/qa1797/_index.html

4

UISearchBar có phương thức đại biểu cho những gì bạn muốn. Chỉ cần đặt nó 20px từ đầu.

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar 
{ 
    return UIBarPositionTopAttached; 
} 

Rất tiếc, nó không hoạt động cùng với UISearchDisplayController.

2

Tôi nhận được cùng một vấn đề chính xác và dựa trên các đề xuất như @ Ben's và here Tôi đã kết thúc việc thêm mã sau đây đã giúp tôi:

- (void) viewDidLayoutSubviews 

    { 
     if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) 
     { 
      CGRect viewBounds = self.view.bounds; 
      CGFloat topBarOffset = self.topLayoutGuide.length; 
      viewBounds.origin.y = topBarOffset * -1; 
      self.view.bounds = viewBounds; 

      self.edgesForExtendedLayout = UIRectEdgeNone; 
     } 
    } 

cách khác mã này cũng làm việc

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

     self.automaticallyAdjustsScrollViewInsets=YES; 
     self.edgesForExtendedLayout = UIRectEdgeNone; 
     self.navigationController.view.backgroundColor = [UIColor whiteColor]; 
     self.navigationController.navigationBar.translucent = YES; 
    } 
+0

Bạn đã đặt mã này chính xác ở đâu? –

+0

Tôi đặt nó vào lớp thực hiện của người xem bảng của tôi, tôi hy vọng điều đó rất hữu ích. – malkoty

2

Nếu bất cứ ai muốn giải quyết vấn đề này thông qua AutoLayout, thay vì thêm một hạn chế searchBar.top = self.view.top thêm một hạn chế đến topLayoutGuide, như vậy:

searchBar.top = topLayoutGuide.bottom 
Các vấn đề liên quan