Как я могу установить шрифт для выбранного элемента в UISegmentedControl?

Я пытаюсь использовать разные шрифты для выбранных и невыбранных сегментов в UISegmentedControl. Я могу установить шрифт для обычных сегментов, но я не могу установить шрифт для выбранного сегмента. Вот мой код:

    NSDictionary *attributes = [NSDictionary dictionaryWithObject:
                      [UIFont fontWithName:@"Verdana-Bold"
                                      size:[UIFont buttonFontSize]]
                forKey:UITextAttributeFont];
[playerNumber setTitleTextAttributes:attributes
                            forState:UIControlStateHighlighted];

Если я перейду на UIControlStateNormal, будут применены стили для всех сегментов. Однако я просто хочу стилизовать выделенный / выбранный сегмент. (UIControlStateSelected тоже не работает.)

(Есть несколько похожих вопросов по StackOverflow, но я не смог найти ответ, который решил мою проблему.)

Что я делаю не так или вообще нельзя?


person Thorsten    schedule 08.02.2013    source источник


Ответы (2)


Вы пытались установить шрифт для выбора сегмента, вместо того, чтобы пытаться предопределить шрифт selectedState, который будет использоваться для всех сегментов? Что-то вроде следующего (не проверено):

int segmentIndex = self.mySegmentedControl.selectedSegmentIndex;
if (segmentIndex == 0)
{
    [self.mySegmentedControl setFont:[UIFont boldSystemFontOfSize:12] forSegmentAtIndex:0];
    [self.mySegmentedControl setFont:[UIFont systemFontOfSize:10] forSegmentAtIndex:1];        
}
else if (segmentIndex == 1)
{
    [self.mySegmentedControl setFont:[UIFont systemFontOfSize:10] forSegmentAtIndex:0];
    [self.mySegmentedControl setFont:[UIFont boldSystemFontOfSize:12] forSegmentAtIndex:1]; 
}

Сейчас я делаю что-то в этом роде в одном из своих приложений, но оно использует изображения для сегментов.

person DenVog    schedule 08.02.2013

Я встретил эту проблему сегодня, я считаю, что это ошибка iOS.

Вот мой хак.

@interface TFSegmentedControl : UISegmentedControl

@end

#import "TFSegmentedControl.h"

@implementation TFSegmentedControl
{
    BOOL layoutedOnce;
}

- (void)updateSelectedStyle
{
    for (UIView *view in self.subviews) {
        BOOL selected = [[view valueForKey:@"selected"] boolValue];
        for (UILabel *label in view.subviews) {
            if ([label isKindOfClass:[UILabel class]]) {
                UIFont *font = [self titleTextAttributesForState:UIControlStateNormal][UITextAttributeFont];
                if (selected) {
                    UIFont *_font = [self titleTextAttributesForState:UIControlStateSelected][UITextAttributeFont];
                    if (_font) font = _font;
                }
                if (font != label.font) {
                    label.font = font;
                    CGRect frame = label.frame;
                    frame.size = [label.text sizeWithFont:font];
                    label.frame = frame;
                }
            }
        }
    }
}

- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents
{
    [self updateSelectedStyle];
    [super sendActionsForControlEvents:controlEvents];
}

- (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex
{
    [super setSelectedSegmentIndex:selectedSegmentIndex];
    [self updateSelectedStyle];
}

- (void)layoutSubviews
{
    [super layoutSubviews];
    if (!layoutedOnce) {
        layoutedOnce = YES;
        [self updateSelectedStyle];
    }
}

@end
person rexsheng    schedule 19.04.2013