Cambia la dimensione del carattere di UISegmentedControl


Risposte:


502

Ho riscontrato lo stesso problema. Questo codice imposta la dimensione del carattere per l'intero controllo segmentato. Qualcosa di simile potrebbe funzionare per impostare il tipo di carattere. Si noti che questo è disponibile solo per iOS5 +

Obiettivo C :

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

EDIT: UITextAttributeFontè stato deprecato - utilizzare NSFontAttributeNameinvece.

EDIT # 2: per Swift 4 NSFontAttributeNameè stato modificato in 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)

Grazie alle implementazioni Swift di @ audrey-gordeev


4
Funziona benissimo, anche se se ho già fatto un [mySegmentedControl setTintColor:onColor forTag:kTagOnState];e [mySegmentedControl setTintColor:offColor forTag:kTagOffState];poi poi applica [mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];i colori che ho appena impostato scompaiono.
scooter133,

3
disponibile in iOS 5.0 o
versioni

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

2
@JasonMoore boldSystemFontOfSize:(S maiuscola per System)
Guillaume,

1
Funziona a meraviglia in iOS 8. Ricordami di nuovo, PERCHÉ non esiste un attributo "font" ...? (Apple ha molte spiegazioni da fare ...!)
Mike Gledhill,

52

Usa l'API di aspetto in iOS 5.0+:

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

Link: 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
UITextAttributeFontè stato ammortizzato: utilizzare NSFontAttributeNameinvece.
Portland Runner,

6
Vale la pena notare che cambierà il carattere di TUTTI UISegmentedControl.
Vive il

36

Ecco una versione Swift della risposta accettata:

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

Un'altra opzione è applicare una trasformazione al controllo. Tuttavia, ridimensionerà tutto, compresi i bordi di controllo.

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

Grazie a questo semplice codice di lavoro. Il ridimensionamento a .75f in iOS6 offre il miglior risultato. Se utilizzato in una cella di tabella, quindi aggiungere 10 all'altezza della cella.
kjoelbro,

1
Questo non è il modo in cui cambi la dimensione del carattere su qualsiasi controllo in iOS. La trasformazione affine è principalmente destinata all'uso con le animazioni.
vahotm,

1
Si prega di non ridimensionare i controlli standard.
Michael Peterson,

@MichaelPeterson sarebbe bello avere controlli standard molto più personalizzabili, quindi nessuno ha bisogno di fare hack come questo.
Zaporozhchenko Oleksandr,

9

Stile rapido:

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

1
È necessario utilizzare un dizionario di stile rapido. [NSFontAttributeName: font]
osrl,

8

Qui ho aggiornato per 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)
    }
}

basta cambiare il valore numerico (ofSize: 24.0)

Anteprima


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

Se hai qualche domanda, contattami.


objFont restituisce nilvalore.
itzmebibin,

3

C # / Xamarin:

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

3

Swift 4

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

Errore: 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 mi ha indicato il modo corretto. L'ho usato in questo modo-

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

Estensione per l' UISegmentedControlimpostazione della dimensione del carattere.

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)

Mentre questo codice può rispondere alla domanda, fornendo informazioni su come e perché risolve il problema ne migliora il valore a lungo termine
L_J

1

In swift 5,

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

0

È possibile ottenere il carattere effettivo per UILabel esaminando ricorsivamente ciascuna delle viste a partire da UISegmentedControl. Non so se questo è il modo migliore per farlo, ma funziona.

@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

Nel codice sopra sto solo impostando il colore del testo di UILabel, ma potresti prendere o impostare la proprietà del carattere e suppongo.


Questo è un ottimo modo per assicurarsi che un aggiornamento di iOS interrompa il codice che hai spedito ai tuoi clienti. Questo potrebbe funzionare ora, ma non c'è assolutamente alcuna garanzia che questo continuerà a funzionare in futuro.
Apoorv Khatreja,

0

questo è per l'obiettivo c aggiungere il nome del controllo segmentato al posto di mysegmentedcontrol

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

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

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

spero che sia d'aiuto


1
- aggiorna - NSDictionary * attributi = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: attributi forState: UIControlStateNormal];
Benny Davidovitz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.