0

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

在此处输入图像描述

这应该是一个简单的任务,但我有一个地狱般的时间让它工作。我在表格的右侧设置了一个 UIView,UIButtons 从上到下排列以表示我的索引。目标是当用户拖入/拖出 UIButtons 时,我会将 UITableView 跳到右侧部分。

我四处搜索,似乎要做的事情是听 UIControlEventTouchDragOutside 和 UIControlEventTouchDragEnter 事件,以了解我何时进入/退出其中一个 UIButton。

为此,我将整个按钮列表设置为一个 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);
}

这一切都构建并运行。但是,似乎我只获得了我开始触摸的按钮的事件。EG如果我触摸字母“G”,然后开始上下拖动,我只会看到触摸从“G”拖出“G”并拖入“G”的日志。当我浏览它们时,我没有收到任何其他 UIButtons 的事件。

任何解决此问题的帮助将不胜感激。很长一段时间以来,我一直被困在一个看似非常微不足道的问题上。

谢谢!

4

1 回答 1

1

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

于 2013-01-15T18:18:10.293 回答