UISegmentedControlのフォントサイズを変更する


回答:


502

同じ問題に遭遇しました。このコードは、セグメント化されたコントロール全体のフォントサイズを設定します。フォントタイプを設定する場合も、同様のものが機能する可能性があります。これはiOS5以降でのみ利用可能です。

Obj 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)

Swift 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)

Swift 2.2

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

@ audrey-gordeevのSwift実装に感謝


4
これはうまく機能しますが、すでにa [mySegmentedControl setTintColor:onColor forTag:kTagOnState];とaを実行している[mySegmentedControl setTintColor:offColor forTag:kTagOffState];場合、[mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];設定した色を適用 する と消えます。
scooter133

3
iOS 5.0以降で利用可能
rakeshNS 2012

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

2
@JasonMoore boldSystemFontOfSize:(システムの大文字S)
Guillaume

1
iOS 8でごちそうになりました。もう一度思い出してください。なぜ「フォント」属性がないのですか... (Appleには説明することがたくさんあります...!)
マイク・

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)

Swift 2.2

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

13

別のオプションは、コントロールに変換を適用することです。ただし、コントロールの境界線を含むすべてを縮小します。

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

この単純な作業コードのおかげで。iOS6で.75fにスケーリングすると、最良の結果が得られます。表のセルで使用する場合は、セルの高さに10を加えます。
kjoelbro 2014年

1
これは、iOSのコントロールでフォントサイズを変更する方法ではありません。アフィン変換は、主にアニメーションで使用することを目的としています。
vahotm

1
標準コントロールをスケーリングしないでください。
マイケルピーターソン

@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、Swift 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 2016年

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


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のテキストの色を設定していますが、フォントプロパティを取得または設定することもできます。


これは、iOSのアップデートによって顧客に出荷されたコードが壊れることを確認するための優れた方法です。これは今は機能するかもしれませんが、これが今後も機能し続けるという保証はありません。
Apoorv Khatreja 2018年

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];
ベニーダビド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.