Zmień rozmiar czcionki UISegmentedControl

222

Czy ktoś może mi powiedzieć, jak mogę zmienić typ i rozmiar czcionki UISegmentedControl?

Aashutosh Tiwari
źródło
1
Jakieś rozwiązania w IB zamiast kodu?
okysabeni

Odpowiedzi:

502

Natrafiłem na ten sam problem. Ten kod ustawia rozmiar czcionki dla całej kontrolki podzielonej na segmenty. Coś podobnego może działać przy ustawianiu rodzaju czcionki. Pamiętaj, że jest to dostępne tylko dla iOS5 +

Obj C :

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

EDYCJA: UITextAttributeFontzostała wycofana - użyj NSFontAttributeNamezamiast tego.

EDYCJA 2: Dla Swift 4 NSFontAttributeNamezmieniono na 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)

Dzięki implementacjom Swift od @ audrey-gordeev

johngraham
źródło
4
Działa to świetnie, ale jeśli już zrobiłem [mySegmentedControl setTintColor:onColor forTag:kTagOnState];a, a [mySegmentedControl setTintColor:offColor forTag:kTagOffState];następnie zastosuj [mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];kolory, które właśnie ustawiłem, odejdź.
scooter133
3
dostępny w iOS 5.0 lub nowszym
rakeshNS
8
w iOS7:NSDictionary *attributes = @{NSFontAttributeName: [UIFont boldsystemFontOfSize:12.0f]};
Jason Moore,
2
@JasonMoore boldSystemFontOfSize:(kapitał S dla systemu)
Guillaume
1
Działa przysmak w iOS 8. Przypomnij mi jeszcze raz, DLACZEGO nie ma atrybutu „font”…? (Apple ma wiele do zrobienia ...!)
Mike Gledhill
52

Użyj interfejsu API wyglądu w iOS 5.0+:

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

Linki: 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
źródło
5
UITextAttributeFontzostał zamortyzowany - użyj NSFontAttributeNamezamiast tego.
Portland Runner
6
Warto zauważyć, że zmieni czcionkę WSZYSTKICH UISegmentedControl.
Vive
36

Oto szybka wersja zaakceptowanej odpowiedzi:

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
źródło
13

Inną opcją jest zastosowanie transformacji do kontrolki. Zmniejszy to jednak wszystko, w tym granice kontroli.

segmentedControl.transform = CGAffineTransformMakeScale(.6f, .6f);
Daniel
źródło
Dzięki temu prostemu działającemu kodowi. Skalowanie go do .75f w iOS6 zapewnia najlepszy wynik. Jeśli jest używany w komórce tabeli, dodaj 10 do wysokości komórki.
kjoelbro
1
To nie jest sposób zmiany rozmiaru czcionki w dowolnym elemencie sterującym w systemie iOS. Transformacja afiniczna jest głównie przeznaczona do użycia z animacjami.
vahotm
1
Proszę nie skalować standardowych kontroli.
Michael Peterson
@MichaelPeterson byłoby miło mieć o wiele bardziej konfigurowalne standardowe elementy sterujące, więc nikt nie musi robić hakowania takiego jak ten.
Zaporozhchenko Oleksandr
9

Szybki styl:

UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFontOfSize(14.0)], forKeys: [NSFontAttributeName]), forState: UIControlState.Normal)
Peter Kreinz
źródło
1
Powinieneś użyć szybkiego słownika stylu. [NSFontAttributeName: font]
osrl
8

Tutaj zaktualizowałem dla iOS8

[[UISegmentedControl appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"STHeitiSC-Medium" size:13.0], NSFontAttributeName, nil] forState:UIControlStateNormal];
karthikeyan
źródło
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)
    }
}

wystarczy zmienić wartość liczbową (ofSize: 24.0)

Zapowiedź

HĘsh HĘsh
źródło
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];

Jeśli masz jakieś zapytanie, skontaktuj się ze mną.

Politta
źródło
objFont zwraca nilwartość.
itzmebibin
3

C # / Xamarin:

segment.SetTitleTextAttributes(new UITextAttributes { 
    Font = UIFont.SystemFontOfSize(font_size) }, UIControlState.Normal);
t9mike
źródło
3

Szybki 4

let font = UIFont.systemFont(ofSize: 16)
UISegmentedControl.setTitleTextAttributes([NSFontAttributeName: font], for: .normal)
rysował..
źródło
Błąd: 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 wskazał mi właściwy sposób. Użyłem tego w ten sposób

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
źródło
1

Rozszerzenie do UISegmentedControlustawiania rozmiaru czcionki.

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
źródło
1
 UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFont(ofSize: 16.0)],
                                                                        forKeys: [kCTFontAttributeName as! NSCopying]) as? [AnyHashable : Any],
                                                           for: UIControlState.normal)
Davender Verma
źródło
Chociaż ten kod może odpowiedzieć na pytanie, podanie informacji o tym, jak i dlaczego rozwiązuje problem, poprawia jego długoterminową wartość
L_J
1

w swift 5,

let font = UIFont.systemFont(ofSize: 16)
UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.font: font], for: .normal)
Kodowanie podczas ładowania
źródło
0

Rzeczywistą czcionkę dla UILabel można uzyskać, rekurencyjnie sprawdzając każdy z widoków zaczynając od UISegmentedControl. Nie wiem, czy to najlepszy sposób, ale to działa.

@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

W powyższym kodzie po prostu ustawiam kolor tekstu UILabel, ale przypuszczam, że możesz pobrać lub ustawić właściwość font.

Primc
źródło
Jest to świetny sposób, aby upewnić się, że aktualizacja iOS nie zepsuje kodu dostarczonego klientom. To może teraz działać, ale nie ma absolutnie żadnych gwarancji, że będzie działać w przyszłości.
Apoorv Khatreja
0

jest to dla celu c dodaj nazwę segmentowego sterowania zamiast mysegmentedcontrol

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

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

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

mam nadzieję, że to pomoże

gopinath
źródło
1
- aktualizacja - NSDictionary * atrybuty = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: atrybuty forState: UIControlStateNormal];
Benny Davidovitz