2012-04-27 5 views
2

У меня есть слой, который мне нужно преобразовать. В настоящее время я использую следующие:CATransform3DRotate flip horizontal

self.customLayer.transform = CATransform3DRotate(CATransform3DIdentity,M_PI/2.0f, 0, 0, 1); 

Это правильно делает слой правой стороной вверх, но она также должна быть перевернута горизонтально, так как это неправильный путь. Как мне настроить CATransform3DRotate?

+0

Можете ли вы объяснить более текущий результат у вас есть руки желаемого результата? – sch

+0

Его просто нужно перевернуть горизонтально, не уверен, как еще объяснить это! –

ответ

9

Вам понадобятся:

self.customLayer.transform = CATransform3DScale(CATransform3DMakeRotation(M_PI/2.0f, 0, 0, 1), 
               -1, 1, 1); 

Шкала с -1 является флип. Представьте, что вы скручиваете изображение по горизонтали, и вы идете мимо нуля.

+0

Это дает мне следующую ошибку: Передача 'int' в параметр несовместимого типа 'CATransform3D' и предупреждение: Неявное объявление функции CATransform3DMakeRotate недействительно на C99. –

+1

@NicHubbard - Это должно быть 'CATransform3DMakeRotation', а не' CATransform3DMakeRotate'. +1 – sch

+0

Хм, хорошо, теперь это вверх дном. –

4

Я лично считаю его более читаемым, чтобы использовать KVC для этих вещей. Вы могли бы использовать что-то вроде следующего, чтобы достичь того же эффекта:

// Rotate the layer 90 degrees to the left 
[self.customLayer setValue:@-1.5707 forKeyPath:@"transform.rotation"]; 
// Flip the layer horizontally 
[self.customLayer setValue:@-1 forKeyPath:@"transform.scale.x"]; 
3

Поскольку параметр здесь

CATransform3DScale (CATransform3D t, CGFloat sx, CGFloat sy, CGFloat sz) 

Если вы хотите, чтобы перевернуть горизонтально, вы не должны предоставлять какие-либо значение вектора в CATransform3DMakeRotation (). Вместо этого вы хотите просто контролировать масштаб оси x.

По листать горизонтально вы должны:

self.transform = CATransform3DScale(CATransform3DMakeRotation(0, 0, 0, 0), 
             -1, 1, 1); 

Если вы хотите, чтобы перевернуть его обратно происхождения, вы делаете:

self.transform = CATransform3DScale(CATransform3DMakeRotation(0, 0, 0, 0), 
             1, 1, 1); 

Дополнение:
Сокращенный вариант сэкономит вам одну операцию , Переворот:

self.transform = CATransform3DMakeRotation(M_PI, 0, 1, 0); 

Чтобы перевернуть в нормальное состоянии:

self.transform = CATransform3DMakeRotation(0, 0, 1, 0); 
Смежные вопросы