iOS5 외관 API를 사용하여 UINavigationBar에서 제목의 글꼴 및 색상을 설정하는 방법은 무엇입니까?


90

여러 개의 뷰 컨트롤러가 있고 모두의 글꼴 색상을 빨간색으로 설정하고 싶습니다.

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

인식 할 수없는 선택기 오류가 발생합니다.

이 문제를 어떻게 해결할 수 있습니까?


그런 다음 내비게이션 바에서 레이블과보기를 설정하고 글꼴 색상을 설정해야합니다
vishiphone

답변:


207

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

또는 객체 리터럴 스타일을 선호하는 경우 :

[[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],
}];

iOS 7 이상에서 편집

UITextAttributes는 iOS 7에서 더 이상 사용되지 않으며 다음을 사용할 수 있습니다.

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
1 시간 넘게 튜토리얼의 코드 부분으로 어려움을 겪었습니다. 첫 번째 푸시 후 내비게이션 항목의 제목이 잘리는 문제 ... 내 상황에서 문제였던 글꼴 크기에 조심하세요 ... 분명히 크기 0.0 나를 위해 작동하지 않았습니다 ...
Bartu

3
새로운 사전 리터럴이 많이 예뻐 할 것
tybro0103

당신은 4를 지원하는 경우 그냥 보조 노트로이 단지 5.0입니다 다음 일을 그것의 가치 if ([navBarInstance respondsToSelector:@selector(appearance)])가 5 이하의 iOS 버전을 충돌하기 때문에 첫 번째
아담 웨이트

1
글꼴 이름이 잘못되어 앱이 충돌합니다. Arial-BoldMT와 같은 것을 시도하십시오.
MacMark

17
TIL UITextAttributeTextColorNSForegroundColorAttributeNameiOS 7에서 더 이상 사용되지 않습니다
Brenden

23

iOS 6보다 크거나 같은 배포 대상의 경우 다음을 NSShadow대신 사용해야 합니다.

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

여기에 이미지 설명 입력


19

iOS 8 이상 및 Swift에서이 작업을 수행합니다. setTitleTextAttributes외관 개체 에는 없습니다 . 대신 다음을 수행하십시오.

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

5

AppDelegate.m 클래스 didFinishLaunchingWithOptions 메서드에 몇 줄의 코드 만 추가하여이 작업을 수행했습니다.이 코드를 사용합니다.

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

그것은 나를 위해 작동합니다 ...


5

Swift에서이 작업을 수행해야하는 경우 이러한 설정을 가져 오거나 설정할 수 있도록 UINavigationBar에 대한 확장을 만들 수 있습니다.

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

그런 다음 다음과 같이 색상과 글꼴을 설정할 수 있습니다.

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

이 솔루션은 하나 titleColor또는 titleFont개별적으로 사용하는 경우 작동합니다 . 함께 사용 self.titleTextAttributes하면 변수 중 하나가 호출 될 때마다 새 값으로 설정됩니다. setter는 새 사전을 만들 때 다른 값을 가져올 수 있습니다.
user023 nov.

1

전역 설정 대신 단일 navigationBar로 사용자 정의보기를 설정하는 데 사용할 수 있습니다.

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

이 코드 줄 사용

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

이것은 당신에게 도움이 될 것이라고 생각합니다.


나는 이것을 알고있다, 나는 외관 API의 프록시 기능을 사용하려고했다
carbonr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.