#ios #swift #uiimageview #resize
Вопрос:
Я создал подкласс UIImageView. Я использую его функцию setupView()
для настройки фрейма каждого объекта DirectionView в viewDidLoad (), и он отлично работает. Но когда я сбрасываю кадр объекта DirectionView с помощью той же функции при срабатывании кнопки, новое значение кадра оказывается не таким, как я ожидал.
Значения x, y, ширины и высоты, показанные в области отладки, все правильные. Однако значение кадра, которое я распечатываю с помощью print("Original frame: (self.frame)")
, показывает другой набор значений.
Почему это происходит? И как это исправить?
class DirectionView: UIImageView {
override init(image: UIImage?) {
super.init(image: image)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
func setupView(_ degree: Double, showSigInfo: Bool) {
let rotationAngle = degree.toRadians
var height: Double = 375 / 2
let width = height / 47 * 37
let x = 375 / 2 - width / 2
let y = 0.0
self.frame = CGRect(x: x, y: y, width: width, height: height)
print("Original frame: (self.frame)")
self.contentMode = .scaleAspectFit
self.setAnchorPoint(CGPoint(x: 0.5, y: 1.0))
UIView.animate(withDuration: 0.0) {
self.transform = CGAffineTransform(rotationAngle: rotationAngle)
}
}
}
Комментарии:
1. добавьте эту строку перед установкой рамки :
self.translatesAutoresizingMaskIntoConstraints = true
2. Привет @RajaKishan, спасибо за совет, но это не меняет результата.
Ответ №1:
Проблема связана с anchor point
тем, что . Согласно документам, «Все геометрические манипуляции с представлением происходят в указанной точке» (имеется в виду точка привязки). Когда вы поворачиваете изображение, а затем изменяете его размер, точка привязки расположена неправильно, поэтому конечная высота и ширина не те, которые вы указали.
Я избегал выполнять все геометрические вычисления, которые привели бы к правильному расположению точки привязки (или правильной высоте и ширине). Но вот одно из решений:
- Удалите строку кода
self.setAnchorPoint(CGPoint(x: 0.5, y: 1.0))
- Перед установкой рамки, то есть перед линией
self.frame = CGRect(x: x, y: y, width: width, height: height)
. Добавьте следующую строку:UIView.animate(withDuration: 0.0) {self.transform = CGAffineTransform(rotationAngle: 0)}
Это должно сделать свою работу.
Почему это работает? Значение точки привязки по умолчанию равно (0,5,0,5), что обеспечивает правильное изменение размера, когда изображение находится в стандартном положении (поворот = 0). Итак, решение поворачивает изображение в его стандартное положение, изменяет его размер, а затем поворачивает его под нужным углом. Устройство делает это достаточно быстро, чтобы пользователь не заметил двойного поворота.