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


91

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

답변:


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

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


이 대답은 실제로 매우 좋습니다. 어떤 이유로 Interface Builder는 탐색 컨트롤러의보기에 액세스하는 것을 허용하지 않지만 darkColor보기가 여전히있는 것처럼 보이며이 문제를 발생시킵니다.
superarts.org

1
내비게이션 컨트롤러에서 흘러 나오는 못생긴 검은 색 섹션을 표시하지 않으면 서 막대를 반투명하게 유지하기 때문에 이것은 훌륭한 대답입니다. 스토리 보드에 설정하는 방법이 있었으면 좋겠습니다.
dimiguel

바로 그거죠. 때때로 나는 그것에 대해 생각하고 탐색 모음 투명성을 끄는 것을 제안하는 다른 답변에 대해 약간 실망합니다. 기본적으로 기능을 비활성화 하여이 문제를 해결하기 때문에이 답변은 실제 수정 사항을 지적합니다. 너무 나쁜이 동작은 / 아이폰 OS 9 엑스 코드 (7)에 동일하게 유지
superarts.org

1
죄송합니다. 창 배경 이이 문제의 근본 원인이 아니기 때문에이 답변을 거절했습니다. 첨부 된 내 스크린 샷을 참조하십시오. imgur.com/a/SH5Dp 문제가 여전히 존재하고 어두운 음영이 흰색으로 바뀜 , 세부 정보 컨트롤러가 '잘린'것 같습니다. .
mariotaku

1
tabBarController? .view.backgroundColor = 루트 컨트롤러가 UITabBarController 인 경우 UIColor.white.
Vishal Singh

55
self.navigationController.navigationBar.translucent = NO; 

고쳤다


이거 어디에 두 었어?
Zorayr

마스터 뷰 컨트롤러의 ViewDidLoad 메서드에서
Nihat

viewDidAppear에 추가
압둘 와히드에게

나는 이것이 실제로 정답이라고 생각합니다. 는 navigationController.view.backgroundColor = .white아이폰 OS (11)에 더 이상 작동하지 않습니다
AnBisw

1
@Annjawn navigationController.view.backgroundColor = .white은 iOS 12 에서 작동합니다. 필요한 경우 탐색 모음에서 반투명을 제거하는 것은 사용할 수 없지만 검은 그림자는 사용할 수 없습니다.
Alex Motor

38

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

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

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


1
저는이 접근 방식을 선호합니다. Interface Builder UI는 가능한 한 많이 사용합니다.
DazChong

iOS 8.4는 도움이되지 않았습니다
Maksim Kniazev 2016

3
Xcode 8.3.3과 완벽하게 작동합니다. 다시 강조 UINavigationController하려면 viewController가 아닌 on 으로 설정해야합니다 .
jungledev

나는 tabcon에 navcon을 가지고 있었고 navcon의 VC 중 하나에서 "Hide bottom bar on push"를 사용할 때 양쪽 막대 (상단 및 하단)에 그림자를 보았습니다. navcon에 흰색 배경을 설정하면 두 그림자가 모두 수정되었습니다. 감사!
nh32rg

6

이것은 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


2
반투명 탐색 모음을 원하지 않는 경우 솔루션이 좋습니다.
tom

.NET Framework를 더 쉽게 얻을 수있는 방법이 backgroundView있습니다. [self.toolbar valueForKey:@"_backgroundView"]. 이것은 개인 API이지만 _backgroundView일반적인 이름 이기 때문에 Apple에 잡히지 않을 것이라고 생각합니다 .
nonamelive 2014 년

이 대답은 내가해야 할 일을 알려주었습니다. 제 경우에는 인터페이스 빌더의 UIToolbar에서 반투명 옵션을 선택 취소하는 것처럼 간단했습니다.
Greg W

4

반투명 한 막대 (TabBar 또는 ToolBar)에서 발생하는 것 같습니다.
그래서 그것을 고치는 한 가지 방법은 _tabBar.translucent = NO;(제 경우) 를 설정하는 것입니다 . 이렇게하면 탐색 모음을 반투명으로 유지하면서 상단 탐색 모음 아래에 원하지 않는 그림자가 생기는 것을 방지 할 수 있습니다. 불행히도 하단 막대는 더 이상 반투명하지 않습니다.

반투명으로 다시 설정할 수 있지만이 모든 작업은 전체 푸시 애니메이션이 완료된 후에 발생해야하므로이 속성을 전환하는 것이 눈에 잘 띄게됩니다.

그러나 하단 막대도 반투명해야하며 사용자가 변경 사항을 보지 않기를 원합니다.

/*  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];
                 }];

그런 다음 viewDidAppear:간단히 되돌립니다.

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

특히 외형에 약간의 변화가 있지만 거의 눈에 띄지 않으며 탐색 모음 아래에 그림자를 두는 것보다 훨씬 좋습니다.

바는 특히 다른 게시물에서 제안 된 것과는 달리 일부 경우에 막대가 숨겨지기 때문에 Apple이이 동작을 수정할 때까지 다른 사람들이 막대를 반투명하게 유지하는 데 도움이되기를 바랍니다. UITabBar


@manmal의 솔루션을 채택하여이 문제를 해결할 수있었습니다 view.backgroundColor. 스토리 보드에서 UITabBarController 의 런타임 속성 을 정의하고 흰색으로 설정했습니다.
jamesk

4

이것은 Swift 에서 나를 위해 작동합니다.

AppDelegatedidFinishLaunchingWithOptions방법,이 설정 :

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

4

에 나를 위해이 작품 아이폰 OS (13) 모두 어두운 주제와도 이전의 iOS 버전.

application(didFinishLaunchingWithOptions)메서드 의 AppDelegate에 다음 코드를 추가합니다 .

if #available(iOS 13.0, *) {
    window?.backgroundColor = UIColor.systemBackground
} else {
    window?.backgroundColor = UIColor.white
}

나도이 방법을 시도했지만 기본 모드에서 뷰 컨트롤러를 표시 할 때 문제가 발생합니다. 그러면 검은 색 대신 창의 흰색 배경이 표시됩니다. 이상해 보입니다. 당신은이 상황을 극복하기 위해 어떤 아이디어를 제안하십시오 수 있습니다
하기 Varun 브이 나이 르

3

여기에 내 변형이 있습니다 ... 톰의 대답보다 훨씬 적은 코드가 필요하며 더 효율적입니다. 반투명 탐색 모음을 원하고 그림자 문제를 수정하려는 경우입니다.

소스 ViewController (탐색 컨트롤러에 포함됨)에서 ...

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

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

결과는 Tom이 수행하는 작업 (시각적으로 최종 사용자에게)과 동일하며 구현하기가 더 쉽습니다. 도움이 되었기를 바랍니다...


3
self.navigationController!.navigationBar.translucent = false;

이것은 새로운 ViewController를 푸시하는 함수 내부에 배치합니다.


미쳤지 만 모든 답변 중에서 다음 VC로 푸시하는 기능에 배치한다는 아이디어가 바로 그것입니다!
Coltuxumab

3

다음도 작동하며 탐색 모음을 투명하게 유지합니다.

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


1

기본 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.


-1

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

조사관

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.