Zmień rozmiar czcionki UISegmentedControl


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


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


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)

13

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

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

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)

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

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ź


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ą.


objFont zwraca nilwartość.
itzmebibin

3

C # / Xamarin:

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

3

Szybki 4

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

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;

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

1
 UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFont(ofSize: 16.0)],
                                                                        forKeys: [kCTFontAttributeName as! NSCopying]) as? [AnyHashable : Any],
                                                           for: UIControlState.normal)

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)

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.


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


1
- aktualizacja - NSDictionary * atrybuty = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: atrybuty forState: UIControlStateNormal];
Benny Davidovitz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.