在UIScrollView中使用UIImageView或UIButton时出现问题

时间:2010-08-23 01:27:11

标签: iphone cocoa-touch uiscrollview

我正在使用UIScrollView来保存大小为80x80的不同数量的图像,当用户点击一个时,我希望它启动到显示全屏等的模态视图。 我遇到的问题是检测scrollview中图像的触摸。到目前为止,我已尝试过两种方法,但每种方法都存在问题。我发布了两种方式,但我只需要回答其中一种方式。

我有一个图像数组并循环遍历它,这是我尝试使用UIImageView的第一个方法:

for (i=0; i<[imageArray count]; i++) {
    // get the image
    UIImage *theImage = [imageArray objectAtIndex:i];

    // figure out the size for scaled down version
    float aspectRatio = maxImageHeight / theImage.size.height;
    float thumbWidth = theImage.size.width * aspectRatio;
    float thumbHeight = maxImageHeight;

    lastX = lastX+10;

    // Scale the image down
    UIImage *thisImage = [theImage imageByScalingProportionallyToSize:CGSizeMake(thumbWidth, thumbHeight)];

    // Create an 80x80 UIImageView to hold the image, positioned 10px from edge of the previous one
    UIImageView *image = [[UIImageView alloc] initWithFrame:CGRectMake(lastX, 10, 80, 80)];
    image.clipsToBounds = YES;
    image.contentMode = UIViewContentModeTopLeft;
    image.image = thisImage;
    image.userInteractionEnabled = YES;

    // add to the scroller
    [photoScroller addSubview:image];

    // release
    [image release];

    // set variables ready for the next one
    //lastWidth = thisImage.size.width;
    lastWidth = 80;             // we're using square images so set to 80 rather than the width of the image
    lastX = lastX+lastWidth;
}

这个问题导致在这个循环之后我必须在UIScrollView上将userInteractionEnabled设置为NO,这样我可以覆盖touchesBegan并检测触摸,但这样做当然会禁用滚动,所以用户只能看到前6个图像左右

有没有办法可以重新启用滚动呢? photoScroller.scrollEnabled = YES;由于禁用了用户交互,因此无效。

...

我尝试的第二种方法是为每个图像使用UIButton,在这种情况下循环的代码如下:

for (i=0; i<[imageArray count]; i++) {
    // get the image
    UIImage *theImage = [imageArray objectAtIndex:i];

    // figure out the size for scaled down version
    float aspectRatio = maxImageHeight / theImage.size.height;
    float thumbWidth = theImage.size.width * aspectRatio;
    float thumbHeight = maxImageHeight;

    lastX = lastX+10;

    // Scale the image down
    UIImage *thisImage = [theImage imageByScalingProportionallyToSize:CGSizeMake(thumbWidth, thumbHeight)];

    // Create an 80x80 UIButton to hold the image, positioned 10px from the edge of the previous one
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(lastX, 10, 80, 80)];
    button.clipsToBounds = YES;
    button.contentMode = UIViewContentModeTopLeft;
    [button setImage:thisImage forState:UIControlStateNormal];
    [button setImage:thisImage forState:UIControlStateHighlighted];
    [button addTarget:self action:@selector(tapImage:) forControlEvents:UIControlEventTouchUpInside];

    // add to the scroller;
    [photoScroller addSubview:button];

    // release
    [button release];

    // set variables ready for the next one
    //lastWidth = thisImage.size.width;
    lastWidth = 80;             // we're using square images so set to 80 rather than the width of the image
    lastX = lastX+lastWidth;
}

现在这段代码几乎完美无缺,唯一的问题是用户只能在空格中触摸时滚动。

有没有办法可以实现,如果用户拖动UIButton它仍会滚动UIScrollView?

3 个答案:

答案 0 :(得分:2)

UIScrollView有一个名为delaysContentTouches的属性。默认情况下,此设置为YES,这会产生您想要的行为:即使您点按了UIButton,拖动也始终有效。

那么,如果您没有看到这种行为,那么您可能已将delaysContentTouches设置为NO

此外,不是在滚动视图中使用UIImageView,而是覆盖他们的touchedBegan:和朋友,而是简单地使用UIButton s可能更容易 代替。

您只需将按钮的图像设置为您想要的任何图像,您就不必将它们子类化。只需使用addTarget:使按钮在单击时对viewcontroller进行回调。 (这与使用Interface Builder建立IBAction连接相同)

答案 1 :(得分:0)

最终变成了一个非问题,我使用UIButton以防万一有人在想,所有似乎都按预期工作,并且我想要它。

我在滚动UIScrollView时出现的问题似乎在修改了一些代码后自行修复,并不完全确定导致问题的原因 - 在实际设备上使用时甚至都不是问题。 / p>

答案 2 :(得分:0)

过去我在使用添加到滚动视图的自定义视图上的按钮时遇到了一些问题。 @selectors似乎根本没有回应。更具体地说,我正在创建一个分页滚动视图,其中包含一个嵌入了uiwebview和一些按钮的UIView。我最终从嵌入的视图中删除了按钮并将它们放在父控制器中。我现在可以接收触摸事件 - 我想在uiscrollview和uiwebview之间有一些奇怪的触摸事件集群。