Создание пользовательского UISegmentControl (вроде) - PullRequest
0 голосов
/ 02 апреля 2011

У меня есть этот макет:

enter image description here

Как видите, это своего рода навигационное меню. Его функциональность должна быть такой же, как у сегментированного элемента управления, и я собираюсь изменить tableView на основе активного элемента.

Какой самый простой способ реализовать это?

Я начал создавать свой подкласс UIView, но обнаружил, что мне нужно было сделать делегата, наблюдать за событиями и тому подобным. Это лучший способ сделать это ? Должен ли я подкласс UISegmentedControl?

Любой другой совет?

Пожалуйста, укажите мне правильное направление. Я чувствую себя уверенно в Obj-c, но создание такого рода вещей сводит меня с ума.

1 Ответ

4 голосов
/ 02 апреля 2011

Концептуально, 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
}
...