Ubah ukuran font dari UISegmentedControl

222

Adakah yang bisa memberitahu saya bagaimana saya bisa mengubah jenis dan ukuran font UISegmentedControl?

Aashutosh Tiwari
sumber
1
Adakah solusi dalam IB alih-alih kode?
okysabeni

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

Johngraham
sumber
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

Michael Peterson
sumber
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)
Andrey Gordeev
sumber
13

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

segmentedControl.transform = CGAffineTransformMakeScale(.6f, .6f);
Daniel
sumber
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)
Peter Kreinz
sumber
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];
karthikeyan
sumber
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

HÄsh HÄsh
sumber
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.

Politta
sumber
nilnilai pengembalian objFont .
itzmebibin
3

C # / Xamarin:

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

Cepat 4

let font = UIFont.systemFont(ofSize: 16)
UISegmentedControl.setTitleTextAttributes([NSFontAttributeName: font], for: .normal)
menggambar ..
sumber
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;
Ved
sumber
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)
    }
 }
GameBegins
sumber
1
 UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFont(ofSize: 16.0)],
                                                                        forKeys: [kCTFontAttributeName as! NSCopying]) as? [AnyHashable : Any],
                                                           for: UIControlState.normal)
Davender Verma
sumber
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)
Pengodean saat Memuat
sumber
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.

Primc
sumber
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

gopinath
sumber
1
- pembaruan - NSDictionary * atribut = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: atribut untukState: UIControlStateNormal];
Benny Davidovitz