我正在处理一个继承自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
中的解决方案也很好。
答案 0 :(得分:0)
setContentSize:
对我来说非常适合。它仅在尺寸改变时调用。
PS:我要检查的代码:(对不起快速但UIKit没有区别)
class CustomScrollView: UIScrollView {
override var contentSize: CGSize{
didSet{
var offset = contentOffset
offset.y = contentSize.height / 2.0
contentOffset = offset
}
}
}