我如何将手势事件添加到uipickerview以更改标签?我必须创建一个自定义类,但是,我不知道如何处理uipickerview。我目前在uiviews中有手势来执行此操作,但我在使用uipickerview时遇到了问题。
我的观点代码:
#define HORIZ_SWIPE_DRAG_MIN 100
CGPoint mystartTouchPosition;
BOOL isProcessingListMove;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint newTouchPosition = [touch locationInView:self.view];
if(mystartTouchPosition.x != newTouchPosition.x || mystartTouchPosition.y != newTouchPosition.y) {
isProcessingListMove = NO;
}
mystartTouchPosition = [touch locationInView:self.view];
[super touchesBegan:touches withEvent:event];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = touches.anyObject;
CGPoint currentTouchPosition = [touch locationInView:self.view];
// If the swipe tracks correctly.
double diffx = mystartTouchPosition.x - currentTouchPosition.x + 0.1; // adding 0.1 to avoid division by zero
double diffy = mystartTouchPosition.y - currentTouchPosition.y + 0.1; // adding 0.1 to avoid division by zero
if(abs(diffx / diffy) > 2.5 && abs(diffx) > HORIZ_SWIPE_DRAG_MIN)
{
// It appears to be a swipe.
if(isProcessingListMove) {
// ignore move, we're currently processing the swipe
return;
}
if (mystartTouchPosition.x < currentTouchPosition.x) {
isProcessingListMove = YES;
self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:0];
return;
}
else {
isProcessingListMove = YES;
self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:2];
return;
}
}
else if(abs(diffy / diffx) > 1)
{
isProcessingListMove = YES;
[super touchesMoved:touches withEvent:event];
}
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
isProcessingListMove = NO;
[super touchesEnded:touches withEvent:event];
}
感谢您的帮助。
答案 0 :(得分:2)
你可以继承UIPickerView。问题在于它由九个子视图组成,其中一个名为UIPickerTable,正在接收所需行的touchesBegan:withEvent:
等触摸事件。我能够使用本文末尾包含的代码成功拦截这些内容:
Responding to touchesBegan in UIPickerView instead of UIView
其他答案/评论也有帮助。我想要清除空气,不是为了做一些不标准的事情(如在这个问题中),而是为了到达这里的人希望继承UIPickerView,因为接受的答案的第一行是错误的。
答案 1 :(得分:0)
您不能将UIPickerView子类化。
但是,由于拾取器视图必须显示在另一个视图中(因为它不占用整个屏幕),您可以捕获该视图控制器中的触摸并过滤手势。
(假设我明白你要做什么...)我会警告刷一个选择器视图来更改标签是一个非标准的用户界面,可能会让你的用户感到困惑。由于拾取器视图被视为一种控制,因此他们只期望拾取器的正常旋转动作。他们怎么会知道水平滑动选择器视图?
答案 2 :(得分:0)
我一个人离开了。这本来是令人困惑的,你是对的。
答案 3 :(得分:-1)
ZT&GT;您不能将UIPickerView子类化。 “为了使选择器视图旋转更长,我将UIPickerView子类化。我的子类只有一个方法”来自Longer Spinning and Blurring。另请参阅UIPickerView Class Reference:“UIDatePicker类使用UIPickerView的自定义子类来显示日期和时间。”