2015-07-17 3 views
1

Я хотел бы изменить UIView от:Достичь трапеция преобразования с CATransform3D

  o---o 
     | | 
     | | 
     | | 
     | | 
     | | 
     o---o 

To:

  /o 
     /| 
     o/ | 
     | | 
     o\ | 
      \ | 
      \o 

Простите мое искусство ASCii. То есть, чтобы изменить прямоугольный фон на трапецию фон, с:

  • одинаковой шириной
  • же право высоты

Я попытался это:

CATransform3D sublayerTransform = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, .005, 0, 0, 0, 1 }; 
self.backgroundView.layer.superlayer.sublayerTransform = sublayerTransform; 
CATransform3D layerTransform = CATransform3DMakeRotation(M_PI/4., 0, 1, 0); 
self.backgroundView.layer.transform = layerTransform; 

В результате трапеция , но он не имеет желаемых ограничений.

ответ

0

Я был в состоянии легко достичь правильного CATransform3D с помощью AGGeometryKit.

#import <AGGeometryKit/AGGeometryKit.h> 

UIView *view = ...; // create a view 

// setting anchorPoint to zero 
view.layer.anchorPoint = CGPointZero; 
view.layer.transform = CATransform3DMakeTranslation(-view.layer.bounds.size.width * .5, -view.layer.bounds.size.height * .5, 0); 

// setting a trapezoid transform 
AGKQuad quad = view.layer.quadrilateral; 
quad.tl.y += 10; // shift top left y-value with 10 pixels 
quad.bl.y -= 10; // shift bottom left y-value with 10 pixels 
view.layer.quadrilateral = quad; // the quad is converted to CATransform3D and applied 
2

Посмотрите на матрицу CATrasnsform3D, в вашем случае вам действительно нужно установить только .m34.

Имейте в виду, что CATransform3DRotate принимает радианы как один из его аргументов, который определяется следующим образом;

float Degrees2Radians(float degrees) { return degrees * M_PI/180; } 

Попробуйте следующее;

CATransform3D transform = CATransform3DIdentity; 
    transform.m34 = -1.0f /450.0f; 

    // set y to negative for effect on left(as in your diagram), positive for effect on right 
    transform = CATransform3DRotate(transform, Degrees2Radians(45) , 0.0f, -1.0f, 0.0f); 

    // you'll need to do this translate to shift the layer to compensate for the rotation 
    transform = CATransform3DTranslate(transform, -70.0f, 0.0f, -50.0f); 

то, очевидно, установить целевые слои преобразования к вышесказанному преобразования

+0

Приобретено для напоминания о недостающем переводе. –

Смежные вопросы