UIBar iOS 7 nút quay lại màu mũi tên


172

Tôi đang cố gắng thay đổi mũi tên nút quay lại

nhập mô tả hình ảnh ở đây

Tôi hiện đang sử dụng cách sau để kiểm soát kích thước văn bản cũng như màu văn bản ở nút quay lại:

[[UIBarButtonItem appearance] setTitleTextAttributes:
  [NSDictionary dictionaryWithObjectsAndKeys:
    [UIColor whiteColor], UITextAttributeTextColor,
    [UIFont boldSystemFontOfSize:16.0f], UITextAttributeFont,
    [UIColor darkGrayColor], UITextAttributeTextShadowColor,
    [NSValue valueWithCGSize:CGSizeMake(0.0, -1.0)], UITextAttributeTextShadowOffset,
  nil] forState:UIControlStateNormal];

Nhưng nếu tôi chỉ muốn thay đổi màu của mũi tên cho nút quay lại thì phải làm sao?


Bạn đã tìm thấy bất kỳ giải pháp để thay đổi màu mũi tên cho nút quay lại chưa?
OnkarK

1
@OMK Cuối cùng tôi đã thay đổi NavBarColor không chuyên nghiệp của mình để làm cho nó hoạt động và sau đó đặt navbarcolor thực tế thành một màu khác. Tôi không chắc chuyện gì đang xảy ra, nhưng giải pháp đó hiệu quả với tôi
kevinl

1
Hành vi từ một số thuộc tính của UINavigationBarđã thay đổi từ iOS 7. Hãy xem Câu trả lời để thấy tác dụng của một số Thuộc tính khác .
Bhavin

vui lòng giúp đỡ với vấn đề này: stackoverflow.com/questions/29923813/ từ
MIloš Kresović

Câu trả lời:


438

Để thay đổi màu chevron của nút quay lại cho bộ điều khiển điều hướng cụ thể *:

self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

* Nếu bạn đang sử dụng một ứng dụng có nhiều hơn 1 bộ điều khiển điều hướng và bạn muốn áp dụng màu chevron này cho từng ứng dụng, bạn có thể muốn sử dụng proxy xuất hiện để đặt chevron nút quay lại cho mọi bộ điều khiển điều hướng, như sau:

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

Và để có biện pháp tốt, nhanh chóng (cảm ơn Jay Mayu trong các bình luận):

UINavigationBar.appearance().tintColor = UIColor.whiteColor()

3
Điều này sẽ chỉ áp dụng trong toàn bộ ứng dụng nếu bạn đang sử dụng cùng một bộ điều khiển điều hướng cho toàn bộ ứng dụng của mình. Tôi thực sự khuyên bạn nên đề xuất của Bart.
Kyle Clegg

1
Tôi đã cập nhật câu trả lời của mình với một lưu ý về nhiều bộ điều khiển điều hướng. Tôi vẫn không đồng ý rằng đề xuất của Bart là câu trả lời "chính xác", bởi vì có rất nhiều tác dụng phụ khác khi bạn đặt màu sắc của toàn bộ ứng dụng. Thêm vào đó, câu hỏi ban đầu không hỏi làm thế nào để tạo chủ đề cho toàn bộ ứng dụng, nó chỉ hỏi làm thế nào để tạo chủ đề cho nút quay lại.
DiscDev

1
Điều này dường như không đặt màu của chevron trở lại.
jcampbell1

2
@ jcampbell1 - Tôi đang sử dụng ứng dụng này trong một số ứng dụng của mình thành công ... có lẽ bạn đã không đọc được cảnh báo về nhiều UINavestionControllers.
DiscDev

7
cho nhanh chóngUINavigationBar.appearance().tintColor = UIColor.whiteColor()
Jay Mayu

57

Bạn phải đặt tintColor của toàn bộ ứng dụng.

self.window.tintColor = [UIColor redColor];

Hoặc trong Swift 3:

self.window?.tintColor = UIColor.blue

Nguồn: Hướng dẫn chuyển đổi giao diện người dùng iOS 7


4
Nếu bạn chỉ muốn đặt màu của chevron nút quay lại (chứ không phải toàn bộ ứng dụng), như đã nêu trong câu hỏi ban đầu, đây là câu trả lời sai. Xem câu trả lời của tôi ở đây để có câu trả lời đúng: stackoverflow.com/a/18809412/1103584
DiscDev

Tôi đã sử dụng điều này trong đại biểu ứng dụng của mình để thay đổi các nút quay lại thành màu đen. Đặt vào phương thức applicationDidFinishLaunchingWithOptions ... window.tintColor = [UIColor blackColor];
Marc Watson

Điều này không thể hoạt động trên iOS 6. Ai đó biết phải làm gì?
Gavjr

1
Điều này khiến nó ảnh hưởng đến tintColor của toàn bộ ứng dụng, bao gồm bất kỳ UIActivityViewControll (để chia sẻ) và MFMailComposeViewControll (để gửi email). Những hộp thoại cho rằng tintColor chưa được sửa đổi với .... và có thể dẫn đến một số tương tác màu xấu.
Mike Lambert

Điều này thay đổi màu sắc của nhiều đối tượng khác, chẳng hạn như con trỏ nhấp nháy UITextField. Chắc chắn không nên.
Thợ săn Hunter

55

Bạn có thể đặt màu trên toàn bộ thanh điều hướng của ứng dụng bằng phương thức

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions{
    [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
}

23

Chỉ có thể thay đổi màu của mũi tên (không phải màu của tiêu đề nút quay lại) theo cách này:

[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

Thanh điều hướng chứa kiểu xem phụ của loại _UINavulationBarBackIndicatorView (mục cuối cùng trong mảng xem xét) đại diện cho mũi tên.

Kết quả là thanh điều hướng với các màu khác nhau của mũi tên nút quay lại và tiêu đề nút quay lại


4
Tùy thuộc vào thứ tự các cuộc phỏng vấn của các quan điểm hệ thống là một ý tưởng tồi.
Glenn Maynard

2
điều này đã làm việc, khi thiết lập self.navestionControll.navlationBar.tintColor không hoạt động.
Rich Fox

@GlennMaynard Bạn đúng cách, cách tốt nhất để thực hiện điều này là lặp đi lặp lại qua hàng loạt các cuộc phỏng vấn được trả về self.navigationController.navigationBar.subviewscho đến khi tìm thấy nút quay lại.
Evan R

@EvanR trong khi giải pháp của selmad đã làm việc cho tôi, lặp đi lặp lại qua các loạt các cuộc phỏng vấn đã không (điều mà tôi đã thử trước tiên vì tôi đồng ý với bạn rằng sẽ là khôn ngoan khi làm như vậy). Nếu nó hoạt động cho bạn- xin vui lòng thêm một ví dụ. Cảm ơn.
jungledev

22

Nếu bạn đang sử dụng bảng phân cảnh, bạn có thể đặt màu sắc của thanh điều hướng.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


Chính xác những gì tôi đang tìm kiếm. Cảm ơn bạn!
Chad Lewis

11

Bên trong rootViewControll khởi tạo navigationContoder, tôi đặt mã này bên trong phương thức viewDidAppear của mình:

//set back button color
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], UITextAttributeTextColor,nil] forState:UIControlStateNormal];
//set back button arrow color
[self.navigationController.navigationBar setTintColor:[UIColor whiteColor]];

2
UITextAttributionTextColor không được dùng trong iOS 7 - sử dụng NSForegroundColorAttributionName
amergin 17/12/13

7

Trong iOS 6, tintColor đã tô màu nền của các thanh điều hướng, thanh tab, thanh công cụ, thanh tìm kiếm và thanh phạm vi. Để tô màu nền thanh trong iOS 7, thay vào đó, hãy sử dụng thuộc tính barTintColor.

Tài nguyên thiết kế iOS 7 Hướng dẫn chuyển đổi giao diện người dùng iOS 7


2
Đây là một trong những! ... Đặt nó trong đại biểu ứng dụng. Hoạt động như một lá bùa! window.tintColor = [UIColor blackColor]; // Tôi muốn màu đen
Marc Watson

6

Bạn có thể đặt thuộc tintColortính trên nút (hoặc mục nút thanh) hoặc chế độ xem của trình điều khiển chế độ xem. Theo mặc định, thuộc tính sẽ kế thừa sắc độ từ chế độ xem chính, cho đến cấp cao UIWindownhất của ứng dụng của bạn.


1
Cảm ơn vì sự trả lời. Tuy nhiên, nó hoạt động hơi khác một chút trên iOS 7. Mã cũ của tôi đã sử dụng tintColor, nhưng iOS 7 dường như không thích nó lắm. Tôi đã kết thúc bằng cách sử dụng hướng dẫn chuyển đổi chính thức của Apple Dev iOS 7 để khắc phục một số vấn đề về giao diện người dùng
kevinl

Xem câu trả lời của tôi để biết ví dụ riêng về cách thực hiện việc này: stackoverflow.com/a/18809412/1103584
DiscDev

5

Tôi đã phải sử dụng cả hai:

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] 
                     setTitleTextAttributes:[NSDictionary 
               dictionaryWithObjectsAndKeys:[UIColor whiteColor], UITextAttributeTextColor,nil] 
                                   forState:UIControlStateNormal];

[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor whiteColor]];

Và làm việc cho tôi, cảm ơn bạn cho tất cả mọi người!


5
UINavigationBar *nbar = self.navigationController.navigationBar;

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
   //iOS 7
   nbar.barTintColor = [UIColor blueColor]; // bar color
   //or custom color 
   //[UIColor colorWithRed:19.0/255.0 green:86.0/255.0 blue:138.0/255.0 alpha:1];

   nbar.navigationBar.translucent = NO;

   nbar.tintColor = [UIColor blueColor]; //bar button item color

} else {
   //ios 4,5,6
   nbar.tintColor = [UIColor whiteColor];
   //or custom color
   //[UIColor colorWithRed:19.0/255.0 green:86.0/255.0 blue:138.0/255.0 alpha:1];

}

Tuyệt quá. Nó đã giúp đỡ tôi. Cảm ơn
Yogesh Lolusare

4

Cập nhật Swift 3

navigationController?.navigationItem.rightBarButtonItem?.tintColor = UIColor.yellow
navigationController?.navigationBar.tintColor = UIColor.red
navigationController?.navigationBar.barTintColor = UIColor.gray
navigationController?.navigationBar.titleTextAttributes =  [NSForegroundColorAttributeName: UIColor.blue]

Kết quả: nhập mô tả hình ảnh ở đây


3

Chỉ cần thay đổi NavigationBarmàu bạn có thể đặt màu sắc như bên dưới.

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

Điều này sẽ không ảnh hưởng đến màu sắc trong iOS 7. Theo các tài liệu: "Đặt thuộc tính tintColor bằng cách sử dụng API proxy xuất hiện không được hỗ trợ trong iOS 7." liên kết
bachonk

3

Trong trường hợp bạn đang thực hiện nút quay lại tùy chỉnh dựa trên UIButton bằng hình ảnh của mũi tên, đây là đoạn mã lớp con. Sử dụng nó, bạn có thể tạo nút trong mã hoặc chỉ định lớp trong Trình tạo giao diện cho bất kỳ UIButton nào. Back Arrow Image sẽ được thêm tự động và tô màu bằng màu văn bản.

@interface UIImage (TintColor)

- (UIImage *)imageWithOverlayColor:(UIColor *)color;

@end


@implementation UIImage (TintColor)

- (UIImage *)imageWithOverlayColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height);

    if (UIGraphicsBeginImageContextWithOptions) {
        CGFloat imageScale = 1.0f;
        if ([self respondsToSelector:@selector(scale)])
            imageScale = self.scale;
        UIGraphicsBeginImageContextWithOptions(self.size, NO, imageScale);
    }
    else {
        UIGraphicsBeginImageContext(self.size);
    }

    [self drawInRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(context, kCGBlendModeSourceIn);

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

@end




#import "iOS7backButton.h"

@implementation iOS7BackButton

-(void)awakeFromNib
{
    [super awakeFromNib];

    BOOL is6=([[[UIDevice currentDevice] systemVersion] floatValue] <7);
    UIImage *backBtnImage = [[UIImage imageNamed:@"backArrow"] imageWithOverlayColor:self.titleLabel.textColor];
    [self setImage:backBtnImage forState:UIControlStateNormal];
    [self setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];
    [self setImageEdgeInsets:UIEdgeInsetsMake(0, is6?0:-10, 0, 0)];


}


+ (UIButton*) buttonWithTitle:(NSString*)btnTitle andTintColor:(UIColor*)color {
    BOOL is6=([[[UIDevice currentDevice] systemVersion] floatValue] <7);
    UIButton *backBtn=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 60, 30)];
    UIImage *backBtnImage = [[UIImage imageNamed:@"backArrow"] imageWithOverlayColor:color];
    [backBtn setImage:backBtnImage forState:UIControlStateNormal];
    [backBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, is6?5:-5, 0, 0)];
    [backBtn setImageEdgeInsets:UIEdgeInsetsMake(0, is6?0:-10, 0, 0)];
    [backBtn setTitle:btnTitle forState:UIControlStateNormal];
    [backBtn setTitleColor:color /*#007aff*/ forState:UIControlStateNormal];

    return backBtn;
}

@end

hình ảnh nút quay lại @ 2x


3

Nếu bạn chỉ muốn thay đổi Mũi tên Quay lại NHƯNG trên toàn bộ ứng dụng, hãy làm điều này:

[[NSClassFromString(@"_UINavigationBarBackIndicatorView") appearance] 
  setTintColor:[UIColor colorWithHexString: @"#f00000"]];

Có một cơ hội điều này sẽ khiến bạn bị từ chối từ cửa hàng ứng dụng
Luke

@Luke, tôi đã sử dụng thành công nhiều lần. Không từ chối. Nhưng, vâng, cơ hội vẫn tồn tại.
orkenstein 6/2/2015

Vẫn có khả năng nó sẽ bị hỏng trong phiên bản iOS trong tương lai
Lope

1
@Lope, vâng, tại sao không. Tôi không tìm kiếm viên đạn bạc.
orkenstein 14/2/2015

Lặp lại qua các cuộc phỏng vấn trên iOS 10.1 cho thấy đó vẫn là tên lớp, nhưng việc thiết lập diện mạo của nó như được hiển thị ở đây không có tác dụng đối với tôi.
arlomedia

2

Trong iOS 7, bạn có thể đặt dòng mã sau vào application:didFinishLaunchingWithOptions:trong AppDelegate.mtệp của mình :

[[UINavigationBar appearance] setTintColor:myColor];

Đặt myColorthành màu bạn muốn nút quay lại trong toàn bộ ứng dụng. Không cần phải đặt nó trong mỗi tập tin.


0

Swift 2.0: Nút điều hướng màu & nút

navigationController?.navigationBar.barTintColor = UIColor.blueColor()
navigationController?.navigationBar.tintColor = UIColor.whiteColor()
navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]

0

Trong swift 3, để thay đổi màu mũi tên của nút quay lại UIBarButton

self.navigationController?.navigationBar.tintColor = UIColor.black
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.