【问题标题】:Applying just the scale component of a CGAffineTransform to a UIView仅将 CGAffineTransform 的缩放组件应用于 UIView
【发布时间】:2013-07-17 14:11:22
【问题描述】:

我有一个 UIView,它应用了各种缩放和旋转 CGAffineTransforms,以响应触摸屏手势。

当缩放操作完成时,我想将视图的边界调整为新大小,然后让视图以 1.0 的比例重新绘制自身,同时保持变换的所有其他组件相同。

为了调整视图的边界,我正在使用:

self.myView.bounds = CGRectApplyAffineTransform(self.myView.bounds, self.myView.transform);

要“撤消”比例变换,我正在尝试:

self.myView.transform = CGAffineTransformConcat(self.myView.transform, CGAffineTransformMakeScale(1, 1));

然后调用[myView setNeedsDisplay] 让视图重绘自身。

但是这不会产生预期的结果,并且当应用旋转变换时,上面的代码似乎也会导致应用看起来像横向平移的变换。

什么是“撤消”仅缩放变换并以 1:1 重绘视图而所有其他变换保持不变的最简洁方法?

【问题讨论】:

    标签: ios uiview uikit cgaffinetransform


    【解决方案1】:

    我正在处理类似的事情,我所做的是将单独的组件存储在另一个结构中(缩放、旋转、平移)。这样您就可以轻松地再次重新创建转换(但请注意操作的顺序)。

    但有一件事:我建议您不要更改边界,而只需对变换进行缩放操作。这将避免一些潜在的不需要的布局。所有这些东西都可以纯粹用 transform 属性来处理。你现在这样做的方式不会改变任何事情,因为应用 1 的比例是无操作的。如果将视图放大 2 倍,则需要将视图放大 0.5 倍才能恢复原状。或者,正如我上面所说,存储所有组件并从单位矩阵重新创建它(矩阵数学很快,不用担心)。

    【讨论】:

    • 谢谢 borrrden。我更改边界的原因是我希望视图在没有任何缩放变换的情况下重绘自身,以便内容清晰,而不是像应用缩放变换时那样模糊。
    • 如果您使用 CoreGraphics 绘制视图,您可以尝试在图层上设置 contentScale 以匹配比例。根据我的经验,这会导致重绘。如果您坚持使用 bounds 方法,那么您必须将比例存储在其他地方以便您可以撤消它(将边界宽度和高度除以比例)。您可能还必须重做所有操作,因为矩阵乘法不是可交流的。
    【解决方案2】:

    将比例值保存在变量中,然后尝试将 CGAffineTransformMakeScale(1, 1) 更改为

    CGAffineTransformMakeScale(1/totalScaleWidth, 1/totalScaleHeight)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多