我们的设计师提出了一个很好的设计,它涉及UITableView右侧的索引比UITableView本身更高。它还具有一些用于搜索的自定义图像以及比默认实现更好的字体/颜色。但是,由于UITableView不支持自定义其索引(我知道),我一直试图手动进行此操作。用户界面如下所示:
这应该是一项简单的任务,但我有一段时间让它发挥作用。我已经在桌子的右边设置了一个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的事件。
任何有关解决此问题的帮助都将受到极大的赞赏。很长一段时间以来,我一直被困在一个看似非常微不足道的问题上。
谢谢!
答案 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,这仍然有用。