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

时间:2018-02-28 10:55:32

标签: ios objective-c uiscrollview

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

1 个答案:

答案 0 :(得分:0)

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

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

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

}