เงาดำบนแถบนำทางระหว่างการเปลี่ยนภาพหลังจากอัปเกรดเป็น Xcode 5.1 และ iOS 7.1


92

เมื่อฉันนำทางไปมาระหว่างพาเรนต์และคอนโทรลเลอร์รองในตัวควบคุมการนำทางหลักโดยละเอียดฉันเห็นเงาดำทางด้านขวาของแถบนำทางที่ด้านบน เริ่มต้นหลังจากที่ฉันอัปเกรดเป็น Xcode 5.1 รู้สึกหยาบและเสียสมาธิ ฉันจะกำจัดมันได้อย่างไร?

คำตอบ:


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

ฉันแก้ไขปัญหานี้โดยการตั้งค่าสีพื้นหลังของมุมมองของตัวควบคุมการนำทาง


คำตอบนี้ดีมากจริงๆ ด้วยเหตุผลบางประการตัวสร้างอินเทอร์เฟซไม่อนุญาตให้คุณเข้าถึงมุมมองของตัวควบคุมการนำทางของคุณ แต่ดูเหมือนว่าdarkColorยังมีมุมมองอยู่และทำให้เกิดปัญหานี้
superarts.org

1
นี่เป็นคำตอบที่ดีเพราะยังช่วยให้แถบยังคงโปร่งแสงในขณะที่ไม่แสดงส่วนสีดำน่าเกลียดที่ไหลผ่านจากตัวควบคุมการนำทาง แค่หวังว่าจะมีวิธีตั้งค่าในกระดานเรื่องราว
dimiguel

ตรง บางครั้งฉันคิดถึงเรื่องนี้และรู้สึกผิดหวังเล็กน้อยเกี่ยวกับคำตอบอื่น ๆ ที่แนะนำให้ปิดความโปร่งใสของแถบนำทางเนื่องจากโดยทั่วไปแล้วพวกเขากำลังแก้ปัญหานี้โดยการปิดใช้งานคุณลักษณะซึ่งคำตอบนี้ชี้ให้เห็นถึงการแก้ไขที่แท้จริง น่าเสียดายที่พฤติกรรมนี้ยังคงเหมือนเดิมใน Xcode 7 / iOS 9
superarts.org

1
ขออภัยฉันลดคะแนนคำตอบนี้เนื่องจากพื้นหลังของหน้าต่างไม่ใช่สาเหตุของปัญหานี้ โปรดดูภาพหน้าจอของฉันที่แนบมา: imgur.com/a/SH5Dpคุณจะพบว่าปัญหายังคงมีอยู่เฉดสีเข้มเพิ่งเปลี่ยนเป็นสีขาวฉันเดาว่าตัวควบคุมรายละเอียดได้รับ 'ตัด' หรืออย่างใดทำให้มันไม่ได้วาดอะไรเลยภายใต้ NavBar .
mariotaku

1
tabBarController? .view.backgroundColor = UIColor.white ในกรณีที่ root controller คือ UITabBarController
Vishal Singh

55
self.navigationController.navigationBar.translucent = NO; 

สำหรับ Swift เวอร์ชันใหม่กว่า:

navigationController?.navigationBar.isTranslucent = false

คุณวางสิ่งนี้ไว้ที่ไหน
Zorayr

ในเมธอด ViewDidLoad ของตัวควบคุมมุมมองหลัก
Nihat

add in viewDidAppear
Abdul Waheed

ฉันคิดว่านี่เป็นคำตอบที่ถูกต้อง navigationController.view.backgroundColor = .whiteไม่ทำงานอีกต่อไปบน iOS 11
AnBisw

1
@Annjawn navigationController.view.backgroundColor = .whiteทำงานบน iOS 12 การนำความโปร่งแสงออกจากแถบนำทางไม่สามารถใช้ได้ในสถานการณ์เมื่อจำเป็น แต่เงาดำไม่ได้
Alex Motor

38

คำตอบของ nonamelive นั้นสมบูรณ์แบบ เพื่อให้บรรลุสิ่งเดียวกันใน Interface Builder และยังคง TRANSLUCENCYให้เลือกตัวควบคุมการนำทางและตั้งค่าแอ็ตทริบิวต์รันไทม์ที่ผู้ใช้กำหนดview.backgroundColorดังที่แสดงในภาพหน้าจอ (ใน Identity Inspector) ทำซ้ำสำหรับตัวควบคุมการนำทางทั้งหมดที่แสดงปัญหานี้

ดูเหมือนว่าปัญหาทั้งหมดนี้เกิดขึ้นเนื่องจากสีดำ (หรือจริงๆแล้วไม่มีสี) ของ UINavigationController รั่วไหลในเวลาที่ CoreGraphics สแนปช็อตที่ภาพเคลื่อนไหวเริ่มต้นขึ้น ดังนั้นการตั้งค่าเป็นสีขาวจะป้องกันไม่ให้

ตัวตรวจสอบข้อมูลประจำตัว -> คุณสมบัติรันไทม์ที่ผู้ใช้กำหนด


1
ฉันชอบแนวทางนี้ให้ UI Builder UI มากที่สุด
DazChong

iOS 8.4 ไม่ได้ช่วย
Maksim Kniazev

3
ทำงานได้ดีกับ Xcode 8.3.3 เพียงเพื่อเน้นย้ำต้องตั้งค่าUINavigationControllerไม่ใช่บน viewController
jungledev

ฉันมี navcon ในแท็บคอนและเห็นเงาบนแท่งทั้งสอง (บนและล่าง) เมื่อใช้ "ซ่อนแถบด้านล่างเมื่อกด" บน VC ตัวใดตัวหนึ่งของ navcon การตั้งค่าพื้นหลังสีขาวบน 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
วิธีแก้ปัญหาของคุณใช้ได้ดีหากคุณไม่ต้องการแถบนำทางโปร่งแสง
ฤ.

มีวิธีที่ง่ายกว่าในการรับไฟล์backgroundView. [self.toolbar valueForKey:@"_backgroundView"]. โปรดทราบว่านี่เป็น API ส่วนตัว แต่ฉันคิดว่าคุณจะไม่ถูก Apple จับได้เพราะ_backgroundViewเป็นเพียงชื่อทั่วไป
nonamelive

คำตอบนี้ทำให้ฉันรู้ว่าฉันต้องทำอะไร ในกรณีของฉันมันง่ายเพียงแค่ยกเลิกการเลือกตัวเลือกโปร่งแสงบน 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

ในAppDelegateเกี่ยวกับdidFinishLaunchingWithOptionsวิธีการที่ผมตั้งนี้:

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

4

สิ่งนี้ใช้ได้กับฉันในiOS 13 ที่มีทั้งธีมสว่างและมืดและใน iOS เวอร์ชันเก่าด้วย

เพิ่มรหัสต่อไปนี้ใน AppDelegate ในapplication(didFinishLaunchingWithOptions)วิธีการ:

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

ฉันลองใช้วิธีนี้เช่นกัน แต่ฉันประสบปัญหาเมื่อนำเสนอตัวควบคุมมุมมองในโหมดเริ่มต้น จากนั้นคุณจะเห็นพื้นหลังสีขาวของหน้าต่างแทนที่จะเป็นสีดำ มันดูแปลก ๆ คุณช่วยแนะนำแนวคิดเพื่อเอาชนะสถานการณ์นี้ได้
varun v nair

3

นี่คือรูปแบบของฉัน ... มันต้องใช้รหัสน้อยกว่าคำตอบของทอมมากและมีประสิทธิภาพมากกว่า นี่คือหากคุณต้องการแถบนำทางโปร่งแสงและต้องการแก้ไขปัญหาเงานั้นด้วย

ใน ViewController ต้นทาง (ที่ฝังอยู่ใน Navigation Controller) ...

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

และ

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

ผลลัพธ์จะเหมือนกับสิ่งที่ทอมทำ (ทางสายตาสำหรับผู้ใช้ปลายทาง) และง่ายต่อการนำไปใช้ หวังว่านี่จะช่วยได้ ...


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

หรือถ้าคุณใช้ตัวสร้างอินเทอร์เฟซคุณสามารถเลือกแถบนำทางจากตัวควบคุมการนำทางของคุณและยกเลิกการเลือกช่องทำเครื่องหมายโปร่งแสงระหว่างสไตล์และสีของแถบในตัวตรวจสอบคุณสมบัติเพื่อกำจัดเอฟเฟกต์แปลก ๆ -

สารวัตร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.