Applying just the scale component of a CGAffineTransform to a UIView

戏子无情 提交于 2020-01-16 07:11:20

问题


I have a UIView to which various scale and rotation CGAffineTransforms have been applied, in response to touch screen gestures.

When a scale operation completes, I want to adjust the bounds of the view to the new size, then have view to re-draw itself at a scale of 1.0, while keeping all other components of the transform the same.

To adjust the bounds of the view, I'm using:

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

To "undo" the scale transform, I'm trying this:

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

then calling [myView setNeedsDisplay] to get the view to redraw itself.

However this does not produce the desired results and when a rotate transform is applied, the above code seems to cause what looks like a sideways translation transform to be applied too.

What's the cleanest way to "undo" just a scale transform and have the view redraw at 1:1 with all other transforms remaining intact?


回答1:


I am handling something similar, and what I do is store the separate components in another struct (scale, rotation, translation). That way you can easily recreate the transform again (be careful about the order of your operations though).

One thing though: I suggest that you don't change the bounds and instead just apple a scale operation to the transform. This will avoid some potential unneeded layouts. All of this stuff can be handled purely with the transform property. The way you are doing it now is not going to change anything since applying a scale of 1 is a no-op. If you scaled up the view by 2, you would need to scale by 0.5 to get back to the original. Or, as I said above, store all the components and recreate it from the identity matrix (matrix math is fast, don't worry about that).




回答2:


Save your scale values in a variable and then, try changing CGAffineTransformMakeScale(1, 1) into

CGAffineTransformMakeScale(1/totalScaleWidth, 1/totalScaleHeight)


来源:https://stackoverflow.com/questions/17702120/applying-just-the-scale-component-of-a-cgaffinetransform-to-a-uiview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!