【问题标题】:UIScrollView with UIImageView as subviews, taping UIImageViewUIScrollView 与 UIImageView 作为子视图,使用 UIImageView
【发布时间】:2011-05-21 14:56:46
【问题描述】:

我需要这样做:

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

基本上我可以得到以下两种情况之一:

  1. 我可以知道,如果用户点击 UIImageView(它是 UIScrollView 的子视图),则会发生一个动作,但是当您尝试通过从 UIImageView 拖动手指来滚动时,该动作也会发生(我希望发生滚动) .

  2. 我可以做到这一点,无论用户在哪里点击,视图都会滚动,但如果用户点击 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:point 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 中滑动两次(第一个是将 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 (这将使一个动作“发生”)。有效!

【问题讨论】:

    标签: iphone ipad uiscrollview scroll


    【解决方案1】:

    是的——使用手势识别器。如果将UITapGestureRecognizer 添加到每个UIImageView(使用UIVIew -addGestureRecognizer: 方法),您应该可以识别点击和默认滚动行为。

    【讨论】:

    • 好的,非常感谢。你能告诉我如何用给定的事件(UIEvent)识别手势(我认为是滑动)吗?一个简单的代码就足够了。
    • 我已经根据您的建议更新了我的问题。
    • 滚动视图实际上不需要滑动识别器——它会自行处理滚动。只需像往常一样设置滚动视图(添加子视图并设置contentSize),并在其子视图上添加点击识别器。您可能需要在图像视图上启用用户交互,但应该就是这样。
    • 当我这样做时,我根本无法滚动。这是因为我的滚动视图的子视图正在“吃掉”任何触摸事件(我假设)。它仅在我在每个子视图(一个类)中创建自己的 hitTest 方法并返回 nil 时才有效。但是,如果我这样做,则点击手势识别器不起作用。也许我在这里做了一些完全错误的事情......如果需要,我可以提供更多代码(但不知道哪一部分会是相关的)所以请询问您是否知道可能出了什么问题。
    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多