在UIScrollView子类中设置contentOffset的适当位置在哪里?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在UIScrollView子类中设置contentOffset的适当位置在哪里?相关的知识,希望对你有一定的参考价值。
我正在研究一个继承自UIScrollView
的视图,并且要求它应该从依赖于视图大小的contentOffset.y
位置开始。具体来说,我想在一个3倍视图高度的内容中启动一个屏幕。像这样:
- (void)configureStartCondition {
self.contentSize = CGSizeMake(self.bounds.size.width, self.bounds.size.height * 3.0);
self.contentOffset = CGPointMake(0.0, self.bounds.size.height * 1.0);
}
视图本身与Storyboard中的约束相连,就像任何视图一样。在它工作时,框架最初会给视图提供它在故事板中的大小,然后当设备大小已知时,视图的大小将更改为其最终大小。这是它应该如何工作,我对此很好。我的问题是我在哪里打电话给configureStartCondition
?
一个明显的解决方案是将此代码放在setFrame:
中,但它不起作用。 setFrame:
仅用于初始帧大小,可能是也可能不是最终大小。为什么是这样?
// NOT working
- (void)setFrame:(CGRect)frame {
[super setFrame:frame];
[self configureStartCondition];
}
一个更常见的地方是在layoutSubview
,我通常在那里进行这种设置。然而,因为它是UIScrollView
,所以当用户滚动视图时,layoutSubview
被频繁调用。意思是我需要保存最后的高度并比较它以使工作正常,然后通过这个测试数百万次才能初始化。这对我来说感觉像是一块垃圾。
// Working, but ugly
- (void)layoutSubview {
[super layoutSubviews];
if (self.bounds.size.height != self.savedHeight) {
self.savedHeight = self.bounds.size.height;
[self configureStartCondition];
}
// Do layout stuff
}
另一个可能看起来不错的地方是setBounds:
。它将被调用视图大小更改,但由于contentOffset
属性与bounds
属性绑定,我实际上在这里获得与layoutSubviews
一样多的调用。
那么,有没有更好的地方去做,或者更好的方法呢?
副问题,在我的情况下不那么重要,但是可以从故事板设置内容偏移吗?
编辑:Swift
的解决方案也很好。
setContentSize:
对我来说非常适合。它仅在尺寸改变时调用。
PS:我要检查的代码:(对不起快速但UIKit没有区别)
class CustomScrollView: UIScrollView {
override var contentSize: CGSize{
didSet{
var offset = contentOffset
offset.y = contentSize.height / 2.0
contentOffset = offset
}
}
}
以上是关于在UIScrollView子类中设置contentOffset的适当位置在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
在 UIPageViewController 中设置 UIScrollView 的内容大小
启用多任务手势的 iPad 上的 UIScrollView 问题(iOS 4.3)