【发布时间】:2013-12-27 01:07:28
【问题描述】:
我有一个自定义 UITableViewCell,上面有一个平移手势识别器:
// CustomCell.m
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
// Initialization code
// Add a pan recognizer
UIGestureRecognizer* recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
recognizer.delegate = self;
[self addGestureRecognizer:recognizer];
}
return self;
}
我正在使用平移手势来检测用户是否以任何水平方式滑动单元格,然后单元格会根据单元格被滑动的程度执行一些不同的操作。细胞行为的这一方面正如我所不希望的那样工作。
但我刚刚发现,如果我按下单元格并且不向任何方向滑动,应用程序会由于调用 UILongPressGestureRecognizer 而崩溃,但我的应用程序中根本没有 UILongPressGestureRecognizer。 为什么在我的 UIPanGestureRecognizer 上调用 UILongPressGestureRecognizer 方法?
这是我的平移手势处理方法:
#pragma mark - Horizontal pan gesture methods
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
CGPoint translation = [gestureRecognizer translationInView:[self superview]];
// Check for horizontal gesture
if (fabsf(translation.x) > fabsf(translation.y)) {
return YES;
}
return NO;
}
#pragma mark - Handel pan gesture
- (void)handlePan:(UIPanGestureRecognizer *)recognizer {
// 1
if (recognizer.state == UIGestureRecognizerStateBegan) {
// if the gesture has just started, record the current centre location
originalCenter = self.center;
}
// 2
if (recognizer.state == UIGestureRecognizerStateChanged) {
// translate the center
CGPoint translation = [recognizer translationInView:self];
self.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y);
// determine whether the item has been dragged far enough to initiate a delete / complete / edit
editOnDragRelease = self.frame.origin.x < -self.frame.size.width / 4;
deleteOnDragRelease = self.frame.origin.x < -self.frame.size.width / 1.5;
markCompleteOnDragRelease = self.frame.origin.x > self.frame.size.width / 8;
}
// 3
if (recognizer.state == UIGestureRecognizerStateEnded) {
// the frame this cell would have had before being dragged
CGRect originalFrame = CGRectMake(0, self.frame.origin.y, self.bounds.size.width, self.bounds.size.height);
if (!deleteOnDragRelease || !editOnDragRelease) {
// if the item is not being deleted/edited, snap back to the original location
[UIView animateWithDuration:0.2 animations:^{
self.frame = originalFrame;
}];
}
// Edit
if (!deleteOnDragRelease && editOnDragRelease) {
[self.delegate editItem:self.item];
}
// Delete
if (deleteOnDragRelease) {
[self.delegate itemDeleted:self.item];
}
// Toggle color
if (markCompleteOnDragRelease) {
[self.delegate toggleColorForItem:self.item];
}
}
}
我在崩溃日志中遇到的错误是当我选择一个单元格但不以任何方式滑动/平移它时:
-[UILongPressGestureRecognizer translationInView:]: unrecognized selector sent to instance 0x1093327c0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILongPressGestureRecognizer translationInView:]: unrecognized selector sent to instance 0x1093327c0'
任何帮助将不胜感激!
【问题讨论】:
标签: ios objective-c uigesturerecognizer uipangesturerecognizer