2010-08-20 4 views
8

SplitView iPad 앱을 쓰고 있습니다. DetailViewController 내부에는 UITableViewUISearchBar 및 해당 컨트롤러가 포함 된 작은보기가 있습니다. 이 뷰는 DetailViewController 용으로 예약 된 전체 화면 공간을 나타내지는 않습니다. 실제로, 그것의 절반을 사용합니다. 나머지 절반에는 UIImageView 명이 있습니다.밝기 조절 기능이없는 UISearchDisplayController?

여기가 문제가되는 곳입니다. 검색 창을 사용할 때마다 displaycontroller는 이미지보기를 포함하여 DetailViewController 내부에있는 모든 것을 어둡게합니다. 이는 앱을 실행할 때 누군가가 기대하는 것과 일치하지 않습니다. 프레임을 어둡게 설정하는 방법이 있습니까? 또는 적어도 조광 기능을 해제 할 수 있습니까?

미리 감사드립니다.

답변

11

"디밍"효과를 관리하는 UISearchDisplayController가 맞습니다.

UISearchDisplayController가 수행하는 작업은 detailview 컨트롤러 일 수있는 searchContentsController (UISearchDisplayController 속성)의 뷰에 UIControl을 하위 뷰로 추가하는 것입니다. 이 UIControl은 회색 배경의 알파보기입니다. 그것은 도청 될 때 검색을 끝내는 터치 업 내부 이벤트 처리기가있는 것 같습니다.

세부보기의 하위보기에 디밍 효과를 제한하려면 세 가지 작업을 수행해야합니다. (당신의 디테일 뷰 컨트롤러가 xib를 통해 정의되었다고 가정하고 있습니다. 그렇지 않다면이 단계는 코드에서도 가능합니다.) 1) 새로운 UIViewController를 detail-view-controller xib에 추가하십시오. 이 새로운 뷰 컨트롤러를 디테일 뷰 컨트롤러의 IBOutlet에 연결하십시오. 나의 예제에서는 이것을 "_searchAreaViewController"라고 부른다. 이것은 당신이 늘 이제까지 뷰 컨트롤러에 액세스 할 경우에도)

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

    UIPopoverController *popoverController; 
    UIToolbar *toolbar; 

    id detailItem; 
    UILabel *detailDescriptionLabel; 

    IBOutlet UIViewController* _searchAreaViewController; 
} 

이 검색 영역이 새의 뷰를 포함하는 뷰를 만드는 (하지만 기억, 당신은 어떤 시점에서 그것을 해제해야합니다), 중요하다 뷰 컨트롤러. 이렇게하려면 인터페이스 빌더를 사용하여 콘센트를 searchAreaViewController로 드래그하고 "보기"콘센트를 선택하여이 뷰에 대한 새로운 참조 콘센트를 설정하십시오. 포함 된보기가 있어야합니다. 세부보기의 하위보기 여야하며 UISearchBar 및 가능성있는 UITableView가 있어야합니다.

3) UISearchDisplayController의 searchContentsController 속성을 detail-view-controller 대신이 새보기 컨트롤러를 참조하십시오. 이것은 Interface Builder를 통해서만 할 수 있습니다. 속성은 읽기 전용입니다 (IB가이 작업을 수행 할 수있는 마법이 있습니까?) 코드를 통해이 단계를 수행해야한다면 UISearchDisplayController를 서브 클래스 화하고 a에서 올바른 값을 반환해야합니다. "searchContentsController"의 속성 재정의입니다.

이것을 보여주기 위해 샘플 앱을 만들었고 SplitView 템플릿에 추가해야하는 유일한 코드 줄은 위의 1 단계에 나열된 코드입니다. 다른 모든 것은보기/컨트롤러를 추가하고 IB에서 제대로 연결하는 것이 었습니다.

행운을 빈다!

+0

이 작업을 수행 한 후에도 영역이 여전히 희미합니다 ... 의심스러운 부분은 2 번 단계입니다. 뷰 컨트롤러에 뷰를 연결하면 디테일 뷰 컨트롤러와 searchAreaViewController의 콘센트가 연결됩니다. 그 맞습니까? 자세히보기 컨트롤러에 대한 참조를 제거하면 시작시 응용 프로그램이 중단됩니다. –

+0

아니요, 새 "searchAreaViewController"에 대한보기 여야합니다. 이 뷰는 DetailViewController 뷰의 하위 뷰 여야합니다. 그게 네가 가진거야? – TomSwift

+1

여기 샘플 프로젝트를 게시했습니다. http://goo.gl/Gv1NH – TomSwift

0

"검색 창 사용"과 "현재 사용중인 모든 기능 무시"의 의미를 분명히 할 수 있습니까? 나는 당신이 검색 막대의 텍스트 필드에 텍스트를 입력하려고 할 때 키보드가 튀어 나오는 방식으로 당신이 쓴 것을 해석합니다. 이 시점에서 세부 정보보기가 흐리게 표시되어 사용자 상호 작용을 방해합니다.

원인은 검색 막대가 키보드가 표시되어있는 한보기와의 사용자 상호 작용을 방지하는 모달 대화 상자를 구현하기 때문입니다.불행히도이 동작을 막기 위해 검색 창을 구성 할 방법이없는 것 같습니다. 다른 한편으로는 검색 막대가 모달로 일관되고 iOS에서 일반적으로 이와 같이 작동하기 때문에 사용자가이 동작을 기대하지 않는다고 확신하지 못합니다.

내가이 일 어라운드 시도 :

1) 당신이 값 UIModalPresentationFormSheet을 (있는 경우 설명 정확히 동작을 생산 modalPresentationStyle라는 UIViewController의 속성이 있습니다 "를 모두 발견 영역 방지하기 위해 흐리게 표시됩니다 사용자가 상호 작용하지 못하게합니다. ", Apple documentation 참조). 그러나이 속성을 다른 값으로 설정해도 결과는 변경되지 않습니다 (적어도 저에게는 효과가 없었습니다).

2.) 표준 UITextField가 모달이 아니므로 다른 모범 UI 요소가 희미 해지지 않으므로 모달이 아닌 검색 막대 교체를 작성해야합니다. 이 방법은 효과적이지만 "일반"검색 창처럼 보이게하려면 약간의 작업이 필요합니다. 그러나이 검색 창은 iOS의 모달 일반 검색 막대와 다르게 동작하므로 사용자가 기대하는 바가 아닐 수도 있습니다.

0

내가 늦었고 여기는 끔찍한 생각이지만, 'setHidden : 아니오'는 나를 위해 작동하지 않았다.

-(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

아이폰 OS 8 +

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

아이폰 OS 7

[View appearanceWhenContainedIn:NSClassFromString(@"UISearchDisplayControllerContainerView"), nil] setHidden:YES]; 

내가 UISearchDisplayController가 지금은 사용되지 않는 것을 알고,하지만 당신은 아직도 그것을 사용해야하는 경우, 당신은 당신의 문제를 해결할 수 있습니다 한 줄의 코드로 완벽하게 처리 할 수 ​​있습니다. viewDidLoad 메서드에 추가하십시오.

+0

이 답변은 질문에 중요한 내용을 추가하지 않습니다. 다른 답변이 게시 된 이후에 다른 개발자가 조심해야 할 새로운 변경 사항에 대해 논의 중이라면이 질문이 너무 오래되었으므로 답변에 그 내용을 분명하게 작성하십시오. 더 나은 방법은 적절한 답변을 수정하여 수정하는 것입니다. – Ghedipunk

+0

@Ghedipunk, 나는 당신이 틀렸다고 생각한다.이 대답은 다른 개발자들이 이제는 많은 시간을 투자하고 이전처럼 많은 단계를 수행 할 수 없었기 때문에 중요한 의미를 부여한다. 추신 답변이 업데이트되었습니다. –

+0

그런 다음 두 줄 이상의 코드와 잘못 작성된 단락을 사용하여 왜 중요한 내용을 추가하는지 설명하십시오. – Ghedipunk

관련 문제