Зміна розміру шрифту UISegmentedControl


Відповіді:


502

Я зіткнувся з тим же питанням. Цей код встановлює розмір шрифту для всього сегментованого елемента керування. Щось подібне може працювати для встановлення типу шрифту. Зауважте, що це доступно лише для iOS5 +

Obj C :

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

EDIT: UITextAttributeFontзастаріло - використовуйте NSFontAttributeNameзамість цього.

EDIT №2: для Swift 4 NSFontAttributeNameбуло змінено на NSAttributedStringKey.font.

Швидкий 5 :

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

Швидкий 4 :

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

Швидкий 3 :

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

Швидкий 2.2 :

let font = UIFont.systemFontOfSize(16)
segmentedControl.setTitleTextAttributes([NSFontAttributeName: font], 
    forState: UIControlState.Normal)

Завдяки реалізації Swift від @ audrey-gordeev


4
Це чудово працює, хоча якщо я вже зробив [mySegmentedControl setTintColor:onColor forTag:kTagOnState];і [mySegmentedControl setTintColor:offColor forTag:kTagOffState];потім застосувати [mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];тодішні кольори, які я тільки встановив, піде.
scooter133

3
доступний в iOS 5.0 або новіших версіях
rakeshNS,

8
в iOS7:NSDictionary *attributes = @{NSFontAttributeName: [UIFont boldsystemFontOfSize:12.0f]};
Джейсон Мур

2
@JasonMoore boldSystemFontOfSize:(капітал S для системи)
Гійом

1
Працює частування в iOS 8. Нагадуй ще раз, ЧОМУ немає атрибута "шрифту" ...? (Apple має багато пояснень, щоб зробити ...!)
Майк Гледхілл

52

Використовуйте API Appearance в iOS 5.0+:

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

Посилання: 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амортизовано - використовуйте NSFontAttributeNameзамість цього.
Портленд Бігун

6
Варто помітити, що це змінить шрифт ALL UISegmentedControls.
Vive

36

Ось швидка версія прийнятої відповіді:

Швидкий 3 :

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

Швидкий 2.2 :

let font = UIFont.systemFontOfSize(16)
segmentedControl.setTitleTextAttributes([NSFontAttributeName: font], 
    forState: UIControlState.Normal)

13

Інший варіант - застосувати перетворення до елемента керування. Однак він зменшить масштаб всього, включаючи контрольні межі.

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

Завдяки цьому простому робочому коду. Масштабування його до .75f в iOS6 забезпечує найкращий результат. Якщо використовується у комірці таблиці, то додайте 10 до висоти комірки.
kjoelbro

1
Це не спосіб зміни розміру шрифту в будь-якому елементі управління в iOS. Аффінна трансформація в основному призначена для використання з анімацією.
vahotm

1
Будь ласка, не масштабуйте стандартні елементи керування.
Майкл Петерсон

@MichaelPeterson було б непогано мати набагато більш настроювані стандартні елементи керування, тому нікому не потрібно робити злому, як цей.
Запорожченко Олександр

9

Швидкий стиль:

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

1
Вам слід скористатися словником швидкого стилю. [NSFontAttributeName: font]
osrl

8

Тут я оновив для 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)
    }
}

просто змінити значення числа (ofSize: 24.0)

Попередній перегляд


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

Якщо у вас є запити, зв’яжіться зі мною.


objFont повертає nilзначення.
itzmebibin

3

C # / Xamarin:

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

3

Швидкий 4

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

Помилка: Instance member 'setTitleTextAttributes' cannot be used on type 'UISegmentedControl'; did you mean to use a value of this type instead? iOS13 / Swift5
Sky

2

Даніель вказав мені на правильний шлях. Я використовував це так -

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

Розширення для UISegmentedControlнастройки розміру шрифту.

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)

Хоча цей код може відповісти на питання, надаючи інформацію про те, як і чому він вирішує проблему, поліпшується його довгострокове значення
L_J


0

Ви можете отримати фактичний шрифт для UILabel, рекурсивно вивчивши кожне з представлень, починаючи з UISegmentedControl. Я не знаю, чи це найкращий спосіб зробити це, але це працює.

@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

У наведеному вище коді я просто встановлюю колір тексту UILabel, але ви можете схопити або встановити властивість шрифту так само, як я думаю.


Це прекрасний спосіб переконатися, що оновлення iOS порушить код, який ви відправляєте своїм клієнтам. Це може працювати зараз, але немає абсолютно ніяких гарантій, що це буде працювати і надалі.
Апоорв Хатреджа

0

це для об'єктивного c, додайте своє ім'я сегментованого керування замість mysegmentedcontrol

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

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

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

сподіваюся, що це допомагає


1
- оновлення - NSDictionary * attributes = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: атрибути forState: UIControlStateNormal];
Бенні Давидовиц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.