Swift - масштабировать фон при сохранении верхнего якоря - PullRequest
0 голосов
/ 08 января 2020

Как я могу scale a UIImageView при сохранении верхнего якоря?

Я пытался:

UIView.animate(withDuration: 0.3, animations: {
        self.backGroundImage.contentMode = .scaleToFill
        self.backGroundImage.transform = CGAffineTransform(scaleX: 3, y: 3)
        self.backGroundImage.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
    })

Это масштабирует изображение, но точка привязки является серединой образ. Кажется, установка topAnchor ничего не делает. Есть ли способ установить своего рода «scaleAnchor» или другое решение? В конце я хотел бы добиться этого:

enter image description here

Обновление

Вот как я constrain view:

NSLayoutConstraint.activate([

        // constrain background image
        backGroundImage.topAnchor.constraint(equalTo: view.topAnchor),
        backGroundImage.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        backGroundImage.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        backGroundImage.trailingAnchor.constraint(equalTo: view.trailingAnchor), )]

Ответы [ 2 ]

1 голос
/ 09 января 2020

Это работает для меня в Swift 5.1 :

public extension UIView {

    func applyTransform(withScale scale: CGFloat, anchorPoint: CGPoint) {
        let xPadding = (scale - 1) * (anchorPoint.x - 0.5) * bounds.width
        let yPadding = (scale - 1) * (anchorPoint.y - 0.5) * bounds.height
        transform = CGAffineTransform(scaleX: scale, y: scale).translatedBy(x: xPadding, y: yPadding)
    }
}

Пример:

yourView.applyTransform(withScale: 3, anchorPoint: CGPoint(x: 0.5, y: 0))
0 голосов
/ 08 января 2020

Матрица преобразования применяется после кадр был рассчитан из ограничений. Если вы хотите последовательно масштабировать вещи, я предлагаю вместо этого установить кратные ограничения по высоте и ширине. В качестве альтернативы вы можете переместить опорную точку, используя CALayers.anchorPoint , а затем примените преобразование так, чтобы оно масштабировалось от верхней середины вместо центра (что по умолчанию).

EDIT - - пример:

import PlaygroundSupport

class V: UIViewController {
  let square = UIView()
  override func viewDidLoad() {
    super.viewDidLoad()
    square.translatesAutoresizingMaskIntoConstraints = false
    square.backgroundColor = .red
    view.addSubview(square)
    NSLayoutConstraint.activate([
      square.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      square.centerYAnchor.constraint(equalTo: view.centerYAnchor),
      square.widthAnchor.constraint(equalToConstant: 100),
      square.heightAnchor.constraint(equalToConstant: 100),
    ])
    square.layer.anchorPoint = .init(x: 0.5, y: 0)
  }
  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    UIView.animate(withDuration: 10) {
      self.square.transform = .init(scaleX: 3, y: 3)
    }
  }
}
PlaygroundPage.current.liveView = V()
...