Создание пользовательского индекса 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, и это все еще будет работать.