Ubah ukuran font dari UISegmentedControl


Jawaban:


502

Saya mengalami masalah yang sama. Kode ini menetapkan ukuran font untuk seluruh kontrol tersegmentasi. Sesuatu yang serupa mungkin berfungsi untuk mengatur jenis font. Perhatikan bahwa ini hanya tersedia untuk iOS5 +

Obj C :

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

EDIT: UITextAttributeFonttelah ditinggalkan - gunakan NSFontAttributeNamesaja.

EDIT # 2: Untuk Swift 4 NSFontAttributeNametelah diubah menjadi NSAttributedStringKey.font.

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

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)

Berkat implementasi Swift dari @ audrey-gordeev


4
Ini bekerja dengan baik, meskipun jika saya telah melakukan [mySegmentedControl setTintColor:onColor forTag:kTagOnState];dan [mySegmentedControl setTintColor:offColor forTag:kTagOffState];kemudian menerapkan [mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];Warna yang baru saja saya set pergi.
scooter133

3
tersedia di iOS 5.0 atau lebih baru
rakeshNS

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

2
@JasonMoore boldSystemFontOfSize:(modal S untuk Sistem)
Guillaume

1
Berhasil di iOS 8. Ingatkan saya lagi, MENGAPA tidak ada atribut "font" ...? (Apple memiliki banyak penjelasan untuk dilakukan ...!)
Mike Gledhill

52

Gunakan API Penampilan di iOS 5.0+:

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

Tautan: 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
UITextAttributeFonttelah disusutkan - gunakan NSFontAttributeNamesaja.
Portland Runner

6
Patut diperhatikan bahwa itu akan mengubah font ALL UISegmentedControls.
Vive

36

Ini adalah versi Swift dari jawaban yang diterima:

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

Pilihan lain adalah menerapkan transformasi pada kontrol. Namun, itu akan menurunkan segalanya termasuk perbatasan kontrol.

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

Berkat kode kerja sederhana ini. Mengubahnya menjadi .75f di iOS6 memberikan hasil terbaik. Jika digunakan dalam sel tabel, maka tambahkan 10 dengan tinggi sel.
kjoelbro

1
Ini bukan cara Anda mengubah ukuran font pada kontrol apa pun di iOS. Transformasi affine sebagian besar dimaksudkan untuk digunakan dengan animasi.
vahotm

1
Tolong jangan skala kontrol standar.
Michael Peterson

@MichaelPeterson akan senang memiliki kontrol standar yang jauh lebih dapat disesuaikan, jadi tidak ada yang perlu melakukan peretasan seperti ini.
Zaporozhchenko Oleksandr

9

Gaya Swift:

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

1
Anda harus menggunakan kamus gaya cepat. [NSFontAttributeName: font]
osrl

8

Di sini saya telah memperbarui untuk 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)
    }
}

ubah saja nilai angka (ofSize: 24.0)

Pratinjau


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

Jika Anda memiliki pertanyaan, Hubungi saya.


nilnilai pengembalian objFont .
itzmebibin

3

C # / Xamarin:

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

3

Cepat 4

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

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

2

Daniel menunjuk saya ke jalan yang benar. Saya menggunakannya seperti ini-

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

Ekstensi untuk UISegmentedControlpengaturan Ukuran Font.

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)

Sementara kode ini dapat menjawab pertanyaan, memberikan informasi tentang bagaimana dan mengapa itu memecahkan masalah meningkatkan nilai jangka panjangnya
L_J

1

Di swift 5,

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

0

Anda bisa mendapatkan font yang sebenarnya untuk UILabel dengan secara rekursif memeriksa setiap tampilan yang dimulai dengan UISegmentedControl. Saya tidak tahu apakah ini cara terbaik untuk melakukannya, tetapi berhasil.

@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

Dalam kode di atas saya hanya mengatur warna teks dari UILabel, tetapi Anda bisa mengambil atau mengatur properti font juga saya kira.


Ini adalah cara terbaik untuk memastikan bahwa pembaruan iOS tidak akan memecahkan kode yang telah Anda kirim ke pelanggan Anda. Ini mungkin bekerja sekarang, tetapi sama sekali tidak ada jaminan bahwa ini akan terus bekerja di masa depan.
Apoorv Khatreja

0

ini untuk tujuan c tambahkan nama kontrol tersegmentasi Anda sebagai ganti mysegmentedcontrol

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

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

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

semoga membantu


1
- pembaruan - NSDictionary * atribut = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: atribut untukState: UIControlStateNormal];
Benny Davidovitz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.