Làm cách nào để đặt phông chữ và màu sắc của tiêu đề trong UINavigationBar bằng API giao diện iOS5?


90

Tôi có nhiều Bộ điều khiển Chế độ xem và tôi muốn đặt màu phông chữ của tất cả thành màu đỏ.

 [[UINavigationBar appearance] setFont:[UIFont boldSystemFontOfSize:12.0]];

đang gặp lỗi bộ chọn không được công nhận.

Làm thế nào tôi có thể sửa lỗi này?


Sau đó, bạn nên đặt nhãn và xem trên thanh điều hướng và đặt màu phông chữ
vishiphone

Câu trả lời:


207

Từ Ray Wenderlich:

http://www.raywenderlich.com/4344/user-interface-customization-in-ios-5

// Customize the title text for *all* UINavigationBars
[[UINavigationBar appearance] setTitleTextAttributes:
    [NSDictionary dictionaryWithObjectsAndKeys:
        [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0], 
        UITextAttributeTextColor, 
        [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8], 
        UITextAttributeTextShadowColor, 
        [NSValue valueWithUIOffset:UIOffsetMake(0, -1)], 
        UITextAttributeTextShadowOffset, 
        [UIFont fontWithName:@"Arial-Bold" size:0.0], 
        UITextAttributeFont, 
        nil]];

Hoặc nếu bạn thích với kiểu chữ đối tượng:

[[UINavigationBar appearance] setTitleTextAttributes:@{
    UITextAttributeTextColor: [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0],
    UITextAttributeTextShadowColor: [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8],
    UITextAttributeTextShadowOffset: [NSValue valueWithUIOffset:UIOffsetMake(0, -1)],
    UITextAttributeFont: [UIFont fontWithName:@"Arial-Bold" size:0.0],
}];

Chỉnh sửa cho iOS 7 trở lên

UITextAttributes không được dùng nữa vì iOS 7, bạn có thể sử dụng như sau:

NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor colorWithWhite:.0f alpha:1.f];
shadow.shadowOffset = CGSizeMake(0, -1);

[[UINavigationBar appearance] setTitleTextAttributes:@{
     NSForegroundColorAttributeName: [UIColor whiteColor],
     NSShadowAttributeName: shadow,
     NSFontAttributeName: [UIFont fontWithName:@"Arial-Bold" size:15.0f]
     }];

1
Trong hơn 1 giờ, tôi đã vật lộn với phần mã đó từ hướng dẫn, dẫn đến việc cắt tiêu đề mục điều hướng của tôi sau lần đẩy đầu tiên ... Hãy cẩn thận với kích thước phông chữ, đó là vấn đề trong tình huống của tôi ... Rõ ràng là kích thước 0.0 không làm việc cho tôi ...
Bartu

3
các literal từ điển mới sẽ làm cho một đẹp hơn rất nhiều
tybro0103

Cũng giống như một mặt lưu ý đây là 5.0+ chỉ, nếu bạn đang hỗ trợ 4 thì nó giá trị thực hiện if ([navBarInstance respondsToSelector:@selector(appearance)])đầu tiên bởi vì nó sẽ sụp đổ các phiên bản iOS dưới 5.
Adam Waite

1
Tên phông chữ sai và làm ứng dụng bị treo. Hãy thử một cái gì đó như Arial-BoldMT.
MacMark

17
TIL UITextAttributeTextColorkhông được chấp nhận trong NSForegroundColorAttributeNameiOS 7
Brenden

23

Đối với các mục tiêu triển khai lớn hơn hoặc bằng iOS 6, bạn nên sử dụng NSShadowthay thế:

NSShadow * shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor lightGrayColor];
shadow.shadowOffset = CGSizeMake(0, -2);

NSDictionary * navBarTitleTextAttributes =
@{ NSForegroundColorAttributeName : [UIColor redColor],
   NSShadowAttributeName          : shadow,
   NSFontAttributeName            : [UIFont systemFontOfSize:14] };

[[UINavigationBar appearance] setTitleTextAttributes:navBarTitleTextAttributes];

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


19

Làm điều này trên iOS 8+ và Swift. Không có setTitleTextAttributesđối tượng ngoại hình. Thay vào đó, hãy làm điều này:

UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : AppTheme.fontWithSize(18)]

5

Tôi đã làm điều này bằng cách chỉ thêm một vài dòng mã trong phương thức didFinishLaunchingWithOptions của lớp AppDelegate.m: Sử dụng mã này:

NSDictionary *navbarTitleTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                           [UIColor colorWithRed:255.0f/255.0f green:0.0f/255.0f blue:0.0f/255.0f alpha:1.0],UITextAttributeTextColor,
                                           [UIColor clearColor], UITextAttributeTextShadowColor,
                                           [NSValue valueWithUIOffset:UIOffsetMake(-1, 0)], UITextAttributeTextShadowOffset, nil];

[[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes];

nó phù hợp với tôi ...


5

Nếu bạn cần thực hiện việc này trong Swift, bạn có thể tạo tiện ích mở rộng cho UINavigationBar để cho phép bạn lấy hoặc đặt các cài đặt này.

extension UINavigationBar {
var titleColor: UIColor? {
    get {
        if let attributes = self.titleTextAttributes {
            return attributes[NSForegroundColorAttributeName] as? UIColor
        }
        return nil
    }
    set {
        if let value = newValue {
            self.titleTextAttributes = [NSForegroundColorAttributeName: value]
        }
    }
}

var titleFont: UIFont? {
    get {
        if let attributes = self.titleTextAttributes {
            return attributes[NSFontAttributeName] as? UIFont
        }
        return nil
    }
    set {
        if let value = newValue {
            self.titleTextAttributes = [NSFontAttributeName: value]
        }
    }
    }
}

Sau đó, bạn có thể đặt màu và phông chữ như sau:

navigationBar.titleColor = UIColor.redColor()
navigationBar.titleFont = UIFont.systemFontOfSize(12)

Tôi đoán giải pháp này hoạt động nếu bạn sử dụng một trong hai titleColorhoặc titleFontriêng lẻ. Nếu bạn sử dụng chúng cùng nhau, self.titleTextAttributesgiá trị sẽ được đặt thành giá trị mới mỗi khi một trong các biến được gọi. Bộ cài đặt có thể nhận được giá trị khác khi nó tạo từ điển mới.
user023

1

Điều này có thể được sử dụng để đặt chế độ xem tùy chỉnh thành một Thanh điều hướng duy nhất thay vì cài đặt chung

- (void)updateTitleWithString:(NSString *)title
{
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectZero];
    [headerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
    [headerView setAutoresizesSubviews:YES];

    CGFloat headFontSize = (IS_SYSTEM_DEVICE_IPAD ? 25.0f : 19.0f);
    UIFont *headFont = [UIFont boldSystemFontOfSize: headFontSize ];

    NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    [style setLineBreakMode:NSLineBreakByTruncatingTail];

    CGSize size = [title boundingRectWithSize:CGSizeMake(190,headFontSize + 6) options:NSStringDrawingUsesLineFragmentOrigin
                                   attributes:@{NSFontAttributeName : headFont, NSParagraphStyleAttributeName : style} context:nil].size;

    headerView.frame  = CGRectMake(0, 0,size.width,self.navigationController.navigationBar.frame.size.height);
    float labelHeight = headFontSize + 6;
    float labelYLoc   = (   self.navigationController.navigationBar.frame.size.height - labelHeight ) / 2;
    UILabel *label    = [[UILabel alloc] initWithFrame:CGRectMake(0,labelYLoc, size.width,labelHeight)];
    label.backgroundColor = [UIColor clearColor];
    label.adjustsFontSizeToFitWidth = YES;
    label.textAlignment = NSTextAlignmentCenter;
    label.textColor = [UIColor whiteColor];
    label.font = headFont;
    label.text = title;
    label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.4];
    label.lineBreakMode = NSLineBreakByTruncatingTail;
    label.shadowOffset = CGSizeMake(0,-1);
    label.accessibilityLabel = @"<LABEL>";
    [headerView addSubview:label];

    self.navigationItem.titleView = headerView;
}

-5

Sử dụng dòng mã này

UILabel *badge_Label=[[UILabel alloc]initWithFrame:CGRectMake(5,3, 15, 15)];
badge_Label.backgroundColor=[UIColor redcolor];
badge_Label.font=[UIFont systemFontOfSize:12];
[badge_Label setText:@"20"];
[self.navigationController.navigationBar addSubview:badgelabel];

Tôi nghĩ rằng điều này sẽ hữu ích cho bạn.


tôi biết điều này, tôi đã cố gắng sử dụng tính năng proxy của API giao diện
carbonr
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.