UISegmentedControl'un yazı tipi boyutunu değiştirme


Yanıtlar:


502

Ben de aynı sorunla karşılaştım. Bu kod, bölümlenmiş denetimin tamamı için yazı tipi boyutunu ayarlar. Font türünü ayarlamak için benzer bir şey işe yarayabilir. Bunun yalnızca iOS5 + için kullanılabildiğini unutmayın

Obj C :

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

EDIT: UITextAttributeFontkullanımdan kaldırıldı - NSFontAttributeNamebunun yerine kullanın.

EDIT # 2: Swift 4 NSFontAttributeNameiçin değiştirildi NSAttributedStringKey.font.

Hızlı 5 :

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

Hızlı 4 :

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

Hızlı 3 :

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

Hızlı 2.2 :

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

@ Audrey-gordeev'in Swift uygulamaları sayesinde


4
Bu harika çalışıyor, ama eğer zaten bir [mySegmentedControl setTintColor:onColor forTag:kTagOnState];ve daha [mySegmentedControl setTintColor:offColor forTag:kTagOffState];sonra uyguladıysam, [mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];o zaman yeni koyduğum Renkleri gidiyorum.
scooter133

3
iOS 5.0 veya sonraki sürümlerde kullanılabilir
rakeshNS

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

2
@JasonMoore boldSystemFontOfSize:(Sistem için başkent S)
Guillaume

1
IOS 8'de bir tedavi çalışır. Hatırlat bana, neden "font" özelliği yok ...? (Apple'ın yapması gereken çok şey var ...!)
Mike Gledhill

52

İOS 5.0 ve sonraki sürümlerinde Görünüm API'sını kullanın:

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

Bağlantılar: 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
UITextAttributeFontamortismana tabi tutuldu - NSFontAttributeNamebunun yerine kullanın.
Portland Runner

6
TÜM yazı tiplerini değiştireceğini fark etmeye değer UISegmentedControl.
Vive

36

Kabul edilen cevabın Swift versiyonu:

Hızlı 3 :

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

Hızlı 2.2 :

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

13

Başka bir seçenek de kontrole bir dönüşüm uygulamaktır. Bununla birlikte, kontrol sınırları dahil her şeyi ölçeklendirir.

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

Bu basit çalışma kodu sayesinde. İOS6'da .75f'ye ölçeklendirmek en iyi sonucu verir. Bir tablo hücresinde kullanılıyorsa, hücrenin yüksekliğine 10 ekleyin.
kjoelbro

1
Bu, iOS'taki herhangi bir kontrolde yazı tipi boyutunu değiştirme şekliniz değildir. Afin dönüşüm çoğunlukla animasyonlarla kullanılmak üzere tasarlanmıştır.
vahotm

1
Lütfen standart kontrolleri ölçeklemeyin.
Michael Peterson

@MichaelPeterson çok daha özelleştirilebilir standart kontrollere sahip olmak güzel olurdu, bu yüzden kimsenin böyle bir saldırı yapmasına gerek yok.
Zaporozhchenko Oleksandr

9

Hızlı Stil:

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

1
Hızlı stil sözlüğü kullanmalısınız. [NSFontAttributeName: font]
16:15, osrl

8

Burada iOS8 için güncelledim

[[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)
    }
}

sadece sayı değerini değiştir (ofSize: 24.0)

Ön izleme


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

Herhangi bir sorunuz varsa, Bana ulaşın.


objFontnil değer döndürür .
itzmebibin

3

C # / Xamarin:

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

3

Hızlı 4

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

Hata: 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 beni düzeltmem için işaret etti. Ben böyle kullandım.

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

UISegmentedControlYazı Tipi Boyutunu ayarlamak için uzantı .

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)

Bu kod soruyu cevaplayabilirken, sorunun nasıl ve neden
çözüldüğü hakkında

1

İçinde swift 5,

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

0

UISegmentedControl ile başlayan görünümlerin her birini yinelemeli olarak inceleyerek UILabel için gerçek yazı tipine ulaşabilirsiniz. Bunu yapmanın en iyi yolu olup olmadığını bilmiyorum, ama işe yarıyor.

@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

Yukarıdaki kodda sadece UILabel metin rengini ayarlıyorum, ama sanırım font özelliğini de kapabilir veya ayarlayabilirsiniz.


Bu, bir iOS güncellemesinin müşterilerinize gönderdiğiniz kodu bozacağından emin olmanın harika bir yoludur. Bu şimdi işe yarayabilir, ancak bunun gelecekte de çalışmaya devam edeceğine dair hiçbir garanti yoktur.
Apoorv Khatreja

0

Bu amaç c için segmentli kontrol adınızı mysegmentedcontrol yerine ekleyin

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

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

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

Umarım yardımcı olur


1
- güncelleme - NSDictionary * attributes = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: nitelikleri forState: UIControlStateNormal];
Benny Davidovitz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.