Programing

Xcode 5.1 및 iOS 7.1로 업그레이드 한 후 segue 전환 중 탐색 모음의 어두운 그림자

lottogame 2020. 9. 17. 18:49
반응형

Xcode 5.1 및 iOS 7.1로 업그레이드 한 후 segue 전환 중 탐색 모음의 어두운 그림자


마스터-디테일 탐색 컨트롤러에서 부모와 자식 컨트롤러 사이를 앞뒤로 탐색 할 때 상단 탐색 모음 오른쪽에 어두운 그림자가 표시됩니다. Xcode 5.1로 업그레이드 한 후에 시작되었습니다. 거칠고 산만하게 느껴집니다. 어떻게 제거 할 수 있습니까?


self.navigationController.view.backgroundColor = [UIColor whiteColor];

내비게이션 컨트롤러 뷰의 배경색을 설정하여이 문제를 해결했습니다.


self.navigationController.navigationBar.translucent = NO; 

고쳤다


nonamelive의 대답은 완벽합니다. Interface Builder에서 동일한 작업을 수행하고 여전히 투명성을 유지 하려면 내비게이션 컨트롤러를 선택 view.backgroundColor하고 스크린 샷 (Identity Inspector)에 표시된대로 사용자 정의 런타임 속성 설정합니다 . 이 문제를 나타내는 모든 탐색 컨트롤러에 대해 반복합니다.

애니메이션이 시작될 때 CoreGraphics가 스냅 샷을 찍을 때 UINavigationController의 검은 색 (또는 실제로는 색상이 없음)이 누출되어이 모든 문제가 발생하는 것 같습니다. 따라서 흰색으로 설정하면이를 방지 할 수 있습니다.

Identity Inspector-> 사용자 정의 런타임 속성


이것은 iOS 7.1에서 도입 된 버그 인 것 같습니다. 제 경우에는 탐색 모음 바로 아래에 위치한 UIToolbar로 인해 발생합니다. 어두운 그림자는 반투명 탭 표시 줄에도 나타납니다.

그림자는 UIToolbar의 배경보기로 인해 발생한 것 같습니다. 이제 전환하는 동안 도구 모음의 배경보기를 숨기는 도구 모음이있는보기 컨트롤러에서이 해결 방법을 사용합니다.

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) {
        BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]]
                                        && [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]);
        if (isToolbarBackgroundView) {
            *stop = YES;
        }
        return (! isToolbarBackgroundView);
    }];
    if (toolbarBackgroundView) {
        // fade toolbar background view back in
        [UIView animateWithDuration:0.1f animations:^{
            toolbarBackgroundView.alpha = 1.0f;
        }];
    }
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) {
        BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]]
                                        && [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]);
        if (isToolbarBackgroundView) {
            *stop = YES;
        }
        return (! isToolbarBackgroundView);
    }];
    if (toolbarBackgroundView) {
        // hide toolbar background view
        toolbarBackgroundView.alpha = 0.0f;
    }
}

이것은 코드입니다 [UIView findViewRecursively:]

@interface UIView (FindSubview)

- (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse;

@end

@implementation UIView (FindSubview)

- (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse {
    for (UIView* subview in self.subviews) {
        BOOL stop = NO;
        if (recurse(subview, &stop)) {
            UIView* view = [subview findViewRecursively:recurse];
            if (view) return view;
        } else if (stop) {
            return subview;
        }
    }
    return nil;
}

@end

이 레이더를 제출했습니다 : http://openradar.appspot.com/16418845


It seems to happen with any bar (TabBar or ToolBar) that is translucent.
So one way to fix it is to set the _tabBar.translucent = NO; (in my case). This prevents the undesired shadow under the top navigation bar while leaving the navigation bar translucent. Unfortunately the bottom bar is no longer translucent though.

It can be set back to translucent but all this has to happen after the whole pushing animation is finished thus switching this property is well noticeable.

In case, however the bottom bar also has to be translucent and I don't want the user to see the change I resolved it with the following:

/*  create a simple quick animation of the bottom bar
    just before pushing the new controller */
[UIView animateWithDuration:0.1
                 animations:^{
                     _tabBar.barTintColor = [UIColor colorWithWhite:0.97254901960784 alpha:1.0]; // this is the closest color for my case
                     _tabBar.translucent = NO;
                 } completion:^(BOOL finished) {
                     /* now when the animation that makes the bar not translucent
                        is finished we can push the new controller
                        the controller is instantiated before the animation code */
                     [self.navigationController pushViewController:controller animated:YES];
                 }];

Then in the viewDidAppear: I simply reverts that back:

[UIView animateWithDuration:0.1
             animations:^{
                     _tabBar.barTintColor = nil;
                     _tabBar.translucent = YES;
                 }];

There is just a little change in the appearance especially but it's barely noticeable and it's way better than having the shadow under the navigation bar.

Hope it'll help others to keep bars translucent until Apple fix this behaviour as bars ARE meant to be hidden in some cases unlike it was suggested in other posts especially for the UITabBar


This works for me in Swift

In AppDelegate on didFinishLaunchingWithOptions method, I set this:

UIApplication.shared.windows.first?.backgroundColor = .white

Here is my variation...it requires much less code than tom's answer, and is more efficient. This is IF you want a translucent navigation bar, and also want to fix that shadow problem.

In the source ViewController (that is embedded in the Navigation Controller)...

- (void)viewDidAppear:(BOOL)animated
{
     self.navigationController.navigationBar.translucent = YES;
}

and

 - (void)viewWillDisappear:(BOOL)animated
 {
     self.navigationController.navigationBar.translucent = NO;
 }

The result is the same as what Tom does (visually, to the end user), and is easier to implement. Hope this helps...


self.navigationController!.navigationBar.translucent = false;

This works for me place it inside the function where you push the new ViewController


The following also works and leaves the Navigation Bar transparent:

[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor whiteColor];


기본 iOS 구현과 동일하지는 않지만 문제를 해결하는 좋은 방법입니다.

- (void)viewWillAppear:(BOOL)animated {
    [UIView animateWithDuration:0.35f animations:^{
        self.tabBarController.tabBar.alpha = 1.0f;
    }];
}

- (void)viewWillDisappear:(BOOL)animated {
    [UIView animateWithDuration:0.35f animations:^{
        self.tabBarController.tabBar.alpha = 0.0f;
    }];
}

탭 바의 멋진 페이드 인 / 페이드 아웃 애니메이션을 얻을 수 있습니다. 루트에 코드를 추가합니다 UIViewController.


또는 인터페이스 빌더를 사용하는 경우 내비게이션 컨트롤러에서 내비게이션 바를 선택하고 Attributes Inspector에서 Style과 Bar Tint 사이의 Translucent 확인란을 선택 취소하여 이상한 효과를 제거 할 수 있습니다.

조사관

참고 URL : https://stackoverflow.com/questions/22413193/dark-shadow-on-navigation-bar-during-segue-transition-after-upgrading-to-xcode-5

반응형