UIScrollView以UIImageView作为子视图,点击UIImageView

时间:2010-12-07 14:14:06

标签: iphone ipad uiscrollview scroll

我需要做这样的事情:

UISCrollView以UIImageViews作为其子视图。当用户点击UIImageViews时会发生一个动作。但是当用户想要滚动UIScrollView时,即使在UIImageView(在显示UIImageView的UIImage的位置)处开始滚动,也应该滚动。

基本上我可以选择两种方案之一:

  1. 如果用户点击UIImageView(这是UIScrollView的子视图),我会得到一个动作,但是当你尝试通过从UIImageView拖动手指滚动时,也会发生动作(我想要滚动发生)

  2. 我可以在用户点击视图的位置滚动,但如果用户点击UIImageView,则不会发生此操作。

  3. 我无法得到你的任何代码,因为我在这里和那里测试了很多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(然后将“发生”动作)。它有效!

1 个答案:

答案 0 :(得分:0)

是的 - 使用手势识别器。如果您为每个UITapGestureRecognizer添加UIImageView(使用UIVIew -addGestureRecognizer:方法),您应该同时识别水龙头和默认滚动行为。