เมื่อฉันนำทางไปมาระหว่างพาเรนต์และคอนโทรลเลอร์รองในตัวควบคุมการนำทางหลักโดยละเอียดฉันเห็นเงาดำทางด้านขวาของแถบนำทางที่ด้านบน เริ่มต้นหลังจากที่ฉันอัปเกรดเป็น Xcode 5.1 รู้สึกหยาบและเสียสมาธิ ฉันจะกำจัดมันได้อย่างไร?
เมื่อฉันนำทางไปมาระหว่างพาเรนต์และคอนโทรลเลอร์รองในตัวควบคุมการนำทางหลักโดยละเอียดฉันเห็นเงาดำทางด้านขวาของแถบนำทางที่ด้านบน เริ่มต้นหลังจากที่ฉันอัปเกรดเป็น Xcode 5.1 รู้สึกหยาบและเสียสมาธิ ฉันจะกำจัดมันได้อย่างไร?
คำตอบ:
self.navigationController.view.backgroundColor = [UIColor whiteColor];
ฉันแก้ไขปัญหานี้โดยการตั้งค่าสีพื้นหลังของมุมมองของตัวควบคุมการนำทาง
self.navigationController.navigationBar.translucent = NO;
สำหรับ Swift เวอร์ชันใหม่กว่า:
navigationController?.navigationBar.isTranslucent = false
navigationController.view.backgroundColor = .white
ไม่ทำงานอีกต่อไปบน iOS 11
navigationController.view.backgroundColor = .white
ทำงานบน iOS 12 การนำความโปร่งแสงออกจากแถบนำทางไม่สามารถใช้ได้ในสถานการณ์เมื่อจำเป็น แต่เงาดำไม่ได้
คำตอบของ nonamelive นั้นสมบูรณ์แบบ เพื่อให้บรรลุสิ่งเดียวกันใน Interface Builder และยังคง TRANSLUCENCYให้เลือกตัวควบคุมการนำทางและตั้งค่าแอ็ตทริบิวต์รันไทม์ที่ผู้ใช้กำหนดview.backgroundColor
ดังที่แสดงในภาพหน้าจอ (ใน Identity Inspector) ทำซ้ำสำหรับตัวควบคุมการนำทางทั้งหมดที่แสดงปัญหานี้
ดูเหมือนว่าปัญหาทั้งหมดนี้เกิดขึ้นเนื่องจากสีดำ (หรือจริงๆแล้วไม่มีสี) ของ UINavigationController รั่วไหลในเวลาที่ CoreGraphics สแนปช็อตที่ภาพเคลื่อนไหวเริ่มต้นขึ้น ดังนั้นการตั้งค่าเป็นสีขาวจะป้องกันไม่ให้
UINavigationController
ไม่ใช่บน viewController
นี่ดูเหมือนจะเป็นบั๊กที่เปิดตัวใน 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
backgroundView
. [self.toolbar valueForKey:@"_backgroundView"]
. โปรดทราบว่านี่เป็น API ส่วนตัว แต่ฉันคิดว่าคุณจะไม่ถูก Apple จับได้เพราะ_backgroundView
เป็นเพียงชื่อทั่วไป
ดูเหมือนว่าจะเกิดขึ้นกับแถบใด ๆ (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
view.backgroundColor
สำหรับ UITabBarController ของคุณในสตอรี่บอร์ดและตั้งค่าเป็นสีขาว
สิ่งนี้ใช้ได้กับฉันในSwift
ในAppDelegate
เกี่ยวกับdidFinishLaunchingWithOptions
วิธีการที่ผมตั้งนี้:
UIApplication.shared.windows.first?.backgroundColor = .white
สิ่งนี้ใช้ได้กับฉันในiOS 13 ที่มีทั้งธีมสว่างและมืดและใน iOS เวอร์ชันเก่าด้วย
เพิ่มรหัสต่อไปนี้ใน AppDelegate ในapplication(didFinishLaunchingWithOptions)
วิธีการ:
if #available(iOS 13.0, *) {
window?.backgroundColor = UIColor.systemBackground
} else {
window?.backgroundColor = UIColor.white
}
นี่คือรูปแบบของฉัน ... มันต้องใช้รหัสน้อยกว่าคำตอบของทอมมากและมีประสิทธิภาพมากกว่า นี่คือหากคุณต้องการแถบนำทางโปร่งแสงและต้องการแก้ไขปัญหาเงานั้นด้วย
ใน ViewController ต้นทาง (ที่ฝังอยู่ใน Navigation Controller) ...
- (void)viewDidAppear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = YES;
}
และ
- (void)viewWillDisappear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = NO;
}
ผลลัพธ์จะเหมือนกับสิ่งที่ทอมทำ (ทางสายตาสำหรับผู้ใช้ปลายทาง) และง่ายต่อการนำไปใช้ หวังว่านี่จะช่วยได้ ...
self.navigationController!.navigationBar.translucent = false;
สิ่งนี้ได้ผลสำหรับฉันวางไว้ในฟังก์ชันที่คุณกด ViewController ใหม่
สิ่งต่อไปนี้ยังใช้งานได้และทำให้แถบนำทางโปร่งใส:
[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
ท
หรือถ้าคุณใช้ตัวสร้างอินเทอร์เฟซคุณสามารถเลือกแถบนำทางจากตัวควบคุมการนำทางของคุณและยกเลิกการเลือกช่องทำเครื่องหมายโปร่งแสงระหว่างสไตล์และสีของแถบในตัวตรวจสอบคุณสมบัติเพื่อกำจัดเอฟเฟกต์แปลก ๆ -
darkColor
ยังมีมุมมองอยู่และทำให้เกิดปัญหานี้