Подтвердить что ты не робот

Пользовательский UISegmentedControl

Как создать пользовательский UISegmentedControl?

У меня есть 2 изображения, 1 которые должны отображаться, когда сегмент активен, а другой, если сегмент неактивен. Могу ли я переопределить стиль или что-то подобное, поэтому у меня есть UISegmentedControl с моими собственными изображениями в качестве активного/неактивного фона?

4b9b3361

Ответ 1

Мне пришлось добавить этот дополнительный код, помимо двух разных состояний для позиций "on" и "off":

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Set set segControl background to transparent
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
    CGContextFillRect(context, rect);
    UIImage *transparentImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self.segControl setBackgroundImage:transparentImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    [self.segControl setDividerImage:transparentImage forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
}

РЕДАКТИРОВАТЬ: поскольку это получает некоторую рекламу, более чистым решением является использование [UIImage new] вместо создания прозрачных изображений, как таковых:

 [self.segControl setDividerImage:[UIImage new] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
 [self.segControl setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

Ответ 2

Вы можете использовать методы, описанные в библиотеке разработчика iOS:

http://developer.apple.com/library/ios/ipad/#documentation/uikit/reference/UISegmentedControl_Class/Reference/UISegmentedControl.html

Прокрутите вниз до раздела "Настройка внешнего вида". Существуют способы установки фоновых изображений для нескольких состояний кнопок, изображений разделителей кнопок и т.д.

Эти методы доступны только в iOS5 и более поздних версиях.

@property tintColor  
– backgroundImageForState:barMetrics:
– setBackgroundImage:forState:barMetrics:
– contentPositionAdjustmentForSegmentType:barMetrics:
– setContentPositionAdjustment:forSegmentType:barMetrics:
– dividerImageForLeftSegmentState:rightSegmentState:barMetrics:
– setDividerImage:forLeftSegmentState:rightSegmentState:barMetrics:
– titleTextAttributesForState:
– setTitleTextAttributes:forState:

Ответ 3

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

Ответ 4

Да, вам нужно 2 изображения (вкл. и выкл.) для каждого раздела панели сегментов. (4 сегмента... 8 изображений.) Но это позволяет вам выбрать в общей сложности 16 вариантов! (Все с потреблением всего 1 строки в вашем графическом интерфейсе.)

У меня все работает ЗА ИСКЛЮЧЕНИЕМ... как вы скрываете оригинальную графику сегментов?

Невозможно установить alpha в 0. (Он также скроет ваши изображения.)

Невозможно установить "tintClear" на "clear". (Не уверен, почему он делает его черно-белым.)

Невозможно установить "скрытый"... ничего не будет работать.

Невозможно установить "фон" для "очистки". (Фон НЕ является графикой в ​​сегментной панели.)

Ответ 5

Я написал что-то, что работает, поскольку @rpetrich объяснял, не помещая в массив, и, на мой взгляд, это самое простое решение. Надеюсь, что кто-то найдет это полезным

.h

IBOutlet UIButton *index0;
IBOutlet UIButton *index1;
IBOutlet UIButton *index2;
IBOutlet UIImageView *segMentControl;

-(IBAction)segmentSwitch:(UIButton *) buttonIndexPressed;

.m

-(IBAction)segmentSwitch:(UIButton *) buttonIndexPressed
{
    if (buttonIpressed == index0)
    {
        [segmentControl setImage:[UIImage imageNamed:@"Seg1Sel.png"]];
        NSLog(@"index 0 pushed");

        index0.enabled = NO;
        index1.enabled = YES;
        index2.enabled = YES;        
    }
    else if (buttonIpressed == index1)
    {
         [segmentControl setImage:[UIImage imageNamed:@"Seg2Sel.png"]];
         NSLog(@"index 1 pushed");

         index0.enabled = YES;
         index1.enabled = NO;
         index2.enabled = YES;
    }
    else if (buttonIpressed == index2)
    {
        [segmentControl setImage:[UIImage imageNamed:@"Seg3Sel.png"]];
        NSLog(@"index 2 pushed");

        index0.enabled = YES;
        index1.enabled = YES;
        index2.enabled = NO;
    }
}

Ответ 6

он работает просто отлично

[segmentControl setImage:[UIImage imageNamed:@"Rolenew.png"] forSegmentAtIndex:0];

Ответ 9

Свифт 3.0 Вершина ответа Джона.

var transparentImage = UIGraphicsGetImageFromCurrentImageContext() as? UIImage
UIGraphicsEndImageContext()
segControl.setBackgroundImage(transparentImage, for: .normal, barMetrics: .default)
segControl.setDividerImage(transparentImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)