Согласно документу Apple для свойства преобразования UIView
Если значение этого свойства отличается от преобразования идентификатора, значение в свойстве фрейма не определено и должнобыть проигнорированным.
Вот почему вы не можете получить frame
после изменения transform
.
Как я понимаю, после поворота, масштабирования или панорамирования вы хотите сохранитьТекущее состояние восстановить позже.На мой взгляд, все, что вам нужно сделать, это сохранять transform
и center
из UIImageView
каждый раз, когда они меняются.В этом случае вам не нужен frame
.
Например, _transformTarget
- это ваш UIImageView
, чтобы сохранить его текущее состояние, вы можете использовать метод ниже ( Вместо сохранения в NSDictionary
, я использую NSUserDefaults
. Вы можете изменить его на NSDictionary
)
- (void)saveCurrentState {
[[NSUserDefaults standardUserDefaults] setObject:NSStringFromCGAffineTransform(_transformTarget.transform) forKey:@"_transformTarget.transform"];
[[NSUserDefaults standardUserDefaults] setObject:NSStringFromCGPoint(_transformTarget.center) forKey:@"_transformTarget.center"];
}
В конце каждого метода обработки жестов сохраните текущее состояние с помощью saveCurrentState
.
- (void)handlePanGesture:(UIPanGestureRecognizer*)gesture {
CGPoint translation = [gesture translationInView:self.view];
CGPoint newCenter = CGPointMake(_transformTarget.center.x + translation.x, _transformTarget.center.y + translation.y);
if (CGRectContainsPoint(self.view.frame, newCenter)) {
_transformTarget.center = newCenter;
[gesture setTranslation:CGPointZero inView:self.view];
[self saveCurrentState]; // Save current state when center is changed
}
}
- (void)handleRotationGesture:(UIRotationGestureRecognizer*)gesture {
_transformTarget.transform = CGAffineTransformRotate(_transformTarget.transform, gesture.rotation);
gesture.rotation = 0;
[self saveCurrentState]; // Save current state when transform is changed
}
- (void)handlePinchGesture:(UIPinchGestureRecognizer*)gesture {
_transformTarget.transform = CGAffineTransformScale(_transformTarget.transform, gesture.scale, gesture.scale);
gesture.scale = 1;
[self saveCurrentState]; // Save current state when transform is changed
}
Теперь информация о UIImageView
сохраняется при каждом изменении.В следующий раз, когда пользователь вернется, получите информацию о center
и transform
из своего словаря и установите их снова.
- (void)restoreFromSavedState {
NSString *transformString = [[NSUserDefaults standardUserDefaults] objectForKey:@"_transformTarget.transform"];
CGAffineTransform transform = transformString ? CGAffineTransformFromString(transformString) : CGAffineTransformIdentity;
NSString *centerString = [[NSUserDefaults standardUserDefaults] objectForKey:@"_transformTarget.center"];
CGPoint center = centerString ? CGPointFromString(centerString) : self.view.center;
_transformTarget.center = center;
_transformTarget.transform = transform;
}
Результат
Для более подробной информации, вы можете взглянуть на мой репо https://github.com/trungducc/stackoverflow/tree/restore-view-transform