Cách thay đổi màu phông chữ của UISegmentedControl


81

Tôi cố gắng thay đổi màu phông chữ từ trắng sang đen cho UISegmentedControl(dành cho iOS 4. *)

UISegmentedControl *button = [[[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:itemTitle, nil]] autorelease];
button.momentary = YES;
button.segmentedControlStyle = UISegmentedControlStyleBar;
button.tintColor = [UIColor redColor];      
for (id segment in [button subviews]) {
    for (id label in [segment subviews]) {
        if ([label isKindOfClass:[UILabel class]]) {
            UILabel *titleLabel = (UILabel *) label;
            [titleLabel setTextColor:[UIColor blackColor]];
        }
    }
}
UIBarButtonItem *barButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease];

Nhưng màu văn bản không thay đổi. Tôi nên làm gì để thay đổi màu văn bản UISegmentedControl?

Câu trả lời:


128

Trong iOS 6.0 trở lên, nó rất đơn giản:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                            [UIFont boldSystemFontOfSize:17], NSFontAttributeName,
                            [UIColor blackColor], NSForegroundColorAttributeName,
                            nil];
[_segmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];
NSDictionary *highlightedAttributes = [NSDictionary dictionaryWithObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
[_segmentedControl setTitleTextAttributes:highlightedAttributes forState:UIControlStateSelected];

bất kỳ ý tưởng về việc thay đổi loại phông chữ?
Vaibhav Saran

[UIFont fontWithName:@"HelveticaNeue" size:17.0f]
pbibergal

Bất kỳ ý tưởng nào có thể khiến điều này không hoạt động? Trong một thử nghiệm, tôi đặt màu văn bản thành màu xanh lá cây, nhưng mọi thứ vẫn là mặc định (Văn bản màu xám trên nền xám nhạt hoặc văn bản màu trắng trên nền xanh lam nếu được đánh dấu. Đó là iOS6. IOS7 mặc định là màu trắng / trong.) Cảm ơn!
Olie

mô tả chi tiết được cung cấp tại datacalculation.blogspot.in/2014/10/…
Thử nghiệm iOS

10
Thử nghiệm trên iOS 8.1, dòng cuối cùng của câu trả lời này nên thay đổi từ UIControlStateHighlightedthành UIControlStateSelectedđể đạt được hiệu quả mong muốn.
ham học hỏi

87

Nếu bạn cần thay đổi màu văn bản của phân đoạn được đánh dấu trong iOS 7, đây là một giải pháp (tôi đã mất một lúc để tìm, nhưng nhờ bài đăng này ):

Objective-C

[[UISegmentedControl appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor blackColor]} forState:UIControlStateSelected];

Nhanh

  let titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]  
  UISegmentedControl.appearance().setTitleTextAttributes(titleTextAttributes, forState: .Selected)

Tuyệt quá. Bạn có thể theo dõi thông tin chi tiết tại datacalculation.blogspot.in/2014/10/…
Thử nghiệm iOS

Câu trả lời này cuối cùng đã giúp tôi hoàn thành các yêu cầu vào nút lựa chọn các ứng dụng của tôi, trước đây trong đó có một cách để giữ sự kiểm soát phân đoạn trong một UIView siêu để làm cho vuông biên giới ....
KoreanXcodeWorker

Đối với Swift 5:var titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] UISegmentedControl.appearance().setTitleTextAttributes(titleTextAttributes, for: .normal)
Eric

55

mã để đặt cả hai trạng thái màu phông chữ thành màu đen

Swift 5

    let titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black]
    segmentedControl.setTitleTextAttributes(titleTextAttributes, for: .normal)
    segmentedControl.setTitleTextAttributes(titleTextAttributes, for: .selected)

Swift 4

    let titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.black]
    segmentedControl.setTitleTextAttributes(titleTextAttributes, for: .normal)
    segmentedControl.setTitleTextAttributes(titleTextAttributes, for: .selected)

Không hoạt động cho iOS 13 và Swift 5, Xcode không thể nhận dạng segmentedControlnữa
Sky

1
@Sky, chỉ cần thêm một chút sửa lỗi trên segmentedControl của ứng dụng của tôi hôm nay và giải pháp này đã hoạt động trên iOS 13.2 và Swift5.
ChuckZHB

31

Dưới đây là mã để đặt phông chữ thành kích thước mặt đậm và điểm:

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

Tôi hy vọng nó sẽ giúp


4
Thận trọng: câu trả lời này yêu cầu iOS 5.
Costique

1
Câu trả lời này không thay đổi màu phông chữ như người khởi xướng chủ đề yêu cầu, chỉ thay đổi kích thước phông chữ. câu trả lời của pbibergal là đầy đủ hơn.
Terrabythia 19/12/12

Điều này hoạt động, nhưng cảnh báo sắp tới cho UITextAttributeFont không được dùng nữa. Thay vào đó, hãy sử dụng "NSFontAttributeName". Tất cả là nhờ @johngraham từ stackoverflow.com/questions/2280391/…
mavericks

15

Cập nhật cho iOS 14 và Swift 5:

extension UISegmentedControl
{
    func defaultConfiguration(font: UIFont = UIFont.systemFont(ofSize: 12), color: UIColor = UIColor.white)
    {
        let defaultAttributes = [
            NSAttributedString.Key.font: font,
            NSAttributedString.Key.foregroundColor: color
        ]
        setTitleTextAttributes(defaultAttributes, for: .normal)
    }

    func selectedConfiguration(font: UIFont = UIFont.boldSystemFont(ofSize: 12), color: UIColor = UIColor.red)
    {
        let selectedAttributes = [
            NSAttributedString.Key.font: font,
            NSAttributedString.Key.foregroundColor: color
        ]
        setTitleTextAttributes(selectedAttributes, for: .selected)
    }
}

Đã cập nhật cho Swift 4 - Sử dụng Tiện ích mở rộng này (vì tiện ích mở rộng luôn tuyệt vời .. !!)

extension UISegmentedControl {

func defaultConfiguration(font: UIFont = UIFont.systemFont(ofSize: 12), color: UIColor = UIColor.gray) {
    let defaultAttributes = [
        NSAttributedStringKey.font.rawValue: font,
        NSAttributedStringKey.foregroundColor.rawValue: color
    ]
    setTitleTextAttributes(defaultAttributes, for: .normal)
}

func selectedConfiguration(font: UIFont = UIFont.boldSystemFont(ofSize: 12), color: UIColor = UIColor.red) {
    let selectedAttributes = [
        NSAttributedStringKey.font.rawValue: font,
        NSAttributedStringKey.foregroundColor.rawValue: color
    ]
    setTitleTextAttributes(selectedAttributes, for: .selected)
}
}

và từ lớp tương ứng, bạn có thể sử dụng chức năng này,

@IBOutlet weak var segment: UISegmentedControl!

segment.defaultConfiguration()
// or provide paramater as per your requirement
segment.selectedConfiguration(color: .blue)

6
for (UIView *v in [[[segment subviews] objectAtIndex:0] subviews]) {
    if ([v isKindOfClass:[UILabel class]]) {
        UILabel *label=(UILabel *)[v retain];
        lable.textColor=[UIColor blackColor];
    }
}

cho iOS 3.0 trở lên


6
Cảnh báo: bạn không nên giữ lại nhãn.
Costique 19/02/12

5

Chỉ trong trường hợp giúp người khác đến đó và đang làm việc bằng cách sử dụng nhanh chóng.

Tôi sẽ đưa ra hai cách có thể để làm điều đó. Bạn có thể thay đổi các thuộc tính văn bản trong UIAppearancehoặc trực tiếp trong phân đoạn mà bạn đang làm việc.

Ví dụ đầu tiên đặt các thuộc tính trong giao diện, theo cách này, bạn sẽ tùy chỉnh tất cả các điều khiển được phân đoạn trong ứng dụng của mình:

    let attributes = [ NSForegroundColorAttributeName : UIColor.grayColor(),
        NSFontAttributeName : UIFont.systemFontOfSize(20)];
    let attributesSelected = [ NSForegroundColorAttributeName : UIColor.blueColor(),
        NSFontAttributeName : UIFont.systemFontOfSize(20)];
    UISegmentedControl.appearance().setTitleTextAttributes(attributes, forState: UIControlState.Normal)
    UISegmentedControl.appearance().setTitleTextAttributes(attributesSelected, forState: UIControlState.Selected)

Ví dụ thứ hai, trực tiếp trong phân đoạn, sẽ chỉ tùy chỉnh được phân đoạn này:

    let attributes = [ NSForegroundColorAttributeName : UIColor.grayColor(),
        NSFontAttributeName : UIFont.systemFontOfSize(20)];
    let attributesSelected = [ NSForegroundColorAttributeName : UIColor.blueColor(),
        NSFontAttributeName : UIFont.systemFontOfSize(20)];
    segmented.setTitleTextAttributes(attributes, forState: UIControlState.Normal)
    segmented.setTitleTextAttributes(attributesSelected, forState: UIControlState.Selected)

5

Tiện ích mở rộng Swift 5

extension UISegmentedControl {

    func setTitleColor(_ color: UIColor, state: UIControl.State = .normal) {
        var attributes = self.titleTextAttributes(for: state) ?? [:]
        attributes[.foregroundColor] = color
        self.setTitleTextAttributes(attributes, for: state)
    }
    
    func setTitleFont(_ font: UIFont, state: UIControl.State = .normal) {
        var attributes = self.titleTextAttributes(for: state) ?? [:]
        attributes[.font] = font
        self.setTitleTextAttributes(attributes, for: state)
    }

}

4

nhanh chóng 3.2:

let attributes = [
                          NSFontAttributeName : bigTextFont,
                          NSForegroundColorAttributeName : UIColor.blue,
                          ]         
segmentedControl?.setTitleTextAttributes(attributes, for: .normal)

lưu ý: nếu Bạn sử dụng màu nền tùy chỉnh, bạn sẽ thấy trục trặc ở các góc (màu sẽ lấp đầy các phân đoạn bên ngoài ..), vì vậy hãy sử dụng dòng này để cắt nó:

segmentedControl!.layer.cornerRadius = 4.0
segmentedControl!.clipsToBounds = true

4

trong Swift 5, bạn có thể thay đổi màu bằng cú pháp này

Swift 5

let titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.red]
groupSegment.setTitleTextAttributes(titleTextAttributes, for: .selected)

2

Trong iOS 5.0 trở lên, bạn có thể sử dụng titleTextAttributes để tùy chỉnh UISegmentedControlcác đối tượng:

NSDictionary *segmentedControlTextAttributes = @{NSFontAttributeName:[UIFont fontWithName:@"HelveticaNeue" size:18.0], NSForegroundColorAttributeName:[UIColor whiteColor]};
[self.segmentedControl setTitleTextAttributes:segmentedControlTextAttributes forState:UIControlStateNormal];
[self.segmentedControl setTitleTextAttributes:segmentedControlTextAttributes forState:UIControlStateHighlighted];
[self.segmentedControl setTitleTextAttributes:segmentedControlTextAttributes forState:UIControlStateSelected];

Ở đây tôi đặt phông chữ thành phông chữ tùy chỉnh, cỡ chữ, màu sắc cho từng trạng thái của UISegmentedControl .

Bạn sẽ tìm thấy mọi tùy chỉnh đơn giản có thể có trong phần Tùy chỉnh Giao diện của Tham chiếu Lớp UISegmentedControl.


1

Tôi đang sử dụng monotouch. Tôi không biết tại sao, nhưng khi Chế độ xem được đẩy, màu văn bản không thay đổi đối với tôi. để giải quyết vấn đề này, tôi chỉ cần thêm nhãn vào superview kiểm soát phân đoạn và sau đó thay đổi màu của chúng:

public static void SetColoredTittles(this UISegmentedControl s, string[] titles, UIColor selected, UIColor notSelected)
{ 
    var segmentedLabels = new List<UILabel>();
    float width = s.Frame.Width/titles.Length;

    for (int i = 0; i < titles.Length; i++)
    {
        var frame = new RectangleF(s.Frame.X + i*width, s.Frame.Y, width,s.Frame.Height);
        UILabel label = new UILabel(frame);
        label.TextAlignment = UITextAlignment.Center;
        label.BackgroundColor = UIColor.Clear;
        label.Font = UIFont.BoldSystemFontOfSize(12f);
        label.Text = titles[i];
        s.Superview.AddSubview(label);
        segmentedLabels.Add(label);
    }

    s.ValueChanged += delegate
    {
        TextColorChange(s,segmentedLabels, selected, notSelected);
    };
    TextColorChange(s,segmentedLabels, selected, notSelected);
}

static void TextColorChange(UISegmentedControl s, List<UILabel> segmentedLabels, UIColor selected, UIColor notSelected)
{
    for (int i = 0; i < segmentedLabels.Count; i++)
    {
        if(i == s.SelectedSegment) segmentedLabels[i].TextColor = selected;
        else segmentedLabels[i].TextColor = notSelected;
    }
}

và sau đó sử dụng nó

segmented.SetColoredTittles(new string[] {
            "text1",
            "text2",
            "text3"
        }, UIColor.White,UIColor.DarkGray);
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.