Как работать с матрицей перевода в перевернутой оси Y - PullRequest
1 голос
/ 02 марта 2009

My usercase - это приложение для iphone, где я делаю анимацию в масштабе, повороте и переводе изображения.

Итак, я конкатирую все и передаю его в свойство transform, но есть одна проблема:

Поскольку мои изображения различаются по размеру, проблема заключается в правильном их расположении. Я привык к инвертированной системе координат оси Y, поэтому я хочу, чтобы мое изображение располагалось точно в 60 пикселях по оси Y.

Итак, как мне перейти от исходной декартовой оси y к точке зрения с инвертированной осью y?

Ответы [ 2 ]

4 голосов
/ 02 марта 2009

Как указывает smacl, самый простой способ сделать это - сместить свое начало координат в нижний левый угол экрана, используя (screenheight - viewheight - y) вместо y в источниках ваших видов.

Однако вы можете перевернуть систему координат слоев вашего основного вида, используя CATransform3D. Я делаю это для того, чтобы я мог совместно использовать один и тот же код макета Core Animation CALayer между моим приложением iPhone и клиентом Mac (iPhone инвертирует нормальную систему координат Quartz для CALayers, чтобы соответствовать системе UIViews). Все, что вам нужно сделать, чтобы включить это, это поместить строку

self.layer.sublayerTransform = CATransform3DMakeScale(1.0f, -1.0f, 1.0f);

в вашем коде инициализации для вашего слоя-хостинга UIView. Помните, что это перевернет ваши CALayers, поэтому любой рендеринг текста UIKit в этих слоях, возможно, также необходимо будет перевернуть, используя код, подобный следующему:

CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0f, self.frame.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);

UIFont *theFont = [UIFont fontWithName:@"Helvetica" size:fontSize];
[text drawAtPoint:CGPointZero withFont:theFont];

CGContextRestoreGState(context);

Вы можете сделать аналогичный вид инверсии, используя CGAffineTransform, но вам также потребуется применить перевод, чтобы сделать эту работу:

CGAffineTransform flipTransform = CGAffineTransformMakeTranslation(0.0f, self.frame.size.height);
flipTransform = CGAffineTransformScale(flipTransform, 1.0f, -1.0f);

Возможно, вы сможете использовать аффинное преобразование для преобразования координат вашего источника, используя CGPointApplyAffineTransform ().

0 голосов
/ 02 марта 2009

Для каждой ординаты y, y = top-y, где top - ордината y верхней части ограничительной рамки, в которой вы рисуете.

...