ChatGPT解决这个技术问题 Extra ChatGPT

更改 UISegmentedControl 的字体大小

谁能告诉我如何更改 UISegmentedControl 的字体类型和大小?

IB中的任何解决方案而不是代码?
你不能在IB中做到这一点。当前的 2021 语法是: UISegmentedControl.appearance().setTitleTextAttributes([NSAttributedString.Key.font: _font], for: .normal)

R
Ryan Stone

我遇到了同样的问题。此代码设置整个分段控件的字体大小。类似的东西可能适用于设置字体类型。请注意,这仅适用于 iOS5+

对象 C:

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

编辑:UITextAttributeFont 已被弃用 - 请改用 NSFontAttributeName

编辑 #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)

感谢@audrey-gordeev 的 Swift 实现


这很好用,但如果我已经完成了 [mySegmentedControl setTintColor:onColor forTag:kTagOnState];[mySegmentedControl setTintColor:offColor forTag:kTagOffState];,然后应用 [mySegmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];,那么我刚刚设置的颜色就会消失。
在 iOS 5.0 或更高版本中可用
在 iOS7 中:NSDictionary *attributes = @{NSFontAttributeName: [UIFont boldsystemFontOfSize:12.0f]};
@JasonMoore boldSystemFontOfSize:(系统的大写 S)
在 iOS 8 中工作是一种享受。再次提醒我,为什么没有“字体”属性......? (Apple 有很多解释要做......!)
M
Michael Peterson

在 iOS 5.0+ 中使用外观 API:

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


UITextAttributeFont 已贬值 - 请改用 NSFontAttributeName
值得注意的是它会改变所有 UISegmentedControl 的字体。
A
Andrey Gordeev

这是已接受答案的 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)

D
Daniel

另一种选择是对控件应用变换。但是,它将缩小包括控制边界在内的所有内容。

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

感谢这个简单的工作代码。在 iOS6 中将其缩放到 .75f 可提供最佳结果。如果在表格单元格中使用,则将单元格的高度加 10。
这不是您在 iOS 中更改任何控件的字体大小的方式。仿射变换主要用于动画。
请不要缩放标准控件。
@MichaelPeterson 会很高兴拥有更多可定制的标准控件,因此没有人需要像这样进行破解。
P
Peter Kreinz

迅捷风格:

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

你应该使用 swift 风格的字典。 [NSFontAttributeName: font]
k
karthikeyan

这里我更新了 iOS8

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

b
byJeevan

XCode 8.1,斯威夫特 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)

https://i.stack.imgur.com/wN2LC.png


n
np2314

swift 5 中,

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

P
Politta
// 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 值。
t
t9mike

C#/Xamarin:

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

V
Ved

丹尼尔指出我正确的方式。我是这样用的——

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;

D
Davender Verma
 UISegmentedControl.appearance().setTitleTextAttributes(NSDictionary(objects: [UIFont.systemFont(ofSize: 16.0)],
                                                                        forKeys: [kCTFontAttributeName as! NSCopying]) as? [AnyHashable : Any],
                                                           for: UIControlState.normal)

虽然此代码可能会回答问题,但提供有关其解决问题的方式和原因的信息可提高其长期价值
d
drew..

斯威夫特 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
b
byJeevan

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

F
Fattie

2021 年的正确答案。语法已更改。

12 岁的答案(甚至是对它的编辑)被打破了。

只是:

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

您很可能希望在使用时正确更改高度:

import UIKit

class SmallerSegmentedControl: UISegmentedControl {

    override init(frame: CGRect) {
        super.init(frame: frame)
        common()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        common()
    }

    func common() {
        let _font = UIFont.systemFont(ofSize: 10)
        UISegmentedControl.appearance()
         .setTitleTextAttributes([NSAttributedString.Key.font: _font], for: .normal)
    }

    override var intrinsicContentSize:CGSize {
        var s = super.intrinsicContentSize
        s.height = 24
        return s
    }

}

P
Primc

您可以通过递归检查以 UISegmentedControl 开头的每个视图来获取 UILabel 的实际字体。我不知道这是否是最好的方法,但它确实有效。

@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 更新不会破坏您交付给客户的代码的好方法。这现在可能有效,但绝对不能保证将来会继续有效。
U
Uma Madhavi

这是为了目标 c 添加您的分段控件名称代替 mysegmentedcontrol

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

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

[mySegmentedcontrol setTitleTextAttributes:attributes                                    forState:UIControlStateNormal];

希望能帮助到你


-- 更新 -- NSDictionary *attributes = @{NSFontAttributeName:font}; [mySegmentedcontrol setTitleTextAttributes:attributes forState:UIControlStateNormal];