Создание пользовательского индекса UITableView iOS

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

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

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

С этой целью я настроил весь список кнопок как IBOutletCollection, который я инициирую в 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". Я не получаю никаких событий для других UIButton-ов, пока прохожу их.

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

Спасибо!

1 ответ

Решение

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

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

и используйте те, чтобы определить, какие ярлыки касаются. Например, в рамках touchsMoved вы можете получить:

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, и это все еще будет работать.

Другие вопросы по тегам