2013-01-15 2 views
0

Наши дизайнеры придумали приятный дизайн, который включает индекс с правой стороны UITableView, который будет выше, чем сам UITableView. Он также имеет некоторые пользовательские изображения для поиска и лучшего шрифта/цвета, чем реализация по умолчанию. Однако, поскольку UITableView не поддерживает настройку своего индекса (что я знаю), я пытался это сделать вручную. Пользовательский интерфейс выглядит следующим образом:Создание пользовательского индекса UITableView iOS

enter image description here

Это должно быть простая задача, но у меня чертовски времени, что делает его работу. Я установил UIView справа от таблицы с UIButtons, выстроенным сверху вниз, чтобы представить мой индекс. Цель, заключающаяся в том, что пользователь втягивает/удаляет UIButtons, я бы переместил UITableView в нужную секцию.

Я искал вокруг, и кажется, что для этого нужно было бы прослушать события UIControlEventTouchDragOutside и UIControlEventTouchDragEnter, чтобы знать, когда я вхожу в/из одной из UIButtons.

Для этого я создал весь список кнопок как IBOutletCollection, который я INIT в ViewDidLoad как так:

@property (retain, nonatomic) IBOutletCollection(UIButton) NSArray* indexButtons; 


@implementation ViewBeerListViewController 
... 
@synthesize indexButtons = _indexButtons; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    ... 

    // Go through the index buttons and set the change function 
    for (int i = 0; i < [self.indexButtons count]; ++i) 
    { 
     UIButton* button = [self.indexButtons objectAtIndex:i]; 
     [button addTarget:self action:@selector(touchDragOutside:) forControlEvents:UIControlEventTouchDragOutside]; 
     [button addTarget:self action:@selector(touchDragEnter:) forControlEvents:UIControlEventTouchDragEnter]; 
    } 
} 

The functions touchDragOutside and touchDragEnter look like this: 

- (IBAction)touchDragOutside:(UIButton*)sender 
{ 
    NSLog(@"Button %@ touch dragged outside", [sender titleLabel].text); 
} 

- (IBAction)touchDragEnter:(UIButton*)sender 
{ 
    NSLog(@"Button %@ touch dragged enter", [sender titleLabel].text); 
} 

Это все строит и работает. Тем не менее, похоже, что я только когда-либо получаю события для кнопки, на которой я начал прикосновение. НАПРИМЕР. если я прикоснусь к букве «G» и начну перетаскивать вверх и вниз, я увижу только журналы для касания, перетаскивающие «G» и «G». Я не получаю никаких событий для каких-либо других UIButtons, когда я им перехожу.

Любая помощь в разрешении этой проблемы будет очень оценена. Я застрял на том, что кажется очень тривиальной проблемой в течение очень долгого времени.

Спасибо!

ответ

1

Вместо того, чтобы создавать их с помощью UIButtons, попробуйте создать пользовательский UIView, который содержит UILabels с каждой буквой. Тогда в пользовательском классе UIView, переопределять следующее:

– touchesBegan:withEvent: 
– touchesMoved:withEvent: 
– touchesEnded:withEvent: 

и использовать их, чтобы определить, какие метки трогают. В touchesMoved, к примеру, вы могли бы:

UITouch * touch = [touches anyObject]; 
CGPoint point = [touch locationInView:self]; 
for(UIView * indexView in self.indexViews) { 
    if(CGRectContainsPoint(indexView.frame,point)) { 
     //indexView was touched. do something here 
     break; 
    } 
} 

Обратите внимание, что вы можете также использовать UIImageView для самого верхнего вместо UILabels, и это будет по-прежнему работать.

+0

Интересно. Я попробую сегодня вечером. Спасибо за предложение! – Jason

+0

Прохладный, это будет работать просто отлично :) Спасибо, хороший сэр! – Jason

+0

Нет проблем. Удачи. –

Смежные вопросы