เปลี่ยนขนาดตัวอักษรของ UISegmentedControl


222

ทุกคนได้โปรดบอกฉันว่าฉันจะเปลี่ยนประเภทตัวอักษรและขนาดได้UISegmentedControlอย่างไร


1
วิธีแก้ปัญหาใด ๆ ใน IB แทนที่จะเป็นรหัส?
okysabeni

คำตอบ:


502

ฉันพบปัญหาเดียวกัน รหัสนี้ตั้งค่าขนาดตัวอักษรสำหรับการควบคุมการแบ่งส่วนทั้งหมด สิ่งที่คล้ายกันอาจใช้งานได้สำหรับการตั้งค่าแบบอักษร โปรดทราบว่านี่ใช้งานได้กับ iOS5 + เท่านั้น

Obj C :

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

แก้ไข: UITextAttributeFontเลิกใช้แล้ว - ใช้NSFontAttributeNameแทน

แก้ไข # 2: สำหรับสวิฟท์ 4 ได้ถูกเปลี่ยนไปNSFontAttributeNameNSAttributedStringKey.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]};
Jason Moore

2
@JasonMoore boldSystemFontOfSize:(เมืองหลวง S สำหรับระบบ)
Guillaume

1
ใช้งานได้ดีกับ iOS 8 เตือนฉันอีกครั้งทำไมไม่มีแอตทริบิวต์ "แบบอักษร" ... (Apple มีหลายอย่างที่ต้องทำ ... !)
Mike Gledhill

52

ใช้ Appearance API ใน 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
สังเกตเห็นว่ามันคุ้มค่าที่จะเปลี่ยนแบบอักษรของทุกUISegmentedControls
Vive

36

นี่คือคำตอบที่ได้รับการยอมรับในเวอร์ชัน Swift:

สวิฟท์ 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 การแปลง Affine ส่วนใหญ่มีจุดประสงค์เพื่อใช้กับภาพเคลื่อนไหว
vahotm

1
โปรดอย่าปรับขนาดการควบคุมมาตรฐาน
Michael Peterson

@MichaelPeterson คงจะดีถ้ามีการควบคุมมาตรฐานที่ปรับแต่งได้มากกว่านี้ดังนั้นไม่มีใครต้องการแฮ็คแบบนี้
Zaporozhchenko Oleksandr

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

สวิฟต์ 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 จะทำลายรหัสที่คุณส่งให้กับลูกค้าของคุณ สิ่งนี้อาจใช้งานได้ในขณะนี้ แต่ไม่มีการรับประกันใด ๆ ว่าสิ่งนี้จะทำงานต่อไปในอนาคต
Apoorv Khatreja

0

นี่คือวัตถุประสงค์ c เพิ่มชื่อควบคุมแบ่งส่วนของคุณในตำแหน่งของmysegmentedcontrol

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

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

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

หวังว่ามันจะช่วย


1
- อัปเดต - NSDictionary * คุณลักษณะ = @ {NSFontAttributeName: font}; [mySegmentedcontrol setTitleTextAttributes: คุณลักษณะสำหรับรัฐ: UIControlStateNormal];
Benny Davidovitz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.