У меня есть UIBezierPath
, и я бы хотел получить его зеркальное изображение. Как я могу это сделать?
// Method for generating a path
UIBezierPath *myPath = [self generateAPathInBounds:boundingRect];
// ? now I would like to mirror myPath ?
У меня есть UIBezierPath
, и я бы хотел получить его зеркальное изображение. Как я могу это сделать?
// Method for generating a path
UIBezierPath *myPath = [self generateAPathInBounds:boundingRect];
// ? now I would like to mirror myPath ?
// Method for generating a path
UIBezierPath *myPath = [self generateAPathInBounds:boundingRect];
// Create two transforms, one to mirror across the x axis, and one to
// to translate the resulting path back into the desired boundingRect
CGAffineTransform mirrorOverXOrigin = CGAffineTransformMakeScale(-1.0f, 1.0f);
CGAffineTransform translate = CGAffineTransformMakeTranslation(boundingRect.width, 0);
// Apply these transforms to the path
[myPath applyTransform:mirrorOverXOrigin];
[myPath applyTransform:translate];
Следует отметить, что вам может понадобиться дополнительный код в зависимости от того, где в общем представлении путь, который вы пытаетесь зеркалировать, есть.
Если вы пытаетесь зеркалировать путь, который занимает весь вид (или по крайней мере выравнивается с координатой 0 оси, которую вы зеркалируете), тогда ответ @wbarksdale будет работать для вас. Однако, если вы пытаетесь зеркально отобразить путь, который представляет собой небольшую часть общего вида, которая находится где-то посередине представления, вам нужно сделать больше работы. В общем, алгоритм подобен этому
//this rect should be the bounds of your path within its superviews
//coordinate system
let rect = myPath.bounds
//first, you need to move the view all the way to the left
//because otherwise, if you mirror it in its current position,
//the view will be thrown way off screen to the left
path.apply(CGAffineTransform(translationX: -rect.origin.x, y: 0))
//then you mirror it
path.apply(CGAffineTransform(scaleX: -1, y: 1))
//then, after its mirrored, move it back to its original position
path.apply(CGAffineTransform(translationX: rect.origin.x + rect.width, y: 0))
В общем, алгоритм должен быть
Переместите путь либо к самому левому, либо к самому верху представления
в зависимости от того, перемещаетесь ли вы горизонтально или вертикально, используя CGAffineTransform(translateX....)
Зеркальное отображение с помощью CGAffineTransform(scaleX....
Переместите представление в исходное положение, используя CGAffineTransform(translateX....)
Это верный ответ:
// Method for generating a path
UIBezierPath *myPath = [self generateAPathInBounds:boundingRect];
// Create two transforms, one to mirror across the x axis, and one to
// to translate the resulting path back into the desired boundingRect
CGAffineTransform mirrorOverXOrigin = CGAffineTransformMakeScale(-1.0f, 1.0f);
CGAffineTransform translate = CGAffineTransformMakeTranslation(CGRectGetMidX(boundingRect), 0);
CGAffineTransform translateBack = CGAffineTransformMakeTranslation(-CGRectGetMidX(boundingRect), 0);
// Apply these transforms to the path
[myPath applyTransform:translate];
[myPath applyTransform:mirrorOverXOrigin];
[myPath applyTransform:translateBack];