在UIScrollView子类中设置contentOffset的适当位置在哪里?

问题描述 投票:0回答:1

我正在研究一个继承自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的解决方案也很好。

ios objective-c uiscrollview
1个回答
0
投票

setContentSize:对我来说非常适合。它仅在尺寸改变时调用。

PS:我要检查的代码:(对不起快速但UIKit没有区别)

class CustomScrollView: UIScrollView {
    override var contentSize: CGSize{
        didSet{
            var offset = contentOffset
            offset.y = contentSize.height / 2.0
            contentOffset = offset
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.