Ändern Sie die Schriftgröße von UISegmentedControl


Antworten:


502

Ich bin auf das gleiche Problem gestoßen. Dieser Code legt die Schriftgröße für das gesamte segmentierte Steuerelement fest. Ähnliches könnte für die Einstellung des Schrifttyps funktionieren. Beachten Sie, dass dies nur für iOS5 + verfügbar ist

Objekt C :

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

BEARBEITEN: UITextAttributeFontwurde veraltet - NSFontAttributeNamestattdessen verwenden.

EDIT # 2: Für Swift 4 NSFontAttributeNamewurde in geändert 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)

Dank der Swift-Implementierungen von @ audrey-gordeev


4
Dies funktioniert großartig, aber wenn ich bereits ein [mySegmentedControl setTintColor:onColor forTag:kTagOnState];und ein gemacht habe, [mySegmentedControl setTintColor:offColor forTag:kTagOffState];dann wenden Sie [mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];die Farben an, die ich gerade eingestellt habe.
Roller133

3
verfügbar in iOS 5.0 oder höher
rakeshNS

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

2
@ JasonMoore boldSystemFontOfSize:(Hauptstadt S für System)
Guillaume

1
Funktioniert ein Vergnügen in iOS 8. Erinnern Sie mich noch einmal, WARUM gibt es kein "Schrift" -Attribut ...? (Apple hat viel zu erklären ...!)
Mike Gledhill

52

Verwenden Sie die Darstellungs-API in iOS 5.0+:

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

Links: 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
UITextAttributeFontwurde abgeschrieben - NSFontAttributeNamestattdessen verwenden.
Portland Runner

6
Es ist bemerkenswert, dass dadurch die Schriftart von ALL UISegmentedControls geändert wird .
Vive

36

Hier ist eine Swift-Version der akzeptierten Antwort:

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

Eine andere Option besteht darin, eine Transformation auf das Steuerelement anzuwenden. Es wird jedoch alles verkleinert, einschließlich der Kontrollgrenzen.

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

Dank dieses einfachen Arbeitscodes. Die Skalierung auf .75f in iOS6 liefert das beste Ergebnis. Wenn in einer Tabellenzelle verwendet, addieren Sie 10 zur Höhe der Zelle.
Kjoelbro

1
Auf diese Weise können Sie die Schriftgröße bei keinem Steuerelement in iOS ändern. Die affine Transformation ist hauptsächlich für Animationen gedacht.
Vahotm

1
Bitte skalieren Sie keine Standardsteuerelemente.
Michael Peterson

@MichaelPeterson wäre schön, wenn die Standardsteuerelemente viel anpassbarer wären, sodass niemand so hacken muss.
Zaporozhchenko Oleksandr

9

Schneller Stil:

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

1
Sie sollten ein schnelles Wörterbuch verwenden. [NSFontAttributeName: font]
osrl

8

Hier habe ich für iOS8 aktualisiert

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

Ändern Sie einfach den Zahlenwert (ofSize: 24.0)

Vorschau


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

Wenn Sie Fragen haben, kontaktieren Sie mich.


objFont gibt den nilWert zurück.
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)

Fehler: 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 zeigte mir den richtigen Weg. Ich habe es so benutzt-

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

Erweiterung zum UISegmentedControlEinstellen der Schriftgröße.

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)

Während dieser Code die Frage beantworten kann, verbessert die Bereitstellung von Informationen darüber, wie und warum er das Problem löst, seinen langfristigen Wert
L_J

1

In swift 5,

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

0

Sie können die tatsächliche Schriftart für das UILabel ermitteln, indem Sie jede der Ansichten beginnend mit UISegmentedControl rekursiv untersuchen. Ich weiß nicht, ob dies der beste Weg ist, aber es funktioniert.

@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

Im obigen Code stelle ich nur die Textfarbe des UILabels ein, aber Sie können vermutlich auch die Schriftart-Eigenschaft abrufen oder festlegen.


Dies ist eine großartige Möglichkeit, um sicherzustellen, dass ein iOS-Update den Code, den Sie an Ihre Kunden gesendet haben, beschädigt. Dies könnte jetzt funktionieren, aber es gibt absolut keine Garantie dafür, dass dies auch in Zukunft funktioniert.
Apoorv Khatreja

0

Dies ist für das Ziel c, Ihren segmentierten Kontrollnamen anstelle von mysegmentedcontrol hinzuzufügen

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

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

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

ich hoffe es hilft


1
- update - NSDictionary * attribute = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: Attribute für Status: UIControlStateNormal];
Benny Davidovitz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.