[objective-c] 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


답변

반투명 한 막대 (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


답변

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

AppDelegatedidFinishLaunchingWithOptions방법,이 설정 :

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


답변

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

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

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