创建自定义UITableView索引iOS

时间:2013-01-15 16:31:57

标签: ios uitableview uibutton uicontrolevents

我们的设计师提出了一个很好的设计,它涉及UITableView右侧的索引比UITableView本身更高。它还具有一些用于搜索的自定义图像以及比默认实现更好的字体/颜色。但是,由于UITableView不支持自定义其索引(我知道),我一直试图手动进行此操作。用户界面如下所示:

enter image description here

这应该是一项简单的任务,但我有一段时间让它发挥作用。我已经在桌子的右边设置了一个UIView,UIButtons从上到下排列,代表我的索引。目标是当用户拖入/跳出UIButtons时,我会将UITableView跳到右侧部分。

我已经四处寻找,似乎要做的就是收听UIControlEventTouchDragOutside和UIControlEventTouchDragEnter事件,以了解我何时进出UIButtons。

为此,我已将整个按钮列表设置为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 个答案:

答案 0 :(得分:1)

尝试使用每个字母创建包含UILabel的自定义UIView,而不是使用UIButtons创建它们。然后在自定义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,这仍然有用。