Autolayout и CGAffineTransform

Я пытаюсь масштабировать UIView во время взаимодействия с пользователем, и я реализовал CGAffineTransform для представления следующим образом:

@implementation Tileview
{
CGAffineTransform _tempTransform;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {
_tempTransform = self.transform;
self.transform = CGAffineTransformScale(self.transform, 1.2, 1.2);
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
 {
self.transform = _tempTransform;
}

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

Поэтому я попытался изменить код выше, чтобы использовать CATranform3D потому что казалось, что CAAffineTransform не может быть применен к слою. Но CATransform3D может быть. Но я не смог понять, как сделать масштаб слоя, используя этот объект Transform.

Я попытался применить преобразование к слою вида следующим образом:

self.layer.sublayerTransform = CATransform3DMakeScale(1.2, 1.2, 0.0f);

И это масштабирует все подслои моего взгляда

Но я пытаюсь применить это к

 self.layer = CATransform3DMakeScale(1.2, 1.2, 0.0f); 

Я получаю сообщение об ошибке

Присвоение только для чтения собственности

Я также посмотрел на CATransformLayer класс, но при попытке присвоить это self.layer я получаю сообщение об ошибке:

Присвоение CATransformLayer из несовместимого типа CATransform3D

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

1 ответ

Решение

Почему вы используете преобразование подслоя? Это должно работать:

self.layer.transform = CATransform3DScale(self.layer.transform, 1.2, 1.2, 1);

А также вы можете применить аффинные преобразования к слою, если вам действительно нужно через CATransform3DMakeAffineTransform(<#CGAffineTransform m#>)

Я заметил, что вы сохраняете исходное преобразование, чтобы применить его после окончания касаний. Вы можете восстановить первоначальное преобразование просто

self.layer.transform = CATransform3DIdentity;
Другие вопросы по тегам