Пользовательский UISegmentedControl
Как создать пользовательский UISegmentedControl
?
У меня есть 2 изображения, 1 которые должны отображаться, когда сегмент активен, а другой, если сегмент неактивен. Могу ли я переопределить стиль или что-то подобное, поэтому у меня есть UISegmentedControl
с моими собственными изображениями в качестве активного/неактивного фона?
Ответы
Ответ 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];
Ответ 7
Попробуйте HMSegmentedControl, он позволяет создавать изображения и другие настройки. Доступно по адресу https://github.com/HeshamMegid/HMSegmentedControl
Ответ 8
Для этого вы должны прослушать UIControlEventValueChanged и изменить изображение самостоятельно. Вам не нужно подклассифицировать UISegmentedControl - запомнить композицию над наследованием.
Ответ 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)