UIScrollView的左右contentInset导致UIRefreshControl布局错误。

5

如果我使用带有非零左/右contentInsetUIScrollView并添加一个UIRefreshControl,则刷新位置不正确,使UI和动画看起来很奇怪。

scrollView.contentInset = UIEdgeInsets(top: 0, left: 40, bottom: 0, right: 40)
scrollView.refreshControl = UIRefreshControl()

我不想修改刷新控件的布局,但是找不到正确定位的方法。
以下是错误截图: enter image description here 这是视图检查器中的动画: enter image description here

如果控制台上没有约束错误,那么滚动视图上是否有遗漏的约束?看起来刷新控件保留了故事板的大小。 - EricD
那里也有一个单元格吗?因为它看起来可能会超出视图的右侧。您能否取消剪辑视图以确保滚动视图正确定位?调试代码层次结构底部的其中一个图标可以实现此功能。 - Kyle Bashour
@EricD 这个演示使用了自动布局,但是我可以使用普通的框架计算来完全复制它。 - rnystrom
@KyleBashour 滚动视图中没有子视图 :( - rnystrom
1
啊,我的错误。奇怪的是UIRefreshControl文档仍然有那个警告 https://developer.apple.com/documentation/uikit/uirefreshcontrol - John Brophy
显示剩余2条评论
1个回答

6

我通过创建UIRefreshControl的子类在本地解决了这个问题,但这显然是一个hack。

override var frame: CGRect {
    get { return super.frame }
    set {
        var newFrame = newValue
        if let superScrollView = superview as? UIScrollView {
            newFrame.origin.x = superScrollView.frame.minX - superScrollView.contentInset.left
        }
        super.frame = newFrame
    }
}

我会提交一个radar,因为我开始认为这是UIKit中的一个bug。


由于刷新控件是滚动视图的子视图,我实际上认为您不需要关心滚动视图的框架:newFrame.origin.x = -superScrollView.contentInset.left - Peter
在我看来,这样会更好: newFrame.origin.y = newValue.minY - (superScrollView.contentInset.top / 2) - Ruben Nahatakyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接