2017-09-22 17 views
12

Đã tham chiếu herehere. Không có câu trả lời trong liên kết đầu tiên. Trong liên kết thứ hai, mặc dù câu trả lời không được chấp nhận, nhưng liên kết đến diễn đàn nhà phát triển của Apple có lỗi.Vấn đề UISearchBarController iOS 11 - Nút SearchBar và phạm vi chồng chéo

Trước khi iOS 11:

enter image description here

iOS 11:

enter image description here

Note: Cùng thiết bị cùng một mã.
Ngoài ra, điều này có nghĩa là tất cả các ứng dụng sử dụng tính năng này phải được xuất bản lại?

+0

thấy điều này một lần https://stackoverflow.com/questions/31424540/uisearchcontroller-searchbar-and-scopebar-overlap-on-first-touch-event –

+0

@ Anbu.Karthik Liên kết này được đính kèm bởi Nitish –

+0

Hãy thử với bản thân .definesPresentationContext = true viết dòng này trong chế độ xem của bạnDIdload – Govaadiyo

Trả lời

1

Trong radar mà Ray Wenderlich đệ trình, @benck đã đăng answer từ WWDC, nếu tôi không nhầm, chưa được đăng.

1

Mỗi nhận xét của bạn, UISearchBar của UISearchController đã được gán cho UITableView của bạn. Trong iOS 11, thay vào đó bạn nên chỉ định UISearchController của mình cho thuộc tính searchController của chế độ xem của bạn là navigationItem. Bạn không cần phải chỉ định UISearchBar ở bất kỳ đâu. Xem Apple's documentation trên thuộc tính mới này.

1

Tôi đã gặp vấn đề tương tự trên ứng dụng của mình, giải pháp của tôi là trong iOS 11, sử dụng cách mới được đề xuất táo cho searchBar trong navigationItem, nếu không, sử dụng cách cũ. Mã của tôi trong viewDidLoad() như sau:

if #available(iOS 11.0, *) { 
    navigationController?.navigationBar.prefersLargeTitles = false 
    navigationItem.searchController = searchController 
    navigationItem.hidesSearchBarWhenScrolling = false 
    searchViewHeight.constant = 0 
} else { 
    searchView.addSubview(searchController.searchBar) 
} 

Tôi có hai IBOutlets: SearchView và searchViewHeight:

@IBOutlet var searchView: UIView! 
@IBOutlet var searchViewHeight: NSLayoutConstraint! // new added for iOS 11 

Trước khi iOS 11, hệ thống cấp bậc viewController của tôi như sau:

My searchView before iOS 11

Tôi có một searchView mà chiều cao là 44 để chứa tìm kiếm của tôi SearchController'sBar xem. Nó nằm dưới thanh điều hướng.

Trong iOS 11, tôi thêm IBOutlet mới cho ràng buộc chiều cao của searchView và đặt hằng số là 0, ẩn chế độ xem vùng chứa này. Và thêm searchController như một phần của mục điều hướng. tài liệu

Xem táo: https://developer.apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller

hơn Một điều là dưới iOS 11, màu nền TextField của Searchbar rất ít sẫm màu hơn màu thanh điều hướng theo mặc định.Để thống nhất, bạn có thể thay đổi nó sang màu trắng, mã dưới đây sẽ làm việc cho cả iOS11 và nó trước:

if let textField = searchController.searchBar.value(forKey: "searchField") as? UITextField { 
    if let backgroundView = textField.subviews.first { 

     // Search bar textField background color 
     backgroundView.backgroundColor = UIColor.white 

     // Search bar textField rounded corner 
     backgroundView.layer.cornerRadius = 10 
     backgroundView.clipsToBounds = true 
    } 
} 
3

Thêm những dòng này cố định nó cho tôi:

override func viewDidLayoutSubviews() { 
    self.searchController.searchBar.sizeToFit() 
} 
+0

Đã sửa lỗi cho tôi. Tôi chỉ cần thêm SearchController vào tableView mà không có điều kiện kiểm tra cho iOS 11. Nó phải được liên kết với iOS 11 SDK, phương pháp này không hoạt động khi được liên kết với iOS 10 SDK. – Raunak

0

tôi có thể nhận được sự xuất hiện ban đầu để hiển thị một cách chính xác trong iOS11 sử dụng đoạn mã sau (như mỗi câu trả lời của Greg):

[self.searchController.searchBar sizeToFit]; 

if (@available(iOS 11.0, *)) { 
    self.navigationItem.searchController = self.searchController; 
    self.navigationItem.hidesSearchBarWhenScrolling = NO; 
} else { 
    // Fallback on earlier versions 
    self.tableView.tableHeaderView = self.searchController.searchBar; 
} 

Tuy nhiên, nếu ứng dụng được backgrounded sau đó phục hồi khi thanh tìm kiếm đã hoạt động, sự xuất hiện sẽ kết thúc lên chồng lên nhau như thể hiện trong ảnh chụp màn hình thứ hai của Nitish ở trên.

tôi đã có thể khắc phục điều đó với cách giải quyết như sau:

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) { 
    self.searchController.searchBar.showsScopeBar = NO; 
    [self.searchController.searchBar sizeToFit]; 
    self.searchController.searchBar.showsScopeBar = YES; 
    [self.searchController.searchBar sizeToFit]; 
}]; 

(tôi vẫn đang làm việc trên như thế nào để workaround các vấn đề bố trí sau một sự thay đổi định hướng giao diện trong khi thanh tìm kiếm đang hoạt động - đó vẫn kết thúc lên nhau)

0

tôi nghĩ rằng giải pháp là thêm Search Bar trong Navigation Bar:.

navigationController?.navigationBar.prefersLargeTitles = true // Navigation bar large titles 
navigationItem.title = "Contacts" 
navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white] 
navigationController?.navigationBar.barTintColor = UIColor(displayP3Red: 0/255, green: 150/255, blue: 136/255, alpha: 1.0) 

let searchController = UISearchController(searchResultsController: nil) // Search Controller 
navigationItem.hidesSearchBarWhenScrolling = false 
navigationItem.searchController = searchController 

Bạn có thể tìm thấy một ví dụ cho UISearchBa rController - Nút SearchBar và phạm vi chồng lên nhau here.

Các vấn đề liên quan