Преобразование перспективы на UILabel

Я пытаюсь добавить некоторую перспективу на UILabel, чтобы он отображался так, как будто он нарисован на наклонном лице.

Вот моя тестовая этикетка:

Desc

И после применения преобразования:

введите здесь описание изображения

Мой код:

@implementation MyViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100.f, 250.f, 100.f, 30.f)];
    label.text = @"Hello";
    label.textAlignment = NSTextAlignmentCenter;
    label.backgroundColor = [UIColor greenColor];
    [label tiltDegrees:20.f];
    [self.view addSubview:label];
    [label release];
}

@end


@implementation UIView (Perspective)

-(void) tiltDegrees:(CGFloat)degrees {
    CATransform3D aTransform = CATransform3DIdentity;
    CGFloat zDistance = 100; // affects the sharpness of the transform
    aTransform.m34 = 1.0 / -zDistance;
    aTransform = CATransform3DRotate(aTransform, degrees * M_PI / 180.0f, 1.0f, 0.0f, 0.0f);
    self.layer.transform = aTransform;
}

@end

Я застрял с кучей проблем:

  1. Текст внутри метки, похоже, не применяет преобразование так же, как это делает сам UILabel. Он не в кадре (обрезан), не по центру, и геометрия кажется неправильной. Может и размер не тот?
  2. Оно размыто. Как применить преобразование к текстовому вектору до его растрирования. Думаю, это даст четкие результаты.
  3. Кажется, я не могу уловить координацию между zDistance и degrees вращения, чтобы они приводили к правильной перспективе. Как я могу правильно рассчитать zDistance на основе degrees?

Любая помощь в решении (1) (2) (3) будет принята с благодарностью. Огромное спасибо


person DTs    schedule 13.01.2013    source источник


Ответы (1)


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

Переместите текстовый слой в сторону камеры, чтобы решить эту проблему.

person Nick Lockwood    schedule 19.05.2013