#objective-c #ios #cgaffinetransform
#objective-c #iOS #cgaffinetransform
Вопрос:
Итак, мне нужно применить некоторое масштабирование и некоторый поворот к представлению (я делаю это с помощью жестов), поэтому для каждого жеста я обновляю текущие значения масштабирования и поворота чем-то вроде:
self.scaleWidth *= gesture.scale; //When I detect an horizontal pinch
self.scaleHeight *= gesture.scale; //When I detect a vertical pinch
self.rotationAngle = gesture.rotationAngle; //When I detect a rotation
Затем я делаю следующее, чтобы преобразовать представление:
CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, self.scaleWidth, self.scaleHeight);
self.theSubViewToTransform.transform = CGAffineTransformRotate(transform, self.rotationAngle);
Когда я выполняю только масштабирование, это работает нормально. Когда я выполняю масштабирование, а затем поворачиваю, оно вращается нормально. Когда после поворота я пытаюсь масштабировать снова, это не работает нормально: масштаб применяется так, как если бы это было сделано после поворота, деформируя структуру моего изображения.
Я думал, что сделал то, что нужно было сделать, чтобы избежать этого: каждый раз начиная с преобразования идентификатора, сначала масштабируя, а затем поворачивая, но, очевидно, я ошибался…
Кто-нибудь знает, что не так с моей реализацией?
Спасибо
Ответ №1:
Если вы каждый раз начинаете с преобразования идентификатора, конечный результат, на который вы настраиваете преобразование подвида, будет включать только масштабирование и поворот текущего жеста. Вместо того, чтобы начинать с идентификатора, начните с текущего преобразования представления.
CGAffineTransform transform = self.theSubViewToTransform.transform;
transform = CGAffineTransformScale(transform, self.scaleWidth, self.scaleHeight);
transform = CGAffineTransformRotate(transform, self.rotationAngle);
self.theSubViewToTransform.transform = transform;
При первом выполнении преобразование начнется как преобразование идентификатора. При последующих исполнениях будут внесены новые изменения поверх старых.
Комментарии:
1. Именно так я это и делал в первую очередь, начиная с предыдущего преобразования и добавляя маргинальное преобразование каждый раз, но это тоже не помогает. Если вы посмотрите на мой код, вы увидите, что я обновляю свои параметры для каждой преобразования с незначительными изменениями, поэтому мои параметры являются абсолютными по сравнению с инициализацией глобального представления, и я должен выполнить преобразование, начиная с преобразования идентификатора.
2. Я думаю, что проблема может быть в конкатенации. Используемые вами распознаватели являются непрерывными и будут отправлять более одного обратного вызова. Коэффициенты масштабирования и поворота для жестов указаны с начала жеста, а не с момента последнего обратного вызова. Вы не должны умножать на эти коэффициенты каждый раз, когда меняется жест. Однако трудно сказать больше, не просмотрев больше вашего кода.
3. Хорошо, прошу прощения, это моя вина. Я забыл упомянуть в своем первоначальном сообщении, что я сбрасываю значение распознавателя при каждом обратном вызове.
Ответ №2:
Для swift 3:
view.transform = CGAffineTransform(rotationAngle: CGFloat.pi).concatenating(CGAffineTransform(scaleX: 0.4, y: 0.4))
Ответ №3:
Вы должны начать с вашего текущего преобразованного состояния и применить ожидаемое преобразование. Также вы можете взглянуть на CGAffineTransformConcat
, это сделает его единственным преобразованием перед применением.
CGAffineTransform transform = yourView.transform;
transform = CGAffineTransformConcat(CGAffineTransformScale(transform, self.scaleWidth, self.scaleHeight),
CGAffineTransformRotate(transform, self.rotationAngle));
yourView.transform = transform;
Надеюсь, это поможет!
Ответ №4:
Попробуйте применить преобразования к преобразованию идентификатора, например
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformScale(transform, scaleWidth, scaleHeight);
transform = CGAffineTransformRotate(transform, angle);
viewToTransform.transform = transform;