2009-03-02 3 views
1

My usercase - приложение для iphone, где я делаю анимацию по масштабу, вращению и переводу изображения.Как обращаться с переводом Матрица в перевернутой точке оси Y

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

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

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

ответ

4

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

Однако вы можете перевернуть систему координат слоев вашего основного вида с помощью CATransform3D. Я делаю это так, чтобы я мог использовать один и тот же код макета Core Animation CALayer между моим iPhone-приложением и клиентом Mac (iPhone инвертирует обычную кварцевую систему координат для 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

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