Bóng tối trên thanh điều hướng trong quá trình chuyển đổi giả mạo sau khi nâng cấp lên Xcode 5.1 và iOS 7.1


91

Khi tôi điều hướng qua lại giữa bộ điều khiển dành cho cha mẹ và con trong bộ điều khiển điều hướng chính - chi tiết, tôi thấy bóng tối ở phía bên phải của thanh điều hướng ở trên cùng. Nó bắt đầu sau khi tôi nâng cấp lên Xcode 5.1. Nó cảm thấy thô ráp và mất tập trung. Làm sao để tôi thoát khỏi nó?

Câu trả lời:


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

Tôi đã giải quyết vấn đề này bằng cách đặt màu nền của chế độ xem của bộ điều khiển điều hướng.


Câu trả lời này thực sự rất tốt. Vì một số lý do Trình tạo giao diện không cho phép bạn truy cập chế độ xem của bộ điều khiển điều hướng, nhưng có vẻ như darkColorchế độ xem vẫn ở đó và gây ra sự cố này.
superarts.org

1
Đây là một câu trả lời tuyệt vời vì nó cũng cho phép thanh vẫn trong mờ trong khi không hiển thị phần đen xấu xí chảy ra từ bộ điều khiển điều hướng. Chỉ ước có một cách để thiết lập nó trong bảng phân cảnh.
dimiguel

Chính xác. Đôi khi tôi nghĩ về nó và hơi thất vọng về các câu trả lời khác đề xuất tắt tính trong suốt của thanh điều hướng, vì về cơ bản họ đang giải quyết vấn đề này bằng cách tắt một tính năng, câu trả lời này chỉ ra cách khắc phục thực tế. Quá xấu hành vi này vẫn được giữ nguyên trong Xcode 7 / iOS 9.
superarts.org

1
Xin lỗi, tôi đã phản đối câu trả lời này vì nền cửa sổ không phải là nguyên nhân gốc rễ của vấn đề này. Vui lòng xem ảnh chụp màn hình của tôi đính kèm: imgur.com/a/SH5Dp Bạn sẽ thấy sự cố vẫn tồn tại, bóng tối vừa được thay thế thành màu trắng, tôi đoán bộ điều khiển chi tiết đã bị 'cắt bớt' hoặc bằng cách nào đó, làm cho nó không vẽ bất cứ thứ gì trong NavBar .
mariotaku

1
tabBarController? .view.backgroundColor = UIColor.white nếu điều khiển gốc là UITabBarController.
Vishal Singh

55
self.navigationController.navigationBar.translucent = NO; 

sửa nó


Bạn đã đặt cái này ở đâu?
Zorayr

Trong phương thức ViewDidLoad của bộ điều khiển chế độ xem chính
Nihat

thêm vào viewDidAppear
Abdul Waheed

tôi nghĩ rằng đây thực sự là câu trả lời chính xác. những navigationController.view.backgroundColor = .whitekhông có tác dụng nữa trên iOS 11.
AnBisw

1
@Annjawn, navigationController.view.backgroundColor = .whitehoạt động trên iOS 12. Không thể sử dụng tính năng xóa mờ khỏi thanh điều hướng trong trường hợp cần thiết, nhưng bóng đen thì không.
Alex Motor

38

câu trả lời của nonamelive là hoàn hảo. Để đạt được điều tương tự trong Trình tạo giao diện VÀ VẪN GIỮ BẢN DỊCH , hãy chọn bộ điều khiển điều hướng và đặt thuộc tính thời gian chạy do người dùng xác định view.backgroundColornhư thể hiện trong ảnh chụp màn hình (trong Trình kiểm tra danh tính). Lặp lại cho tất cả các bộ điều khiển điều hướng hiển thị sự cố này.

Có vẻ như toàn bộ vấn đề này xảy ra do màu đen (hoặc thực sự là không có màu) của UINavigationController bị rò rỉ tại thời điểm CoreGraphics chụp nhanh nó lúc hoạt ảnh bắt đầu. Vì vậy, đặt nó thành màu trắng sẽ ngăn chặn điều đó.

Trình kiểm tra danh tính -> Thuộc tính thời gian chạy do người dùng xác định


1
Tôi thích cách tiếp cận này hơn, hãy để Giao diện người dùng tạo giao diện người dùng nhiều nhất có thể.
DazChong

iOS 8.4 không giúp
Maksim Kniazev

3
Hoạt động hoàn hảo với Xcode 8.3.3. Chỉ cần nhấn mạnh lại, phải được bật UINavigationController, không phải trên viewController.
jungledev

Tôi có một navcon trong tabcon và thấy bóng trên cả hai thanh (trên và dưới) khi sử dụng "Ẩn thanh dưới cùng khi đẩy" trên một trong các VC của navcon. Đặt nền trắng trên navcon cố định cả hai bóng. Cảm ơn!
nh32rg Ngày

6

Đây dường như là một lỗi đã được giới thiệu trong iOS 7.1. Trong trường hợp của tôi, đó là do một UIToolbar được đặt ngay bên dưới thanh điều hướng. Bóng tối cũng xuất hiện trong thanh tab mờ.

Bóng đổ dường như là do chế độ xem nền của UIToolbar. Bây giờ tôi sử dụng giải pháp thay thế này trong bộ điều khiển chế độ xem với thanh công cụ ẩn chế độ xem nền của thanh công cụ trong quá trình chuyển đổi:

- (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;
    }
}

Đây là mã cho [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

Tôi đã gửi Radar này: http://openradar.appspot.com/16418845


2
Giải pháp của bạn là tốt nếu bạn không muốn có một thanh điều hướng mờ.
tom

Có một cách dễ dàng hơn để lấy backgroundView. [self.toolbar valueForKey:@"_backgroundView"]. Xin lưu ý rằng đây là một API riêng, nhưng tôi nghĩ bạn sẽ không bị Apple bắt vì _backgroundViewchỉ là một cái tên chung chung.
nonamelive

Câu trả lời này cho tôi biết những gì tôi cần phải làm. Trong trường hợp của tôi, nó đơn giản như bỏ chọn tùy chọn trong suốt trên thanh UIToolbar trong trình tạo giao diện.
Greg W

4

Nó dường như xảy ra với bất kỳ thanh nào (TabBar hoặc ToolBar) bị mờ.
Vì vậy, một cách để sửa nó là đặt _tabBar.translucent = NO;(trong trường hợp của tôi). Điều này ngăn chặn bóng không mong muốn dưới thanh điều hướng trên cùng trong khi vẫn để thanh điều hướng trong mờ. Thật không may, thanh dưới cùng không còn trong mờ nữa.

Nó có thể được đặt trở lại trong mờ nhưng tất cả điều này phải xảy ra sau khi toàn bộ hoạt ảnh đẩy kết thúc, do đó việc chuyển đổi thuộc tính này là rất đáng chú ý.

Tuy nhiên, trong trường hợp thanh dưới cùng cũng phải trong suốt và tôi không muốn người dùng nhìn thấy thay đổi, tôi đã giải quyết bằng cách sau:

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

Sau đó, viewDidAppear:tôi chỉ cần hoàn nguyên điều đó trở lại:

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

Đặc biệt là chỉ có một chút thay đổi về ngoại hình nhưng nó hầu như không đáng chú ý và nó tốt hơn là có bóng dưới thanh điều hướng.

Hy vọng nó sẽ giúp những người khác giữ cho các thanh trong mờ cho đến khi Apple khắc phục hành vi này vì các thanh ĐƯỢC ẩn trong một số trường hợp không giống như nó được đề xuất trong các bài đăng khác, đặc biệt là đối với UITabBar


Tôi đã có thể khắc phục sự cố này bằng cách áp dụng giải pháp của @ manmal — xác định thuộc tính thời gian chạy view.backgroundColorcho UITabBarController của bạn trong bảng phân cảnh và đặt nó thành màu trắng.
jamesk

4

Điều này phù hợp với tôi trong Swift

Trong phương pháp AppDelegatetrên didFinishLaunchingWithOptions, tôi đặt điều này:

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

4

Điều này phù hợp với tôi trên iOS 13 với cả chủ đề sángtối cũng như trên các phiên bản iOS cũ hơn.

Thêm mã sau vào AppDelegate vào application(didFinishLaunchingWithOptions)phương thức:

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

Tôi cũng đã thử phương pháp này, nhưng tôi gặp sự cố khi trình bày bộ điều khiển chế độ xem ở chế độ mặc định. Sau đó, bạn sẽ thấy nền trắng của cửa sổ thay vì nền đen. Điều đó trông kỳ lạ. bạn có thể xin đề nghị bất kỳ ý tưởng để khắc phục điều này tình hình
Varun v Nair

3

Đây là biến thể của tôi ... nó yêu cầu mã ít hơn nhiều so với câu trả lời của tom, và hiệu quả hơn. Đây là NẾU bạn muốn có một thanh điều hướng mờ và cũng muốn khắc phục sự cố bóng đó.

Trong ViewController nguồn (được nhúng trong Bộ điều khiển Điều hướng) ...

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

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

Kết quả giống như những gì Tom làm (trực quan, cho người dùng cuối) và dễ thực hiện hơn. Hi vọng điêu nay co ich...


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

Điều này hoạt động đối với tôi, đặt nó bên trong hàm nơi bạn đẩy ViewController mới


Điên rồ, nhưng trong số tất cả các câu trả lời, ý tưởng đặt nó trong hàm đẩy đến VC tiếp theo là một!
Coltuxumab

3

Cách sau cũng hoạt động và làm cho Thanh điều hướng trong suốt:

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


1

Mặc dù nó không giống với triển khai iOS gốc, nhưng đây là một cách hay để khắc phục sự cố:

- (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;
    }];
}

Bạn sẽ nhận được một hoạt ảnh mờ dần / mờ dần tuyệt đẹp của thanh tab. Thêm mã trong thư mục gốc UIViewController.


-1

Hoặc nếu bạn đang sử dụng trình tạo giao diện, bạn có thể chỉ cần chọn Thanh điều hướng từ bộ điều khiển điều hướng của mình và bỏ chọn hộp kiểm Mờ giữa Kiểu và Màu thanh trong Trình kiểm tra thuộc tính để loại bỏ hiệu ứng kỳ lạ đó -

Thanh tra

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.