Applying just the scale component of a CGAffineTra

2019-08-07 08:58发布

问题:

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)