很抱歉这个长而自我解释的标题,但UIScrollView提出了很多问题,我发现很难找到可能在不同情况下有用的问题。
我在iPad应用中嵌套了滚动视图。到目前为止一切都那么好,一切都有起伏,但它很光滑,反应灵敏。我的外部滚动视图是一个分页滚动视图,其中包含全屏或更大内容滚动视图。 Outter scrollview是水平和内部垂直。就像照片库一样。我发现当我缩放并滚动内部滚动视图时,只有当滚动视图向下滚动到内容的底部并且弹跳为OFF时,才会检测到慢速和长滑动手势的明显延迟。
另一个原因是内部scrollview弹跳属性伪随机地变为YES / NO。因此,这是构造函数中的代码,用于设置正在执行的内部滚动视图:
if (UIInterfaceOrientationIsPortrait(forOrientation)) {
self.minimumZoomScale = 1.0;
self.maximumZoomScale = 1.0;
self.bounces = NO;
self.alwaysBounceVertical = NO;
self.scrollEnabled = NO;
}else if (UIInterfaceOrientationIsLandscape(forOrientation)){
self.minimumZoomScale = 1.333333f;
self.maximumZoomScale = 1.333333f;
self.bounces = YES;
self.alwaysBounceVertical = YES;
self.scrollEnabled = YES;
}
self.scrollsToTop = NO;
self.showsVerticalScrollIndicator = YES;
self.showsHorizontalScrollIndicator = NO;
self.directionalLockEnabled = YES;
self.delegate = self;
self.pagingEnabled = NO;
self.canCancelContentTouches = NO;
self.delaysContentTouches = YES;
当iPad旋转时,弹跳也将进入滚动视图并且还会出现弹跳故障。
这是一个错误吗?还是只是我,我搞砸了?
提前感谢您的时间和兴趣!
更新: 我正在嵌套两个实际上是UIScrollView子类的scrollview。我这样做是因为我需要覆盖hitTest以及其他方法。我也尝试了这里描述的更好的解决方案http://openradar.appspot.com/8045239并没有取得任何好的结果。
答案 0 :(得分:3)
我正在回答我自己的问题。
打开雷达的问题帖子上发布的错误解决方案,为了阻止uiscrollview调整大小并取消弹跳,它不是很清楚要隔离什么
基本上可以在layoutSubViews期间改变视图框架的一切只能通过双重检查来完成,如果大小等于layoutSubviews中编码的更改,那么它不会运行多次。
-(void)layoutSubviews {
///...
if (!self.bounces) {
self.bounces = YES;
}
if(!self.scrollEnabled){
self.scrollEnabled = YES;
}
if (!CGSizeEqualToSize(rect.size, self.contentSize)) {
self.contentSize = rect.size;
}
if (self.zoomScale < MAXIMUM_ZOOM_SCALE ) {
[self zoomToRect:ZOOM_RECT_MAKE animated:NO];// otherwise this line of code won't do anything at all
}
}
答案 1 :(得分:0)
嵌套滚动视图将始终导致触摸响应问题。我假设内部是主要的 - 一个用户与更多人进行交互?一般来说,你可能不得不写一些你自己的触摸响应者(至少,这是我的经验,无论是代码还是SO)。使垂直滚动更加宽容,但只检测外部的窄范围滑动和拖动(近水平线)。这样,大多数触摸输入将被发送到内部视图。
就弹跳而言,移除您设置属性的其中一个地方,看看会发生什么。
这是哪种方法?希望这段代码驻留在UIView子类中......?