繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM