[英]Where is the proper place to set contentOffset in UIScrollView sub-class?
我正在处理从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
。 这意味着我需要保存最后一个高度并进行比较以使事情正常进行,然后数百万次运行此测试才能进行初始化。 对我来说,这就像是一种鞭udge。
// 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
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.