相关疑难解决方法(0)

UIScrollView缩放后如何重置?

我有一个图形被绘制在一个UIScrollView.它是一个UIView使用自定义子类CATiledLayer作为其层的大型.

当我放大和缩小时UIScrollView,我希望图形动态调整大小,就像我从图表返回时一样viewForZoomingInScrollView.但是,Graph在新的缩放级别重绘自己,我想将变换比例重置为1x1,以便下次用户缩放时,变换从当前视图开始.如果我将转换重置为Identity in scrollViewDidEndZooming,它可以在模拟器中工作,但会EXC_BAD_ACCSES在设备上抛出.

这甚至都没有在模拟器上完全解决问题,因为下次用户放大时,变换将自身重置为它所处的任何缩放级别,因此看起来,如果我缩放到2x,例如,它突然达到4倍.当我完成缩放时,它以正确的比例结束,但实际的缩放行为看起来很糟糕.

首先:如何让图形在缩放后以1x1的标准比例重绘自己,如何在整个过程中进行平滑缩放?

编辑:新发现错误似乎是" [CALayer retainCount]: message sent to deallocated instance"

我自己永远不会释放任何图层.在此之前,我甚至没有删除任何观点或任何内容.在缩放和旋转时抛出此错误.如果我在旋转之前删除对象并在之后重新添加它,它不会抛出异常.这不是缩放的选项.

iphone cocoa-touch zooming uiscrollview ios

16
推荐指数
4
解决办法
5万
查看次数

使用自动布局时,如何使UIScrollView仅向一个方向放大

我试图让UIScrollView只允许在水平方向上放大.滚动视图使用纯自动布局方法设置.通常的方法是在许多Stack Overflow答案(例如这个)和其他资源中建议的.在自动布局存在之前,我已成功在应用中使用此功能.方法如下:在滚动视图的内容视图中,我覆盖setTransform()并修改传入的变换以仅在x方向上缩放:

override var transform: CGAffineTransform {
    get { return super.transform }
    set {
        var t = newValue
        t.d = 1.0
        super.transform = t
    }
}
Run Code Online (Sandbox Code Playgroud)

我还重置滚动视图的内容偏移量,以便在缩放过程中不会垂直滚动:

func scrollViewDidZoom(scrollView: UIScrollView) {
    scrollView.contentSize = CGSize(width: scrollView.contentSize.width, height: scrollView.frame.height)
    scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: 0.0)
}
Run Code Online (Sandbox Code Playgroud)

不使用autolayout时,这非常好用:

缩放没有自动布局

但是,使用自动布局时,内容偏移在缩放过程中会导致错误.内容视图仅在水平方向上缩放,但它会垂直移动:

使用自动布局缩放

在GitHub上放了一个示例项目(用于在这个问题中制作视频).它包含两个故事板,Main.storyboard和NoAutolayout.storyboard,它们是相同的,除了Main.storyboard已打开autolayout而NoAutolayout没有.通过更改主界面项目设置在它们之间切换,您可以在两种情况下查看行为.

我真的不想关闭autolayout,因为它解决了以比手动布局要求更好的方式实现我的UI的许多问题.有没有办法在自动布局缩放期间保持垂直内容偏移正确(即零)?

编辑:我已经在示例项目中添加了第三个故事板AutolayoutVariableColumns.storyboard.这会添加一个文本字段来更改GridView中的列数,从而更改其内在内容大小.这更加密切地显示了在提示此问题的真实应用程序中我需要的行为.

zoom uiscrollview ios autolayout swift

11
推荐指数
1
解决办法
1779
查看次数

标签 统计

ios ×2

uiscrollview ×2

autolayout ×1

cocoa-touch ×1

iphone ×1

swift ×1

zoom ×1

zooming ×1