Nav Bar & Tab Bar를 숨길 때 UIView는 전체 화면으로 크기를 조정하지 않습니다.

StackOverflow https://stackoverflow.com/questions/1110052

문제

정상적인 상호 작용을위한 탭 바 및 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)로 만듭니다 ... 이것은 나에게 일어났습니다. 텍스트보기를 맨 위에 올려 놓는 기본보기와 관련이 있지만 차원을 추가하면 수행해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top