13

Tôi có UISearchBar và UISearchDisplayController, mọi thứ hoạt động tốt nhưng bộ chọn phạm vi của tôi hiển thị bên cạnh trường văn bản thay vì bên dưới trường đó. Tôi biết rằng đây là hành động dự kiến ​​khi thiết bị đang ở phong cảnh, nhưng kể từ khi tôi có UISearchBar trong giao diện tổng thể của một UISplitViewController nó kết thúc lên tim như thế này:Thanh phạm vi lực bên dưới UISearchBar

UISearchBar problem

Có cách nào để buộc thanh phạm vi hiển thị bên dưới trường văn bản trong tất cả các định hướng giao diện (Tôi biết rằng tính năng này hoạt động tốt trong Mail.app trên iPad, vì vậy có thể, nhưng ai biết nếu Apple quyết định ẩn tùy chọn để làm như vậy)

+0

Tôi đã tìm được cách để thực hiện, nhưng đó không phải là API công khai. [self.searchDisplayController.searchBar setCombinesLandscapeBars: NO]; Hãy chắc chắn gọi nó trên thanh tìm kiếm của SearchDisplayController chứ không phải chính UISearchBar. Rõ ràng bộ điều khiển hiển thị tìm kiếm đang quản lý thuộc tính này. – axiixc

+0

Tôi đang gặp vấn đề tương tự và setCombinesLandscapeBars: KHÔNG thực sự giải quyết vấn đề, nhưng cũng mẫu của Apple "TableSearch" được kết quả tương tự mà không sử dụng phương pháp đó. Bạn đã tìm thấy một giải pháp khác? – nacho4d

+1

Trong trường hợp bạn không bị từ chối, bạn có thể sử dụng mã này, không có cảnh báo và an toàn trong trường hợp các kỹ sư của Apple quyết định rằng phương thức cá nhân sẽ không còn nữa. nếu ([self.searchDisplayController.searchBar respondsToSelector: @selector (setCombinesLandscapeBars :)]) { objc_msgSend (self.searchDisplayController.searchBar, @selector (setCombinesLandscapeBars :), NO);} – nacho4d

Trả lời

3

Đây không phải là một phần của API công khai. Hy vọng rằng nó sẽ được bổ sung trong tương lai. Nó có thể được thực hiện bằng cách sử dụng các API riêng tư, xem xét thông qua một kết xuất lớp UIKit sẽ giúp bạn ở đó.

Chúc may mắn!

chỉnh sửa: Lưu ý rằng việc sử dụng API riêng tư có thể khiến bạn bị từ chối khỏi cửa hàng ứng dụng, như hầu hết mọi người đã biết.

2

Tôi đã sử dụng UISearchDisplayDelegate để hiển thị và ẩn thanh phạm vi.

-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller 
{ 
    [controller.searchBar setShowsScopeBar:YES]; 
} 

-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller 
{ 
    [controller.searchBar setShowsScopeBar:NO]; 
} 
1

Không sử dụng API riêng tư. Thay vào đó, hãy làm theo khuyến nghị của Apple từ Nguyên tắc Giao diện Người dùng của IOS:

Khi thanh tìm kiếm xuất hiện, thanh phạm vi có thể xuất hiện gần đó. Thanh phạm vi hiển thị bên dưới thanh tìm kiếm, bất kể hướng nào, trừ khi bạn sử dụng bộ điều khiển hiển thị tìm kiếm trong mã của mình (để biết thêm thông tin về cách hoạt động này, hãy xem Tham khảo UISearchDisplayController Class ). Khi bạn sử dụng bộ điều khiển hiển thị tìm kiếm, thanh phạm vi là được hiển thị trong thanh tìm kiếm ở bên phải của trường tìm kiếm khi thiết bị ở hướng ngang (theo hướng dọc, là bên dưới thanh tìm kiếm).

Điều này giúp tôi sử dụng bảng phân cảnh.

0

Tại sao không chỉ thiết lập thanh tìm kiếm của bạn theo chương trình? Đây là những gì tôi đang sử dụng trên dự án hiện tại của tôi. Nó ẩn thanh tìm kiếm cho đến khi người dùng cuộn lên và thanh phạm vi được tải bên dưới trường văn bản khi họ bắt đầu nhập các mục. Từ đó, bạn chỉ cần lọc theo cách thông thường:

- (void)setupSearchBar { 
self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)]; 
self.searchBar.showsScopeBar = YES; 
self.searchBar.scopeButtonTitles = [NSArray arrayWithObjects:@"Users", @"Groups", nil]; 
self.tableView.tableHeaderView = self.searchBar; 

CGPoint offset = CGPointMake(0, self.searchBar.frame.size.height); 
self.tableView.contentOffset = offset; 

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar 
                  contentsController:self]; 
self.searchController.searchResultsDataSource = self; 
self.searchController.searchResultsDelegate = self; 
self.searchController.delegate = self; 
} 

gọi [self setupSearchBar]; trong chế độ hiển thịDidLoad bạn sẽ tham gia cuộc đua.

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