Попробуйте изменить кадр UIImageView, но он не работает в соответствии с кодом

#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 тем, что . Согласно документам, «Все геометрические манипуляции с представлением происходят в указанной точке» (имеется в виду точка привязки). Когда вы поворачиваете изображение, а затем изменяете его размер, точка привязки расположена неправильно, поэтому конечная высота и ширина не те, которые вы указали.

Я избегал выполнять все геометрические вычисления, которые привели бы к правильному расположению точки привязки (или правильной высоте и ширине). Но вот одно из решений:

  1. Удалите строку кода self.setAnchorPoint(CGPoint(x: 0.5, y: 1.0))
  2. Перед установкой рамки, то есть перед линией 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). Итак, решение поворачивает изображение в его стандартное положение, изменяет его размер, а затем поворачивает его под нужным углом. Устройство делает это достаточно быстро, чтобы пользователь не заметил двойного поворота.