Thay đổi kích thước phông chữ của UISegmentedControl


Câu trả lời:


502

Tôi gặp vấn đề tương tự. Mã này đặt kích thước phông chữ cho toàn bộ điều khiển được phân đoạn. Một cái gì đó tương tự có thể làm việc để thiết lập loại phông chữ. Lưu ý rằng điều này chỉ có sẵn cho iOS5 +

Obj C :

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

EDIT: UITextAttributeFontđã không được chấp nhận - sử dụng NSFontAttributeNamethay thế.

EDIT # 2: Đối với Swift 4 NSFontAttributeNameđã được đổi thành 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)

Nhờ các triển khai Swift từ @ audrey-gordeev


4
Đây hoạt động tuyệt vời, mặc dù nếu tôi đã làm một [mySegmentedControl setTintColor:onColor forTag:kTagOnState];[mySegmentedControl setTintColor:offColor forTag:kTagOffState];sau đó áp dụng [mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];sau đó Colors tôi chỉ cần đặt biến mất.
xe tay ga133

3
khả dụng trong iOS 5.0 trở lên
rakeshNS

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

2
@JasonMoore boldSystemFontOfSize:(thủ đô S cho hệ thống)
Guillaume

1
Hoạt động một điều trị trong iOS 8. Nhắc lại cho tôi, TẠI SAO không có thuộc tính "phông chữ" ...? (Apple có rất nhiều việc phải giải thích ...!)
Mike Gledhill

52

Sử dụng API giao diện trong iOS 5.0 trở lên:

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

Liên kết: http://developer.apple.com/l Library / ios / # ocumentation / UIKit / REerence / UIAppftime_Protatio / Reference / Reference.html # / // bit_Vf / doc / uid / TP40010906

http://www.raywenderlich.com/4344/user-interface-customization-in-ios-5


5
UITextAttributeFontđã được khấu hao - sử dụng NSFontAttributeNamethay thế.
Á quân Portland

6
Đáng lưu ý rằng nó sẽ thay đổi phông chữ của TẤT CẢ UISegmentedControl.
Vive

36

Đây là phiên bản Swift của câu trả lời được chấp nhận:

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

Một lựa chọn khác là áp dụng một biến đổi cho điều khiển. Tuy nhiên, nó sẽ thu nhỏ mọi thứ kể cả biên giới kiểm soát.

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

Nhờ mã làm việc đơn giản này. Chia tỷ lệ thành 0,75f trong iOS6 cung cấp kết quả tốt nhất. Nếu được sử dụng trong một ô của bảng, sau đó thêm 10 vào chiều cao của ô.
kjoelbro

1
Đây không phải là cách bạn thay đổi kích thước phông chữ trên bất kỳ điều khiển nào trong iOS. Biến đổi affine chủ yếu được sử dụng với hình ảnh động.
vahotm

1
Xin đừng quy mô kiểm soát tiêu chuẩn.
Michael Peterson

@MichaelPeterson sẽ rất tuyệt nếu có các điều khiển tiêu chuẩn tùy biến hơn nhiều, vì vậy không ai cần phải thực hiện hack như thế này.
Zaporozhchenko Oleksandr

9

Phong cách Swift:

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

1
Bạn nên sử dụng từ điển phong cách swift. [NSFontAttributeName: font]
osrl

8

Ở đây tôi đã cập nhật cho 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)
    }
}

chỉ cần thay đổi giá trị số (ofSize: 24.0)

Xem trước


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

Nếu bạn có bất kỳ câu hỏi, liên hệ với tôi.


objFont trả về nilgiá trị.
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)

Lỗi: 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 chỉ cho tôi cách chính xác. Tôi đã sử dụng nó như thế này-

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

Tiện ích mở rộng để UISegmentedControlcài đặt Cỡ chữ.

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)

Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp thông tin về cách thức và lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của nó
L_J

1

Trong swift 5,

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

0

Bạn có thể lấy phông chữ thực tế cho UILabel bằng cách kiểm tra đệ quy từng chế độ xem bắt đầu bằng UISegmentedControl. Tôi không biết nếu đây là cách tốt nhất để làm điều đó, nhưng nó hoạt động.

@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

Trong đoạn mã trên tôi chỉ cài đặt màu văn bản của UILabel, nhưng bạn có thể lấy hoặc đặt thuộc tính phông chữ mà tôi cho là.


Đây là một cách tuyệt vời để đảm bảo rằng bản cập nhật iOS sẽ phá vỡ mã mà bạn đã gửi cho khách hàng của mình. Điều này có thể hoạt động ngay bây giờ, nhưng hoàn toàn không có gì đảm bảo rằng điều này sẽ tiếp tục hoạt động trong tương lai.
Apoorv Khatreja

0

đây là mục tiêu c thêm tên điều khiển được phân đoạn của bạn thay cho mysegmentedcontrol

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

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

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

hy vọng nó giúp


1
- cập nhật - thuộc tính NSDadata * = @ {NSFontAttributionName: font}; [mySegmentedcontrol setTitleTextAttribut: thuộc tính forState: UIControlStateN normal];
Benny Davidovitz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.