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;