2010-08-20 22 views
8

Tôi đang viết một ứng dụng SplitView iPad. Bên trong DetailViewController, có một khung nhìn nhỏ có chứa UITableViewUISearchBar và bộ điều khiển của nó. Chế độ xem này không đại diện cho toàn bộ không gian màn hình dành riêng cho DetailViewController. Trên thực tế, nó chỉ sử dụng một nửa của nó. Có một số UIImageView ở nửa còn lại.UISearchDisplayController Without Dimming?

Và đây là nơi gặp sự cố: mỗi lần tôi sử dụng thanh tìm kiếm, bộ điều khiển hiển thị (tôi giả định) làm mờ mọi thứ hiện diện bên trong DetailViewController, bao gồm cả chế độ xem hình ảnh. Điều đó không nhất quán với những gì ai đó mong đợi khi chạy ứng dụng. Có cách nào để đặt khung bị mờ đi không? Hoặc ít nhất là vô hiệu hóa mờ cho tốt?

Xin cảm ơn trước.

Trả lời

11

Bạn đúng là UISearchDisplayController đang quản lý hiệu ứng "mờ" mà bạn đang thấy.

Điều UISearchDisplayController đang làm là thêm UIControl làm phần phụ vào giao diện của searchContentsController (thuộc tính của UISearchDisplayController), có khả năng là bộ điều khiển xem chi tiết của bạn. UIControl này chỉ là một chế độ xem alpha với nền màu xám. Dường như nó có một trình xử lý sự kiện chạm bên trong kết thúc tìm kiếm khi khai thác.

Để hạn chế hiệu ứng mờ cho chế độ xem phụ của chế độ xem chi tiết, bạn cần thực hiện ba việc. (Tôi giả định chi tiết của bạn-xem-điều khiển được xác định thông qua một xib. Nếu không, các bước này có thể được thực hiện trong mã quá.)

1) thêm một UIViewController mới để chi tiết-view-controller xib. Đính kèm bộ điều khiển xem mới này vào một IBOutlet của bộ điều khiển xem chi tiết của bạn. Trong ví dụ của tôi, tôi gọi đây là "_searchAreaViewController". Đây là quan trọng, ngay cả khi bạn sẽ không bao giờ truy cập vào bộ điều khiển view (nhưng hãy nhớ, bạn sẽ phải phát hành nó tại một số điểm)

@interface DetailViewController : UIViewController <UIPopoverControllerDelegate, UISplitViewControllerDelegate, UITableViewDelegate, UITableViewDataSource> { 

    UIPopoverController *popoverController; 
    UIToolbar *toolbar; 

    id detailItem; 
    UILabel *detailDescriptionLabel; 

    IBOutlet UIViewController* _searchAreaViewController; 
} 

2) làm cho cái nhìn chứa cho khu vực tìm kiếm của bạn quan điểm của mới này bộ điều khiển xem. Để thực hiện việc này, hãy sử dụng Trình tạo giao diện để đặt một cửa sổ tham chiếu mới cho chế độ xem này bằng cách kéo lối ra tới searchAreaViewController và chọn cửa sổ "xem". Bạn phải có một khung nhìn có sẵn - nó phải là một phần phụ của khung nhìn chi tiết của bạn, và nó sẽ chứa UISearchBar và có khả năng là UITableView của bạn.

3) làm cho thuộc tính searchContentsController của UISearchDisplayController tham chiếu đến bộ điều khiển chế độ xem mới này thay vì chi tiết-view-controller. Điều này chỉ có thể được thực hiện thông qua giao diện Builder như tài sản là chỉ đọc (IB có một số phép thuật để làm cho công việc này?) Nếu bạn cần làm bước này thông qua mã bạn sẽ phải phân lớp UISearchDisplayController và trả về giá trị chính xác từ một ghi đè thuộc tính của "searchContentsController".

Tôi đã tạo một ứng dụng mẫu để minh họa điều này và dòng mã duy nhất tôi phải thêm vào mẫu SplitView là mẫu được liệt kê ở bước 1 ở trên. Mọi thứ khác chỉ là thêm các khung nhìn/bộ điều khiển và kết nối chúng đúng cách trong IB.

chúc may mắn!

+0

Sau khi thực hiện điều đó, khu vực vẫn bị mờ ... Sự nghi ngờ duy nhất của tôi là ở bước số 2. Khi liên kết chế độ xem với bộ điều khiển xem, nó sẽ là ổ cắm cho cả bộ điều khiển xem chi tiết và searchAreaViewController. Đúng không? Nếu tôi xóa tham chiếu đến trình điều khiển chế độ xem chi tiết, ứng dụng sẽ gặp sự cố khi khởi động. –

+0

Không, nó chỉ nên là chế độ xem cho "searchAreaViewController" mới. Khung nhìn này cần phải là một khung nhìn con của khung nhìn DetailViewController. Có phải đó là những gì bạn có? – TomSwift

+1

Ở đây, tôi đã đăng một dự án mẫu cho bạn, tại đây: http://goo.gl/Gv1NH – TomSwift

0

Bạn có thể làm rõ ý của mình bằng cách "sử dụng thanh tìm kiếm" và "làm mờ mọi thứ hiện diện" không? Tôi giải thích những gì bạn đã viết theo cách mà bàn phím bật lên khi bạn chuẩn bị nhập văn bản vào trường văn bản của thanh tìm kiếm. Và tại thời điểm này, chế độ xem chi tiết bị mờ đi, ngăn không cho tương tác của người dùng.

Nguyên nhân là thanh tìm kiếm triển khai hộp thoại phương thức ngăn cản tương tác của người dùng với chế độ xem miễn là bàn phím được hiển thị.Thật không may, dường như không có cách nào để định cấu hình thanh tìm kiếm để ngăn chặn hành vi này. Mặt khác, tôi không chắc chắn rằng người dùng sẽ không mong đợi hành vi này vì thanh tìm kiếm có phương thức nhất quán và hoạt động như thế này nói chung trong iOS.

Tôi đã thử hai công việc ở quanh:

1.) Có một tài sản của UIViewController gọi modalPresentationStyle trong đó sản xuất chính xác hành vi mà bạn mô tả nếu nó có giá trị UIModalPresentationFormSheet ("Tất cả các khu vực phát hiện đang mờ đi để ngăn chặn người dùng tương tác với họ. ", xem Apple documentation). Nhưng thiết lập thuộc tính này thành một giá trị khác không thay đổi kết quả (ít nhất là đối với tôi nó không hoạt động).

2.) Bạn sẽ cần phải viết thay thế thanh tìm kiếm phi phương thức của riêng mình vì UITextField tiêu chuẩn không có phương thức và do đó không làm mờ bất kỳ phần tử giao diện người dùng nào khác. Cách tiếp cận này hoạt động, nhưng bạn có thể cần thêm một chút công việc để làm cho nó trông giống như một thanh tìm kiếm "thông thường". Nhưng, một lần nữa, vì thanh tìm kiếm này hoạt động khác với các thanh tìm kiếm thông thường trong iOS, điều này có thể không thực sự là những gì người dùng mong đợi.

0

Tôi biết tôi đến muộn và đây là một ý tưởng kinh khủng ở đây, nhưng 'setHidden: No' không có tác dụng đối với tôi.

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 

BOOL hasBeenremoved = NO; 
hasBeenremoved = [[[[NSThread mainThread] threadDictionary] objectForKey:@"hasBeenremoved"] boolValue]; 

if (hasBeenremoved) 
{ 
    UIView* dimmingView = nil; 
    dimmingView = [[[NSThread mainThread] threadDictionary] objectForKey:@"dimmingView"]; 

    UIView* dimmingViewSuperView = nil; 
    dimmingViewSuperView = [[[NSThread mainThread] threadDictionary] objectForKey:@"dimmingViewSuperView"]; 

    [dimmingViewSuperView addSubview:dimmingView]; 

    [[[NSThread mainThread] threadDictionary] setObject:@NO forKey:@"hasBeenremoved"]; 
} 

if ([searchText length] == 0 || [searchText isEqualToString:@""]) 
    { 
     [searchBar becomeFirstResponder]; 
     [[[self primarySearchDisplayController] searchResultsTableView] reloadData]; 
     [[[self primarySearchDisplayController] searchResultsTableView] setHidden:NO]; 

     for(UIView *subview in self.view.subviews) 
     { 
      if([subview isMemberOfClass:[UIControl class]] || 
       ([[[subview class] description] isEqualToString:@"UISearchDisplayControllerContainerView"])) 

      { 
       for(UIView *subView2 in subview.subviews) 
       { 
        for(UIView *subView3 in subView2.subviews) 
        { 
         if (subView3.alpha < 1) 
         { 


          if ([[[subView3 class] description] isEqualToString:@"_UISearchDisplayControllerDimmingView"]) 
          { 
           [[[NSThread mainThread] threadDictionary] setObject:subView3 forKey:@"dimmingView"]; 
           [[[NSThread mainThread] threadDictionary] setObject:subView3.superview forKey:@"dimmingViewSuperView"]; 

           [[[NSThread mainThread] threadDictionary] setObject:@YES forKey:@"hasBeenremoved"]; 

           [subView3 removeFromSuperview]; 
          } 


         } 
        } 
       } 
      } 
     } 
    } 
} 
1

iOS 8+

[[UIView appearanceWhenContainedInInstancesOfClasses:@[NSClassFromString(@"UISearchDisplayControllerContainerView")]] setHidden:YES]; 

iOS 7

tôi biết, rằng UISearchDisplayController bị phản đối cho bây giờ, nhưng nếu bạn vẫn cần phải sử dụng nó, bạn có thể giải quyết vấn đề của bạn với một dòng mã hoàn hảo. Thêm nó vào phương thức viewDidLoad.

+0

Câu trả lời này dường như không thêm bất kỳ điều gì quan trọng cho câu hỏi. Nếu điều này đang thảo luận về những thay đổi mới mà các nhà phát triển khác cần phải chú ý vì các câu trả lời khác đã được đăng, hãy làm cho câu trả lời của bạn rõ ràng trong câu trả lời vì câu hỏi này quá cũ. Tốt hơn, đề xuất chỉnh sửa cho câu trả lời thích hợp để cập nhật nó. – Ghedipunk

+0

@Ghedipunk, tôi nghĩ bạn sai và câu trả lời này bổ sung điều gì đó quan trọng, bởi vì các nhà phát triển khác hiện không thể dành nhiều thời gian đấu tranh và thực hiện nhiều bước như trước. P.S. Câu trả lời đã được cập nhật. –

+0

Sau đó, sử dụng nhiều hơn 2 dòng mã và một đoạn văn được viết kém để giải thích lý do tại sao điều này bổ sung một điều gì đó quan trọng. – Ghedipunk

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