滚动到嵌套 StackViews 中的内容

关于滚动的最大问题是确定在 ScrollView 内部呈现(例如) StackView 内的 Textfield 所需的偏移量。

如果你试图得到 Textfield.frame.minY 的位置可以是 0 ,因为 minY 帧只考虑了元素和 StackView 顶部之间的距离。所以你必须考虑所有其他父堆栈视图/视图。

一个很好的解决方法是:

1 - 实现 ScrollView 扩展

extension UIScrollView {

    func scrollToShowView(view: UIView){
        var offset = view.frame.minY
        var superview = view.superview
        while((superview  != nil)){
            offset += (superview?.frame.minY)!
            superview = superview?.superview
        }
        
        offset -= 100 //optional margin added on offset
        
        self.contentOffset = CGPoint.init(x: 0, y: offset)
    }

}

这将考虑所有父视图并将滚动视图的必要偏移量相加在屏幕上显示必要的视图(例如,不能留在用户键盘后面的 Textfield)

用法示例:

func textViewDidBeginEditing(_ textView: UITextView) {
    self.contentScrollView.scrollToShowView(view: textView)
}