Ändern Sie die Schriftgröße von UISegmentedControl

222

Kann mir bitte jemand sagen, wie ich den Schrifttyp und die Schriftgröße ändern kann UISegmentedControl?

Aashutosh Tiwari
quelle
1
Irgendwelche Lösungen in IB statt Code?
Okysabeni

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

Johngraham
quelle
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

Michael Peterson
quelle
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)
Andrey Gordeev
quelle
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);
Daniel
quelle
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)
Peter Kreinz
quelle
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];
karthikeyan
quelle
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

HÄsh HÄsh
quelle
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.

Politta
quelle
objFont gibt den nilWert zurück.
Itzmebibin
3

C # / Xamarin:

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

Swift 4

let font = UIFont.systemFont(ofSize: 16)
UISegmentedControl.setTitleTextAttributes([NSFontAttributeName: font], for: .normal)
zeichnete ..
quelle
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;
Ved
quelle
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)
    }
 }
GameBegins
quelle
1
 UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFont(ofSize: 16.0)],
                                                                        forKeys: [kCTFontAttributeName as! NSCopying]) as? [AnyHashable : Any],
                                                           for: UIControlState.normal)
Davender Verma
quelle
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)
Codierung beim Laden
quelle
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.

Primc
quelle
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

Gopinath
quelle
1
- update - NSDictionary * attribute = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: Attribute für Status: UIControlStateNormal];
Benny Davidovitz