GitHub:https://github.com/zyfmeng/UITableViewTouch
实现效果图:
主要代码实现
ViewController.m文件代码实现,其中TTableView是继承于UITableView。
#import "ViewController.h"
#import "TTableView.h"
#import "TTableCell.h"
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource,TouchTableViewDelegate>
{
TTableView *mTableView;
UIView *bgView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
mTableView = [[TTableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
mTableView.backgroundColor = [UIColor clearColor];
mTableView.dataSource = self;
mTableView.delegate = self;
mTableView.touchDelegate = self;
[self.view addSubview:mTableView];
}
//touch结束后的处理
- (void)tableView:(TTableView *)tableView touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch * touch = touches.anyObject;
CGPoint location2 = [touch locationInView:self.view];
NSLog(@"x == %f\ny == %f",location2.x,location2.y);//点击的坐标
}
#pragma mark - UITableView delegate
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 226;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identify = @"cell";
TTableCell *cell = [tableView dequeueReusableCellWithIdentifier:identify];
if (cell == nil) {
cell = [[TTableCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identify];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.mDelegate = self;
cell.OnBtnClick = @selector(OnBtnClick:);//图片触发事件
}
return cell;
}
//图片触发事件
- (void)OnBtnClick:(id)sender
{
NSLog(@"我点的是图片");
}
创建的继承于UITableViewCell的文件,TTableCell.h文件实现代码如下:
#import <UIKit/UIKit.h>
#define SafePerformSelector(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)
@interface TTableCell : UITableViewCell
@property (nonatomic, weak) id mDelegate;//代理
@property (nonatomic, assign) SEL OnBtnClick;//图片点击事件
@end
TTableCell.m文件实现代码如下:
#import "TTableCell.h"
@implementation TTableCell
{
UIButton *btn;//图片按钮
UILabel *lab;//详情
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle: style reuseIdentifier:reuseIdentifier];
if (self) {
//图片按钮
btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(10,10, 150, 206);
btn.backgroundColor = [UIColor clearColor];
[btn setBackgroundImage:[UIImage imageNamed:@"6.png"] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:btn];
//图片详情
NSString *str = @"电影根据暴雪娱乐单位和传奇电影单位大受欢迎的同名网络游戏改编,讲述的是部落(Horde)和联盟(Alliance)之间的故事。";
float fWidth = self.frame.size.width - 180;
CGSize size = [str boundingRectWithSize:CGSizeMake(fWidth, MAXFLOAT) options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]} context:nil].size;
lab = [[UILabel alloc] initWithFrame:CGRectMake(170, 10, fWidth, size.height)];
lab.font = [UIFont systemFontOfSize:15];
lab.numberOfLines = 0;
lab.text = str;
[self.contentView addSubview:lab];
}
return self;
}
- (void)btnClick:(UIButton *)sender
{
if (_mDelegate && _OnBtnClick) {
SafePerformSelector([_mDelegate performSelector:_OnBtnClick withObject:sender]);
}
}
TTableView.h文件代码如下:
#import <UIKit/UIKit.h>
@protocol TouchTableViewDelegate <NSObject>
@optional
- (void)tableView:(UITableView *)tableView
touchesBegan:(NSSet *)touches
withEvent:(UIEvent *)event;
- (void)tableView:(UITableView *)tableView
touchesCancelled:(NSSet *)touches
withEvent:(UIEvent *)event;
- (void)tableView:(UITableView *)tableView
touchesEnded:(NSSet *)touches
withEvent:(UIEvent *)event;
- (void)tableView:(UITableView *)tableView
touchesMoved:(NSSet *)touches
withEvent:(UIEvent *)event;
@end
@interface TTableView : UITableView
{
@private
id touchDelegate;
}
@property (nonatomic,assign) id<TouchTableViewDelegate> touchDelegate;
@end
TTableView.m文件代码如下:
#import "TTableView.h"
@implementation TTableView
@synthesize touchDelegate = _touchDelegate;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
if ([_touchDelegate conformsToProtocol:@protocol(TouchTableViewDelegate)] &&
[_touchDelegate respondsToSelector:@selector(tableView:touchesBegan:withEvent:)])
{
[_touchDelegate tableView:self touchesBegan:touches withEvent:event];
}
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesCancelled:touches withEvent:event];
if ([_touchDelegate conformsToProtocol:@protocol(TouchTableViewDelegate)] &&
[_touchDelegate respondsToSelector:@selector(tableView:touchesCancelled:withEvent:)])
{
[_touchDelegate tableView:self touchesCancelled:touches withEvent:event];
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
if ([_touchDelegate conformsToProtocol:@protocol(TouchTableViewDelegate)] &&
[_touchDelegate respondsToSelector:@selector(tableView:touchesEnded:withEvent:)])
{
[_touchDelegate tableView:self touchesEnded:touches withEvent:event];
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
if ([_touchDelegate conformsToProtocol:(touchDelegate)] &&
[_touchDelegate respondsToSelector:@selector(tableView:touchesMoved:withEvent:)])
{
[_touchDelegate tableView:self touchesMoved:touches withEvent:event];
}
}