Programing

iOS 7 UISearchDisplayController 검색 표시 줄이 검색하는 동안 상태 표시 줄과 겹칩니다.

lottogame 2020. 11. 14. 09:44
반응형

iOS 7 UISearchDisplayController 검색 표시 줄이 검색하는 동안 상태 표시 줄과 겹칩니다.


iOS 7 용 앱을 업데이트하고 있으며 새 투명 상태 표시 줄을 고려하여 모든보기를 조정하는 중입니다 (내 앱은 여전히 ​​불투명 탐색 표시 줄을 사용합니다).

내 뷰 컨트롤러 중 하나의 UISearchDisplayController에 연결된 UISearchBar와 관련된 한 가지 주요 문제를 제외하고는 모든 뷰에서 상태 표시 줄을 조정하는 것이 비교적 쉬웠습니다.

검색 창은 아래와 같이 정상적으로 표시됩니다.

검색 창

문제는 검색을 시작하자마자 내비게이션 바가 사라지지만 다른 모든 것도 상태 표시 줄과 겹치도록 위로 이동한다는 것입니다.

깨진 검색 창

화면이 어두워지는 현상이 검색 창이 끝나야하는 검색 창 아래 20 픽셀 아래에서 발생하기 때문에 의도 한대로 작동하지 않는 것 같습니다.

iOS 7에이를위한 내장 솔루션이 있습니까? 사용자가 검색을 시작하고 끝낼 때마다 모든 뷰의 프레임을 수동으로 조정할 필요가 없습니다.

감사!


viewDidLoad에 다음 줄을 넣으면 문제가 해결되었습니다.

self.edgesForExtendedLayout = UIRectEdgeNone;

나를 올바른 길로 인도 해 주신 hodade에게 감사드립니다! 귀하의 솔루션은 검색 막대의 프레임 만 이동하여 다른 하위보기를 잘못된 위치에 남겨 두는 것을 제외하고는 작동했습니다. 내가 변경 한 유일한 것은 내 뷰의 모든 하위 뷰를 이동하고 애니메이션하는 것입니다.

감사!

-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
        [UIView animateWithDuration:0.25 animations:^{
            for (UIView *subview in self.view.subviews)
                subview.transform = CGAffineTransformMakeTranslation(0, statusBarFrame.size.height);
        }];
    }
}

-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        [UIView animateWithDuration:0.25 animations:^{
            for (UIView *subview in self.view.subviews)
                subview.transform = CGAffineTransformIdentity;
        }];
    }
}

반투명 탐색 모음을 사용하지 않을 수 있습니까? 그렇다면이 문제가 해결됩니다.

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = YES;
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = NO;
}

-(void) ViewDidLoad 에 다음 코드를 넣으십시오 . iOS 7 이상 버전에서 작동합니다.

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

최신 정보:

if(SYSTEM_VERSION_GREATER_THAN(@"6.1")) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

문제를 해결하기 위해 아래 코드를 수행했습니다.

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

이것은 내가 가진 문제를 설명하는 것 같습니다. 내 이전 위치의 누군가를 도울 것입니다.

  1. UIViewController / UITablewViewController에 추가 된 SearchDisplayController를 서브 클래스로 만드세요.

  2. 구현에 다음과 같이 추가하십시오.

     - (void)setActive:(BOOL)visible animated:(BOOL)animated
    {
        [super setActive:visible animated:animated];
    
        [self.searchContentsController.navigationController setNavigationBarHidden: NO animated: NO];
    
        CGRect frame = self.searchResultsTableView.frame;
        frame.origin.y = CGRectGetHeight(self.searchContentsController.navigationController.navigationBar.frame);
    
        frame.size.height = CGRectGetHeight(frame) - CGRectGetMinY(frame);
    
        self.searchResultsTableView.frame = frame;
    
        frame = self.searchBar.frame;
        self.searchBar.frame = frame;
    
        [self.searchContentsController.view insertSubview:self.searchBar aboveSubview:self.searchResultsTableView];
    
    }
    

나는 이것을 viewDidLoad에 추가하면 도움이 될 것이라고 생각합니다.

if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
{
    self.edgesForExtendedLayout = UIRectEdgeNone;

}

그냥 추가

self.definesPresentationContext = YES;

여기에서 더 많은 것을 읽을 수 있습니다 : UISearchController 및 definePresentationContext

및 Apple 문서에서 : UISearchController 문서

참고 : UISearchDispalyController는 iOS7에서 더 이상 사용되지 않습니다. iOS8에서는 대신 UISearchController를 사용하고, 위의 메서드는 UISearchController를 사용합니다.


제 경우에는 검색 표시 줄 아래의보기가 올바른 위치에 있었고 검색 표시 줄 만 상태 표시 줄과 겹쳤습니다. 이 경우이 코드 평화는 잘 작동합니다.

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {        
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
        CGRect frame = self.searchBar.frame;
        frame.origin.y += statusBarFrame.size.height;
        self.searchBar.frame = frame;
    }
}

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
        CGRect frame = self.searchBar.frame;
        frame.origin.y -= statusBarFrame.size.height;
        self.searchBar.frame = frame;
    }
}

다른 사람들에게 유용하기를 바랍니다.


-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
        CGRect frame = controller.searchBar.frame;
        frame.origin.y += statusBarFrame.size.height;
        controller.searchBar.frame = frame;
    }
}

-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
        CGRect frame = controller.searchBar.frame;
        frame.origin.y -= statusBarFrame.size.height;
        controller.searchBar.frame = frame;
    }
}

위의 답변은 탐색 모음을 숨김 해제 한 경우에만 작동합니다 . 탐색 모음이 숨겨져 있으면 다음을 시도하십시오.

-(void)viewDidAppear:(BOOL)animated{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
    [self.tableView setFrame:CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y+statusBarFrame.size.height, self.tableView.frame.size.width, self.tableView.frame.size.height)];

    }
}

이 게시물을 기반으로 : UISearchBar가 iOS의 상태 표시 줄과 겹칩니다 .


SearchDisplayController추가 된 하위 클래스 UIViewController/UITablewViewController를 구현에 추가하십시오.

- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
    if(self.active == visible) return;
    [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
    [super setActive:visible animated:animated];
    [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
    if (visible) {
        [self.searchBar becomeFirstResponder];
    } else {
        [self.searchBar resignFirstResponder];
    }
}

참고 URL : https://stackoverflow.com/questions/18925900/ios-7-uisearchdisplaycontroller-search-bar-overlaps-status-bar-while-searching

반응형