Nav Bar & Tab Bar를 숨길 때 UIView는 전체 화면으로 크기를 조정하지 않습니다.
-
12-09-2019 - |
문제
정상적인 상호 작용을위한 탭 바 및 NAV 막대가있는 앱이 있습니다. 내 화면 중 하나는 텍스트의 상당 부분이므로 사용자가 전체 화면 (Photos.App과 같은 종류)으로 이동하도록 허용합니다.
Nav Bar & Tab 막대가 숨겨져 있으며 텍스트보기의 프레임을 전체 화면으로 설정했습니다. 문제는 탭 막대가 예전에 약 50px의 공백이 있다는 것입니다. 이 스크린 샷에서 볼 수 있습니다.
Dead Imageshack 링크를 제거했습니다
나는 이것을 일으키는 원인을 잘 모르겠습니다. 공백은 확실히 텍스트보기 뒤의 뷰가 아닙니다. 배경색을 확실히 빨간색으로 설정했기 때문입니다. 이것을 일으킬 수있는 것은 무엇입니까?
** 업데이트 **
나는 Ui -Window 서브 클래스에서 약간의 인기 테스트를 수행했으며 Whitespace가 실제로 문서화되지 않은/미공개 UilayoutContainerview라는 것을 알았습니다. 이것이 탭 바의 부모보기입니다. 이보기를 직접 조작하는 것이 권장되지 않는다고 생각하지 않으므로 어떻게 탭 막대를 숨길 수 있습니까?
** 업데이트 # 2 **
나는 애니메이션 전후에 Self.view의 프레임을 확인했으며, 부모보기가 충분히 크기를 조정하지 않는 것처럼 보입니다.
전체 화면을 마친 후, View의 프레임은 키가 411 픽셀에 불과합니다. 프레임을 수동으로 엉망으로 만들고 운이없는 Autoresizemask를 설정하려고했습니다.
**** 업데이트 : 여기에 최종 결과가 있습니다 ****
- (void)toggleFullscreen {
isFullScreen = !isFullScreen; //ivar
//hide status bar & navigation bar
[[UIApplication sharedApplication] setStatusBarHidden:isFullScreen animated:YES];
[self.navigationController setNavigationBarHidden:isFullScreen animated:YES];
[UIView beginAnimations:@"fullscreen" context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:.3];
//move tab bar up/down
CGRect tabBarFrame = self.tabBarController.tabBar.frame;
int tabBarHeight = tabBarFrame.size.height;
int offset = isFullScreen ? tabBarHeight : -1 * tabBarHeight;
int tabBarY = tabBarFrame.origin.y + offset;
tabBarFrame.origin.y = tabBarY;
self.tabBarController.tabBar.frame = tabBarFrame;
//fade it in/out
self.tabBarController.tabBar.alpha = isFullScreen ? 0 : 1;
//resize webview to be full screen / normal
[webView removeFromSuperview];
if(isFullScreen) {
//previousTabBarView is an ivar to hang on to the original view...
previousTabBarView = self.tabBarController.view;
[self.tabBarController.view addSubview:webView];
webView.frame = [self getOrientationRect]; //checks orientation to provide the correct rect
} else {
[self.view addSubview:webView];
self.tabBarController.view = previousTabBarView;
}
[UIView commitAnimations];
}
(TextView를 WebView로 전환했지만 원본 텍스트보기에 대해서도 동일한 작품을 전환했습니다)
해결책
화면의 하단과 상단에서 각각 탭 바와 내비게이션 바를 애니메이션을하고있는이 정확한 문제가 있었으며 탭 막대가있는 49px 높은 공백을 남겼습니다.
내 새로운 "전체 화면"보기가 실제로 공간을 채우지 않은 이유는 전체 화면보기를 Navigation Controller의 뷰의 하위 뷰로 추가했기 때문에 탭 바 컨트롤러의 자식 이었기 때문입니다.
이를 해결하기 위해 UitabbarController의보기 하위보기로 새로운 전체 화면보기 (모든 텍스트가있는보기)를 추가했습니다.
[[[self tabBarController] view] addSubview:yourTextView];
그러면 하위 뷰의 프레임이 480 x 320px인지 확인하기 만하면 화면을 채워야합니다 (이전에 신비한 공백이었던 영역 포함).
다른 팁
탭 막대가 화면에서 오프되도록보기의 프레임을 이동 시켜서 올바른 것으로 보일 수 있습니다. 나는 다른 사람이 그것을 시도한 것을 알고 있다는 것을 알고 있으며, 당신은 그것이 효과가 없다고 말했지만, 당신이 시도했을 때 TextViews Resize Mask 설정을 제대로하지 않았다는 것입니다. 아래는 작동 해야하는 코드입니다.
- (void)viewDidLoad {
[super viewDidLoad];
currentlyHidden = NO;
}
- (void) hideStuff {
SO2AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];
self.navigationController.navigationBarHidden = YES;
CGRect newFrame = appDelegate.tabBarController.view.frame;
newFrame.size.height += appDelegate.tabBarController.tabBar.frame.size.height;
appDelegate.tabBarController.view.frame = newFrame;
}
- (void) showStuff {
SO2AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];
CGRect newFrame = appDelegate.tabBarController.view.frame;
newFrame.size.height -= appDelegate.tabBarController.tabBar.frame.size.height;
appDelegate.tabBarController.view.frame = newFrame;
self.navigationController.navigationBarHidden = NO;
}
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (currentlyHidden) {
[self showStuff];
currentlyHidden = NO;
} else {
[self hideStuff];
currentlyHidden = YES;
}
}
또한, 이것은 당신이 당신의 펜촉 등 설정을 갖는 방법에 확실히 민감하기 때문에, 나는 전기 온라인으로 AA 프로젝트를 통해 다운로드하고 볼 수 있습니다. 대의원이 탭 컨트롤러를 설정하고 기본 NIB에서 View Controller를 포함시키는 내비게이션 기반 프로젝트 일뿐입니다. 나머지는 rootViewController NIB 및 클래스에 있습니다. 터치가 시작될 때마다 막대가 전환되므로 화면을 누릅니다. 분명히 실제 앱에서는 컨텐츠가 점프하지 않도록 스크롤보기를 조정해야 할 수도 있습니다.
View Controller를 설정 했습니까? hidesBottomBarWhenPushed
속성 YES
? 당신은 이것을 당신에 설정해야합니다 initWithNibName:bundle:
또는 initWithCoder:
방법. NAV 컨트롤러로 밀면 탭 막대를 숨기고 컨텐츠보기가 하단으로 확장되도록해야합니다.
탭 바 영역의 내장 부분 인 또 다른 뷰가 있을까요? 즉, 숨기는 것입니다. 이것은 당신이 어떤 견해가 있는지 보는 데 도움이 될 것입니다.
for (UIView *viewy in [self.navigationController.view subviews])
{
NSLog([viewy description]);
}
새 뷰를 표시하면 다음 줄이 스택에있는 한 탭 막대를 숨기고 내비게이션 스택을 밀어 붙일 것임을 알았습니다.
scrollViewController.hidesBottomBarWhenPushed = YES;
문제는 당신이 여전히 탭 바 컨트롤러에 있다는 것입니다. 나는 이것에 대해서도 몇 가지 문제를 겪었고 결국 앱 대의원, 탭 바 컨트롤러 및 별도의 uiview에 대한 두 가지보기를 만들었습니다. 그것은 탭 바 컨트롤러가 명령을 내려고하는 모든 것을 가지고 있습니다. 당신은 당신의 견해를 앱 대의원에게 전달하고 아마도 그것을 사용할 수 있습니까?
TabBarControllers가 화면보다 크게보기를 시도하여 탭 막대가 화면에서 숨겨져있는 한이 작업을 수행하십시오. ~ 전에 새 ViewController가 설정되면 새 프레임을 채우도록 뷰가 크게 조정됩니다!
테스트에서 TabBarController : DUTTSELECTVIEWCONTROLLER : DELEGATE 메소드를 사용하여 컨트롤러가 현재가 될 것인지 확인하고 TabBarController.view.frame을 설정할 것인지 확인했습니다. 예를 들어:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
if( viewController == second)
tabBarController.view.frame = CGRectMake( 0, 20, 320, 500);
else
tabBarController.view.frame = CGRectMake( 0, 20, 320, 460);
}
이것이 여전히 필요한 것이 아니라면 UiviewController의 Hidesbottombar를 살펴보십시오. 예로 설정하면 컨트롤러가 내비게이션 스택으로 밀면 하단 막대가 숨어집니다.
전체 화면을 선택할 때보기를 창으로 이동합니다. 예를 들어
myView = [self.view retain];
self.view = nil;
[window addSubview:myView];
그리고 돌아가려면 :
[myView removeFromSuperView];
self.view = myView;
[myView release];
myView = nil;
창의 자식으로보기를 추가하면 완전히 전체 화면이 될 수 있으며 탭 막대 위에있을 수 있습니다.
그런 다음 이것을 결합 할 수 있습니다
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
회전을 감지합니다. (나는 당신이 이것을 View.Transform = cgaffinetransformmakerotation과 결합하여 회전하게한다고 생각합니까 ...?)
비슷한 문제가있었습니다. Harry가 언급했듯이 그것은 탭 바 컨트롤러의 내부 컨트롤러 인 내비게이션 컨트롤러의 이유라고 언급했습니다. 컨트롤러에서 다음을 추가하는 방법을 추가하여 다음과 같은 추가 방법을 찾았습니다.
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// Here you can make your tabBarControlelr.view.hidde = true or use any animation that hides UITabBar. I made
[TabBarController setTabBarHidden:YES];
self.navigationController.view.frame = CGRectMake(self.navigationController.view.frame.origin.x, self.navigationController.view.frame.origin.y, self.navigationController.view.frame.size.width, self.navigationController.view.frame.size.height + 50);
[self.navigationController.view setNeedsLayout];
}
그리고 여기에 내가 그것을 숨기는 방법은 다음과 같습니다. tabbarcontrolelr 또는 클래스 메소드 래퍼의 메소드를 직접 호출 할 수 있습니다.
+ (void)setTabBarHidden:(BOOL)hidden
{
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
TabBarController *tabBarController = (TabBarController *) delegate.window.rootViewController;
if ([tabBarController isKindOfClass:[TabBarController class]]) {
[tabBarController setTabBarHidden:hidden];
}
}
- (void)setTabBarHidden:(BOOL)hidden
{
if (self.tabBar.hidden == hidden) {
return;
}
if (hidden == NO) {
self.tabBar.hidden = hidden;
}
[UIView animateWithDuration:0.15 animations:^{
self.tabBar.frame = CGRectOffset(self.tabBar.frame, 0, ( hidden ? 50 : -50 ));
} completion:^(BOOL finished) {
self.tabBar.hidden = hidden;
}];
}
인터페이스 빌더를 사용하는 경우 Size Inspector에서 자동으로 설정되어 있는지 확인하십시오. 코드에서 uitextView를 작성하는 경우 프레임을 충분히 크게 설정하고 View의 부모 (및 부모)도 충분히 커야합니다. 단순화를 위해 뷰를 창에 직접 추가 한 다음 내면에서 안쪽으로 이동하십시오.
슈퍼 뷰로 뷰를 옮기려면 :
- (void)moveViewToSuperview:(UIView *)view
{
UIView *newSuperview = [[view superview] superview];
[view removeFromSuperview];
[newSuperview addSubview:view];
[newSuperview bringSubviewToFront:view];
}
텍스트를 "재 작성"하도록 강제하려고 시도 했습니까 (사용중인 객체의 .Text 속성을 재설정)? 뷰가 단순히 데이터를 다시 확인하거나 다시 칠하지 않는 많은 사례가 있었으며 강제력이 유일한 수정 사항 인 것 같습니다. 이것이 사용자 경험의 관점에서 좋지 않은 경우, 사용자가 터치 한 후 그리고 사라지기 전에 NAV/Tabbar를 투명하게 만들 수 있습니다. 이것은 일반적으로보기를 화면의 전체 크기로 확장합니다.
UitabbarController가 RootViewController (NavigationController)에 의해 밀려 나면 다음을 시도 할 수 있습니다.
먼저 상태 표시 줄 / 탭 표시 줄을 숨기십시오.
[self.navigationController pushViewController:aBlankViewController animated:NO];
[self.navigationController popViewControllerAnimated:NO];
조정 중에 화면이 충격을 주지만 공백을 되 찾을 수 있어야합니다.
비슷한 문제를 경험 했는데이 토론은 도움이되었습니다. iPad 크기의 Uiwebview
토니'답변은 하위 뷰를 만들 때 다음과 유사한 코드를 설정하는 것이 도움이된다는 것을 발견하는 데 도움이되었습니다.
self.tabBarController.tabBar.frame = self.view.bounds;
코드를 이렇게 준비하고 나에게 완벽하게 작동합니다.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"ViewPhoto"]) {
ImageView *vc = [segue destinationViewController];
NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];
NSString *Title = [photoNames objectAtIndex:selectedIndex];
[vc setSelectedTitle:[NSString stringWithFormat:@"%@", Title]];
vc.hidesBottomBarWhenPushed = YES;
}
}
뷰의 차원에 여분의 공간을 추가하므로 사각형 cgrectmake (0,0,320,460)라면 cgrectMake (0,0,320,480)로 만듭니다 ... 이것은 나에게 일어났습니다. 텍스트보기를 맨 위에 올려 놓는 기본보기와 관련이 있지만 차원을 추가하면 수행해야합니다.