0

我已经在我的项目中实现了 iCarousels。但是在为 iOS 7 更新应用程序后,我的 iCarousels 卡在了两者之间。它在 iOS 6 和 5 中运行良好。iOS 7 中的问题是,当我触摸轮播视图时,有时会首先调用 iCarousel 视图下方的滚动视图。有谁可以帮我离开这里吗?

是下面方法的返回值中的解决方案:

- (CGFloat)carouselItemWidth:(iCarousel *)carousel

我在这里尝试了很多东西,它运行良好几次,但一段时间后它又开始卡住,因为滚动视图从其子视图(iCarousel 视图)获取触摸并在 iCarousel 的委托方法之前调用它自己的委托方法。

我没有使用任何手势识别器。我正在使用滚动视图,因为我有 iCarousel 视图和另一个视图UIScrollView,因此我也可以使用 pull 来刷新。

我正在使用以下委托方法,并且更改 carouselItemWidth 减少了卡住问题,但它仍然存在

- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset     baseTransform:(CATransform3D)transform
{
CGFloat tilt = 0.65f;
CGFloat spacing = 0.28f; // should be ~ 1/scrollSpeed;
CGFloat clampedOffset = fmaxf(-1.0f, fminf(1.5f, offset));
CGFloat itemWidth = 320;

CGFloat x = (clampedOffset * 0.5f * tilt + offset * spacing) * itemWidth;
CGFloat z = fabsf(clampedOffset) * -itemWidth * 0.5f;

transform = CATransform3DTranslate(transform, 0.0f, x, z);
transform = CATransform3DRotate(transform, -clampedOffset * M_PI_2 * tilt, -1.0f, 0.0f,   0.0f);

//DLog(@"offset: %f, %@", offset, [NSValue valueWithCATransform3D:transform]);

return transform;
}

- (NSUInteger)numberOfPlaceholdersInCarousel:(iCarousel *)carousel
{

//note: placeholder views are only displayed on some carousels if wrapping is disabled

return 0;

}

- (CGFloat)carouselItemWidth:(iCarousel *)carousel
{
//usually this should be slightly wider than the item views


if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
{
    return 270;
}
else
{
    return 250;
}
}



- (BOOL)carouselShouldWrap:(iCarousel *)carousel
{
return NO;
}
4

1 回答 1

3

问题似乎是,当滚动视图收到触摸时,它会等待一秒钟以查看是否应该在将其传递给轮播之前对其进行处理。

您可以(大部分)通过设置 scrollView.delaysContentTouches = NO; 来解决这个问题。

但是,如果您在滚动视图移动/减速时尝试滑动轮播,它仍然有点笨拙。您必须等到它停止移动才能与轮播交互。

我正在调查是否有更好的方法来解决这个问题。

更新:

我还没有为此提供适当的通用修复程序,但作为一种解决方法,您可以将此方法添加到 iCarousel 的本地副本中:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return [gesture isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]];
}

这会强制 iCarousel 的平移手势识别器优先于滚动视图中的平移手势识别器。如果将此与上面的 delaysContentTouches 修复结合使用,当轮播位于 tableview 或 scrollview 内时,滚动轮播应该不会有任何问题。

于 2013-11-06T13:16:13.533 回答