我一直在試圖建立一個自定義的uitableview刷卡。我在這方面取得了成功。我還想在遇到touchesMoved時將uiview作爲子表格的子視圖添加到表格單元格中。當我試圖移動桌面單元時,我想要將uiview附加到靜止的位置。爲此,我也使它向opp方向移動(如StackOverflow中的答案中的建議)。但它並不是固定的。子視圖也隨着細胞移動。請幫我弄清楚我哪裏出錯了?代碼如下:保持子視圖靜止,而超視圖正在移動
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITableViewCell * cell = (UITableViewCell *)[self cellForRowAtIndexPath:[self indexPathForRowAtPoint:gestureStartPoint]];
isTouchesMoved=YES;
if ([self supportsSwipingForCellAtPoint:gestureStartPoint])
{
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(highlightTouchedRow) object:nil];
UITouch * touch = [touches anyObject];
CGPoint currentPosition = [touch locationInView:self];
CGFloat deltaX = fabsf(gestureStartPoint.x - currentPosition.x);
CGFloat deltaY = fabsf(gestureStartPoint.y - currentPosition.y);
if (deltaX >= kMinimumGestureLength && deltaY <= kMaximumVariance)
{
tempView=[self addnewViewatPoint:touches withEvent:event];
[cell addSubview:tempView];
[self setScrollEnabled:NO];
CGPoint loc = [touch locationInView:self];
CGPoint prevloc = [touch previousLocationInView:self];
if(moved==TRUE)
{
prevLoc=cell.frame;
prevLocBack=tempView.frame;
moved=FALSE;
}
CGRect myFrame = cell.frame;
CGRect backFrame = tempView.frame;
CGFloat deltaX = loc.x - prevloc.x;
if(gestureStartPoint.x>currentPosition.x)
{
NSLog(@"You have swiped left");
CGFloat movedDistance=gestureStartPoint.x-currentPosition.x;
NSLog(@"The movedDistance is %f",movedDistance);
if(movedDistance<=160)
{
myFrame.origin.x += deltaX;
backFrame.origin.x-=deltaX;
NSLog(@"The backgroundViewframe position, frameposition is %f and %f",fabsf(backFrame.origin.x),fabsf(myFrame.origin.x));
}
[tempView setFrame:backFrame];
[cell setFrame:myFrame];
}
else
{
NSLog(@"You have swiped right");
CGFloat movedDistance=currentPosition.x-gestureStartPoint.x;
NSLog(@"The movedDistance is %f",movedDistance);
if(movedDistance<=160)
{
myFrame.origin.x += deltaX;
backFrame.origin.x-=deltaX;
}
[cell setFrame:myFrame];
}
if ([swipeDelegate respondsToSelector:@selector(tableView:didSwipeCellAtIndexPath:)])
{
[swipeDelegate tableView:self didSwipeCellAtIndexPath:[self indexPathForRowAtPoint:gestureStartPoint]];
}
[self setIndexOfVisibleBackView:[self indexPathForCell:cell]];
}
[self setScrollEnabled:YES];
}
else
{
[super touchesMoved:touches withEvent:event];
}
}
-(UIView *) addnewViewatPoint:(NSSet *)touches withEvent:event
{
UIView *backgroundView=[[[UIView alloc] initWithFrame: CGRectMake(10.0, 30.0, 200.0, 25.0)] autorelease];
[backgroundView setBackgroundColor:[UIColor redColor]];
[backgroundView setUserInteractionEnabled:NO];
backgroundView.tag=101;
return backgroundView;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
if ([self supportsSwipingForCellAtPoint:gestureStartPoint])
{
TISwipeableTableViewCell * cell = (TISwipeableTableViewCell *)[self cellForRowAtIndexPath:[self indexPathForRowAtPoint:gestureStartPoint]];
if(isTouchesMoved==NO)
{
[self.delegate tableView:self didSelectRowAtIndexPath:[self indexPathForCell:cell]];
[self touchesCancelled:touches withEvent:event];
}
[UIView beginAnimations:nil context:NULL];
if(isTouchesMoved==YES)
{
[cell setFrame:prevLoc];
[tempView setFrame:prevLocBack];
isTouchesMoved=NO;
}
moved=TRUE;
[UIView commitAnimations];
[self touchesCancelled:touches withEvent:event];
//[super touchesEnded:touches withEvent:event];
}
else
{
[super touchesEnded:touches withEvent:event];
}
}
有很多代碼供人閱讀和調試。嘗試將其分解成真正重要的部分。嘗試隔離問題。 – Robert 2011-03-10 20:43:20