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;
}
}
이것은 내가 가진 문제를 설명하는 것 같습니다. 내 이전 위치의 누군가를 도울 것입니다.
UIViewController / UITablewViewController에 추가 된 SearchDisplayController를 서브 클래스로 만드세요.
구현에 다음과 같이 추가하십시오.
- (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];
}
}
'Programing' 카테고리의 다른 글
Git : 오류 : RPC가 실패했습니다. (0) | 2020.11.14 |
---|---|
앱이 제거 될 것임을 어떻게 감지 할 수 있습니까? (0) | 2020.11.14 |
언제 StringBuilder를 사용합니까? (0) | 2020.11.14 |
Java로 XSLT 처리? (0) | 2020.11.14 |
ReSharper 키 바인딩 문제 (0) | 2020.11.14 |