iCarousels 卡在 iOS 7 中
Posted
技术标签:
【中文标题】iCarousels 卡在 iOS 7 中【英文标题】:iCarousels Getting Stuck in iOS 7 【发布时间】:2013-11-06 07:33:09 【问题描述】:我已经在我的项目中实现了 iCarousels。但是在为 ios 7 更新应用程序后,我的 iCarousels 卡在了两者之间。它在 iOS 6 和 5 中运行良好。iOS 7 中的问题是,当我触摸轮播视图时,有时会首先调用 iCarousel 视图下方的滚动视图。有谁能帮帮我吗?
下面方法的返回值中的解决方法是:
- (CGFloat)carouselItemWidth:(iCarousel *)carousel
我在这里尝试了很多东西,几次都可以正常工作,但一段时间后又开始卡住,因为滚动视图从其子视图(iCarousel 视图)获取触摸并在 iCarousel 的委托之前调用它自己的委托方法方法。
我没有使用任何手势识别器。我正在使用滚动视图,因为我有 iCarousel 视图和位于 UIScrollView
上的另一个视图,因此我也可以使用拉动来刷新。
我正在使用以下委托方法,并且更改 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;
【问题讨论】:
请添加一些代码。 iCarousel 在 iOS 7 上正常工作,afaik... 【参考方案1】:问题似乎是,当滚动视图接收到触摸时,它会等待一秒钟以查看是否应该在将其传递给轮播之前对其进行处理。
您可以(大部分)通过设置 scrollView.delaysContentTouches = NO 来解决此问题;
但是,如果您在滚动视图移动/减速时尝试滑动轮播,这仍然有点笨拙。您必须等到它停止移动才能与轮播交互。
我正在调查是否有更好的方法来解决这个问题。
更新:
我还没有为此提供适当的通用修复,但作为一种解决方法,您可以将此方法添加到 iCarousel 的本地副本:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
return [gesture isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]];
这会强制 iCarousel 的平移手势识别器优先于滚动视图中的平移手势识别器。如果将此与上面的 delaysContentTouches 修复相结合,当轮播位于 tableview 或 scrollview 内时,滚动轮播应该不会有任何问题。
【讨论】:
我尝试了以下行:scrollView.delaysContentTouches = NO;但有时它仍然会卡住。任何帮助表示赞赏 我找到了一个临时解决方法,直到我可以构建一个适当的修复程序。我会更新答案。 抱歉回复晚了,我正忙于其他项目。谢谢您的帮助。到目前为止,在集成您提到的解决方法后,我还没有发现任何问题。如果我以后遇到任何问题,会再次打扰您..顺便问一下,为什么这个问题仅在 iOS 7 的情况下出现? 因为 iOS 7 破坏了一切 ;-)以上是关于iCarousels 卡在 iOS 7 中的主要内容,如果未能解决你的问题,请参考以下文章