我需要做这样的事情:
UISCrollView以UIImageViews作为其子视图。当用户点击UIImageViews时会发生一个动作。但是当用户想要滚动UIScrollView时,即使在UIImageView(在显示UIImageView的UIImage的位置)处开始滚动,也应该滚动。
基本上我可以选择两种方案之一:
如果用户点击UIImageView(这是UIScrollView的子视图),我会得到一个动作,但是当你尝试通过从UIImageView拖动手指滚动时,也会发生动作(我想要滚动发生)
我可以在用户点击视图的位置滚动,但如果用户点击UIImageView,则不会发生此操作。
我无法得到你的任何代码,因为我在这里和那里测试了很多aprroches并且它有点乱,所以根本没用(没有大量的评论)。
这样做是否有简洁明了的解决方案?
好的,这里有一些代码:
-(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if(isDragging == NO)
{
return [super hitTest:point withEvent:event];
}
NSLog(@"dragging ><><><><><>>><><><><>");
return nil;
}
现在,如果我返回nil,那么我可以滚动,但我无法点击我的UIImageView进行操作。如果我返回[super hitTest:指向withEvent:event],我无法滚动我的UIIMageView。
isDragging是测试代码,用于确定我是在尝试滚动还是只是点按。但是在我可以根据正在发生的事件设置isDragging属性之前发生命中测试。
这是我的初学
-(id) initWithCoder:(NSCoder *)aDecoder
{
if(self = [super initWithCoder:aDecoder])
{
[self setUserInteractionEnabled:YES];
UISwipeGestureRecognizer *swipeRecLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe)];
swipeRecLeft.direction = UISwipeGestureRecognizerDirectionDown;
UISwipeGestureRecognizer *swipeRecRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe)];
swipeRecRight.direction = UISwipeGestureRecognizerDirectionUp;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapSingle)];
[self addGestureRecognizer:swipeRecRight];
[self addGestureRecognizer:swipeRecLeft];
[self addGestureRecognizer:singleTap];
[swipeRecLeft release];
[swipeRecRight release];
[singleTap release];
isDragging = NO;
}
else {
self = nil;
}
return self;
}
以下是其他行动
-(void) tapSingle
{ [self.delegate hitOccur]; }
-(void) swipe
{
isDragging = YES;
}
在我的UIScrollView中,我设置了委托,当滚动结束时,我在我的UIScrollView的每个子视图上将isDragging属性设置为NO。
它正在运作......但它并不完美。要实际滚动内容,我必须在UIImageView中滑动TWICE(第一个是将isDragging设置为YES然后我们可以滚动...)。怎么这么正确?
最新消息:
好的,我已经设法解决了这个问题。但是我确定我的方式不干净或不好(但它起作用)。
在我的UIScrollView子类中,我用这个覆盖了hitTest方法:
-(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if(!self.dragging)
{
if([[super hitTest:point withEvent:event] class] == [ResponsiveBookView class])
{
container = [super hitTest:point withEvent:event];
}
}
return self;
}
容器是id容器,它包含我的UIView子类。所以我可以识别触摸是在我的图像上还是在滚动视图本身上。现在我需要检测它是滚动还是只是触摸我在这里这样做:
-(void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
{
if (!self.dragging) {
NSLog(@"touch touch touch");
[container tapSingle];
[self.nextResponder touchesEnded: touches withEvent:event];
}
[super touchesEnded: touches withEvent: event];
}
正如您所看到的那样,self.dragging(滚动)是否会应用默认行为。如果!self.dragging我将在我的容器上手动调用tapSingle(然后将“发生”动作)。它有效!
答案 0 :(得分:0)
是的 - 使用手势识别器。如果您为每个UITapGestureRecognizer
添加UIImageView
(使用UIVIew
-addGestureRecognizer:
方法),您应该同时识别水龙头和默认滚动行为。