如何模拟UIView上的UITableviewCell部分?

时间:2012-04-16 00:43:32

标签: iphone uiview uitableview highlight

我想模拟UITableViewCell上所选UIView(蓝色)的行为,有没有办法做到这一点,即,当用户点击UIView时,它就是比如点击一个tableview单元格。视图将使用相同的蓝色突出显示。

1 个答案:

答案 0 :(得分:4)

首先,了解UITableView单元的行为方式非常有用:

  • 触摸单元格时,背景颜色变为蓝色,并且在触摸过程中保持蓝色
  • 如果触摸的位置移动(即用户在按下时移动手指),则单元格背景将返回白色
  • 如果用户触摸单元格并抬起手指而不更改触摸位置,则会触发UIControlEventTouchUpInisde控件事件

那我们怎样才能模拟这个呢?我们可以从继承UIControl(它本身是UIView的子类)开始。我们需要子类化UIControl,因为我们的代码需要响应UIControl方法sendActionsForControlEvents:。这样我们就可以在自定义类上调用addTarget:action:forControlEvents

TouchHighlightView.h:

@interface TouchHighlightView : UIControl

@end

TouchHighlightView.m:

@implementation TouchHighlightView

- (void)highlight
{
    self.backgroundColor = [UIColor blueColor];
}

- (void)unhighlight
{
    self.backgroundColor = [UIColor whiteColor];
}

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    [self highlight];
}

- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    [self unhighlight];
}

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    // assume if background color is blue that the cell is still selected
    // and the control event should be fired
    if (self.backgroundColor == [UIColor blueColor]) {

        // send touch up inside event
        [self sendActionsForControlEvents:UIControlEventTouchUpInside];

        // optional: unlighlight the view after sending control event
        [self unhighlight];
    }
}

示例用法:

TouchHighlightView *myView = [[TouchHighlightView alloc] initWithFrame:CGRectMake(20,20,200,100)];

// set up your view here, add subviews, etc

[myView addTarget:self action:@selector(doSomething) forControlEvents:UIControlEventTouchUpInside];  
[self.view addSubview:myView];

这只是一个艰难的开始。您可以根据需要随意修改。可以进行若干改进以使用户根据其用途更好。例如,当UITableCell处于选定(蓝色)状态时,请注意textLabels中的文本如何变为白色。