UISegmentedControl의 글꼴 크기 변경


답변:


502

나는 같은 문제에 부딪쳤다. 이 코드는 전체 세그먼트 컨트롤의 글꼴 크기를 설정합니다. 글꼴 유형을 설정하는 데 비슷한 기능이있을 수 있습니다. iOS5 이상에서만 사용할 수 있습니다.

오브제 C :

UIFont *font = [UIFont boldSystemFontOfSize:12.0f];
NSDictionary *attributes = [NSDictionary dictionaryWithObject:font
                                                       forKey:NSFontAttributeName];
[segmentedControl setTitleTextAttributes:attributes 
                                forState:UIControlStateNormal];

편집 : UITextAttributeFont더 이상 사용되지 않습니다- NSFontAttributeName대신 사용하십시오.

편집 # 2 : Swift 4의로 NSFontAttributeName변경되었습니다 NSAttributedStringKey.font.

스위프트 5 :

let font = UIFont.systemFont(ofSize: 16)
segmentedControl.setTitleTextAttributes([NSAttributedString.Key.font: font], for: .normal)

스위프트 4 :

let font = UIFont.systemFont(ofSize: 16)
segmentedControl.setTitleTextAttributes([NSAttributedStringKey.font: font],
                                        for: .normal)

스위프트 3 :

let font = UIFont.systemFont(ofSize: 16)
segmentedControl.setTitleTextAttributes([NSFontAttributeName: font],
                                        for: .normal)

스위프트 2.2 :

let font = UIFont.systemFontOfSize(16)
segmentedControl.setTitleTextAttributes([NSFontAttributeName: font], 
    forState: UIControlState.Normal)

@ audrey-gordeev의 Swift 구현 덕분에


4
내가 이미 [mySegmentedControl setTintColor:onColor forTag:kTagOnState];[mySegmentedControl setTintColor:offColor forTag:kTagOffState];다음 적용 [mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];한 경우 방금 설정 한 색상이 사라지 더라도 이것은 훌륭하게 작동합니다 .
scooter133

3
iOS 5.0 이상에서 사용 가능
rakeshNS

8
iOS7에서 :NSDictionary *attributes = @{NSFontAttributeName: [UIFont boldsystemFontOfSize:12.0f]};
Jason Moore

2
@JasonMoore boldSystemFontOfSize:(시스템에 대한 자본 S)

1
iOS 8에서 잘 작동합니다. "font"속성이없는 이유는 무엇입니까? (Apple은 할 일이 많다 ...!)
Mike Gledhill

52

iOS 5.0 이상에서 Appearance API를 사용하십시오.

[[UISegmentedControl appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"STHeitiSC-Medium" size:13.0], UITextAttributeFont, nil] forState:UIControlStateNormal];

링크 : http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIAppearance_Protocol/Reference/Reference.html#//apple_ref/doc/uid/TP40010906

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


5
UITextAttributeFont감가 상각되었습니다- NSFontAttributeName대신 사용하십시오.
포틀랜드 러너

6
ALL UISegmentedControl의 글꼴을 변경한다는 점에 주목할 가치가 있습니다 .
Vive

36

허용되는 답변의 Swift 버전은 다음과 같습니다.

스위프트 3 :

let font = UIFont.systemFont(ofSize: 16)
segmentedControl.setTitleTextAttributes([NSFontAttributeName: font],
                                        for: .normal)

스위프트 2.2 :

let font = UIFont.systemFontOfSize(16)
segmentedControl.setTitleTextAttributes([NSFontAttributeName: font], 
    forState: UIControlState.Normal)

13

다른 옵션은 컨트롤에 변환을 적용하는 것입니다. 그러나 컨트롤 테두리를 포함하여 모든 것을 축소합니다.

segmentedControl.transform = CGAffineTransformMakeScale(.6f, .6f);

이 간단한 작업 코드 덕분입니다. iOS6에서 .75f로 조정하면 최상의 결과를 얻을 수 있습니다. 테이블 셀에 사용 된 경우 셀 높이에 10을 추가하십시오.
kjoelbro

1
이것은 iOS의 모든 컨트롤에서 글꼴 크기를 변경하는 방법이 아닙니다. Affine 변환은 주로 애니메이션과 함께 사용하기위한 것입니다.
vahotm

1
표준 컨트롤을 스케일하지 마십시오.
Michael Peterson

@MichaelPeterson은 훨씬 더 사용자 정의 가능한 표준 컨트롤을 사용하는 것이 좋으므로 아무도 이와 같은 해킹을 할 필요가 없습니다.
Zaporozhchenko Oleksandr

9

스위프트 스타일 :

UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFontOfSize(14.0)], forKeys: [NSFontAttributeName]), forState: UIControlState.Normal)

1
빠른 스타일 사전을 사용해야합니다. [NSFontAttributeName: font]
osrl

8

여기에 iOS8 용으로 업데이트되었습니다

[[UISegmentedControl appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"STHeitiSC-Medium" size:13.0], NSFontAttributeName, nil] forState:UIControlStateNormal];

7

XCode 8.1, 스위프트 3

import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFont(ofSize: 24.0)], 
        forKeys: [NSFontAttributeName as NSCopying]) as? [AnyHashable : Any], 
        for: UIControlState.normal)
    }
}

숫자 값을 변경하십시오. (ofSize: 24.0)

시사


4
// Set font-size and font-femily the way you want
UIFont *objFont = [UIFont fontWithName:@"DroidSans" size:18.0f];

// Add font object to Dictionary
NSDictionary *dictAttributes = [NSDictionary dictionaryWithObject:objFont forKey:NSFontAttributeName];

// Set dictionary to the titleTextAttributes
[yourSegment setTitleTextAttributes:dictAttributes forState:UIControlStateNormal];

질문이 있으시면 저에게 연락하십시오.


objFontnil값을 반환 합니다.
itzmebibin

3

C # / Xamarin :

segment.SetTitleTextAttributes(new UITextAttributes { 
    Font = UIFont.SystemFontOfSize(font_size) }, UIControlState.Normal);

3

스위프트 4

let font = UIFont.systemFont(ofSize: 16)
UISegmentedControl.setTitleTextAttributes([NSFontAttributeName: font], for: .normal)

오류 : Instance member 'setTitleTextAttributes' cannot be used on type 'UISegmentedControl'; did you mean to use a value of this type instead? iOS13 / Swift5
Sky

2

다니엘은 나에게 올바른 길을 알려주었습니다. 나는 이것을 이렇게 사용했다.

float scaleFactor = 0.8f;

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc]
initWithFrame:CGRectMake(10, 70, 300/scaleFactor,35)];

[segmentedControl insertSegmentWithTitle:@"..." atIndex:0 animated:NO];
[segmentedControl insertSegmentWithTitle:@"..." atIndex:1 animated:NO];
[segmentedControl insertSegmentWithTitle:@"..." atIndex:2 animated:NO];

segmentedControl.transform = CGAffineTransformMakeScale(scaleFactor, 1);
CGPoint segmentedControlCenter = segmentedControl.center;
segmentedControlCenter.x = self.center.x;
segmentedControl.center = segmentedControlCenter;

1

UISegmentedControl폰트 크기를 설정 하기 위한 확장 .

extension UISegmentedControl {
    @available(iOS 8.2, *)
    func setFontSize(fontSize: CGFloat) {
            let normalTextAttributes: [NSObject : AnyObject]!
            if #available(iOS 9.0, *) {
                normalTextAttributes = [
                    NSFontAttributeName: UIFont.monospacedDigitSystemFontOfSize(fontSize, weight: UIFontWeightRegular)
                ]
            } else {
                normalTextAttributes = [
                    NSFontAttributeName: UIFont.systemFontOfSize(fontSize, weight: UIFontWeightRegular)
                ]
            }

        self.setTitleTextAttributes(normalTextAttributes, forState: .Normal)
    }
 }

1
 UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFont(ofSize: 16.0)],
                                                                        forKeys: [kCTFontAttributeName as! NSCopying]) as? [AnyHashable : Any],
                                                           for: UIControlState.normal)

이 코드는 질문에 대답 할 수 있지만, 문제를 해결하는 방법과 이유에 대한 정보를 제공하여 장기적인 가치를 향상시킬 수 있습니다.
L_J

1

에서 swift 5,

let font = UIFont.systemFont(ofSize: 16)
UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.font: font], for: .normal)

0

UISegmentedControl로 시작하는 각 뷰를 재귀 적으로 검사하여 UILabel의 실제 글꼴을 얻을 수 있습니다. 이것이 최선의 방법인지는 모르겠지만 작동합니다.

@interface tmpSegmentedControlTextViewController : UIViewController {
}

@property (nonatomic, assign) IBOutlet UISegmentedControl * theControl;

@end

@implementation tmpSegmentedControlTextViewController

@synthesize theControl; // UISegmentedControl

- (void)viewDidLoad {
  [self printControl:[self theControl]];
  [super viewDidLoad];
}

- (void) printControl:(UIView *) view {
  NSArray * views = [view subviews];
  NSInteger idx,idxMax;
  for (idx = 0, idxMax = views.count; idx < idxMax; idx++) {
    UIView * thisView = [views objectAtIndex:idx];
    UILabel * tmpLabel = (UILabel *) thisView;
    if ([tmpLabel respondsToSelector:@selector(text)]) {
      NSLog(@"TEXT for view %d: %@",idx,tmpLabel.text);
      [tmpLabel setTextColor:[UIColor blackColor]];
    }

    if (thisView.subviews.count) {
      NSLog(@"View has subviews");
      [self printControl:thisView];
    }
  }
}

@end

위의 코드에서 UILabel의 텍스트 색상을 설정하고 있지만 font 속성을 가져 오거나 설정할 수 있습니다.


이것은 iOS 업데이트가 고객에게 제공 한 코드를 깨뜨릴 수 있도록하는 좋은 방법입니다. 이것은 지금 작동 할 수도 있지만 앞으로도 계속 작동 할 것이라는 보장은 없습니다.
Apoorv Khatreja

0

이것은 객관적 인 c 대신에 세분화 된 제어 이름을 추가하는 것입니다. mysegmentedcontrol .

UIFont *font = [UIFont systemFontOfSize:11.0f];

NSDictionary *attributes = [NSDictionary dictionaryWithObject:font
                                                            forKey:UITextAttributeFont];

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

그것이 도움이되기를 바랍니다


1
-업데이트-NSDictionary * attributes = @ {NSFontAttributeName : font}; [mySegmentedcontrol setTitleTextAttributes : attributes forState : UIControlStateNormal];
Benny Davidovitz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.