Концептуально, UISegmentedControl
кажется хорошим выбором для этого, но я не думаю, что он достаточно гибок, чтобы создать эффект, к которому вы стремитесь.
Рассматривали ли вы размещение трех UIButton
элементов управления в пользовательском представлении? Вы можете настроить изображения для каждой кнопки, используя setBackgroundImage:forState:
, чтобы получить стиль рамки в вашем макете. Установите для свойства selected
нажатой кнопки значение YES
, и UIButton
будет обрабатывать чертеж за вас.
Вы можете настроить метод действия для определения, какая кнопка была нажата, вызвав
[button addTarget:self action:@selector(nameOfMethodToHandleButtonPress) forControlEvents:UIControlEventTouchUpInside])]
Делегат - это просто любой класс, который соответствует протоколу, который вы создаете. Таким образом, вы должны создать протокол делегата в своем заголовке следующим образом:
@class MyControl; // this is a forward reference to your class, as this must come before the class @interface definition in the header file
@protocol MyControlDelegate <NSObject>
@optional
- (void)myControl:(MyControl *)control didSelectButton:(int)buttonIndex; // replace this method with whatever makes sense for your control
@end
А делегат - это просто свойство в вашем MyControl
классе:
@property (nonatomic, assign) id <MyControlDelegate> delegate; // you use 'assign' instead of 'retain' to prevent retain cycles
А в вашей кнопке обработчики нажатия, например:
- (void)methodThatHandlesButtonPress { // this is the method you set up in the first code example with addTarget:action:forCotnrolEvents:
if ([self.delegate respondsToSelector:@selector(myControl:didSelectButton:)])
[self.delegate myControl:self didSelectButton:0]; // replace as appropriate
}
Теперь вам просто нужно, чтобы контроллер представления, содержащий ваш элемент управления, принял протокол:
@interface MyViewController : UIViewController <MyControlDelegate> { // etc...
И реализовать метод:
- (void)myControl:(MyControl *)control didSelectButton:(int)buttonIndex {
// handle the button press as appropriate
}