Почему обводка контура рисования искажается при анимации вращения устройства - PullRequest
1 голос
/ 21 июня 2020

Что вызывает искажение обводки контура при анимации вращения устройства? Какие есть способы предотвратить это?

Непосредственно перед запуском анимации контур выглядит так, как будто он был нарисован каллиграфическим пером, а к тому времени, когда вращение завершается, он снова выглядит нормально.

введите описание изображения здесь

Чертеж

class DrawingView: UIView {

    override func draw(_ rect: CGRect) {

        let strokeW: CGFloat = 10

        let center = CGPoint(x: self.bounds.midX, y: self.bounds.midY)

        let path = UIBezierPath(ovalIn: self.bounds.insetBy(dx: strokeW/2, dy: strokeW/2))
        path.lineWidth = strokeW
        path.stroke()

        path.move(to: center)
        path.addLine(to: CGPoint(x: 0, y: 0))
        path.stroke()
    }
}

Контроллер просмотра

extension NSLayoutConstraint {
    func setPriority(_ priority: UILayoutPriority) -> NSLayoutConstraint {
        self.priority = priority
        return self
    }
}

extension UILayoutPriority {
    static var high: UILayoutPriority {
        return UILayoutPriority(rawValue: 751)
    }
}

class ViewController: UIViewController {

    var drawingView = DrawingView()

    var safeArea = UILayoutGuide()
    var lg = UILayoutGuide()
    var wConstraint: NSLayoutConstraint!
    var hConstraint: NSLayoutConstraint!

    override func loadView() {
        super.loadView()
        drawingView.backgroundColor = .systemTeal
        self.view.addSubview(drawingView)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        self.drawingView.translatesAutoresizingMaskIntoConstraints = false

        applyConstraints()
        updateOrientation()
    }

    func updateOrientation() {
        if self.view.bounds.width < self.view.bounds.height {
            self.wConstraint.constant = 180
            self.hConstraint.constant = 320
        } else {
            self.wConstraint.constant = 320
            self.hConstraint.constant = 180
        }
    }

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {

        super.viewWillTransition(to: size, with: coordinator)

        coordinator.animate(alongsideTransition: {_ in

            self.updateOrientation()
            self.view.layoutIfNeeded()
            self.drawingView.setNeedsDisplay()
        })
    }

    func applyConstraints() {

        safeArea = self.view.safeAreaLayoutGuide
        self.view.addLayoutGuide(lg)

        wConstraint = lg.widthAnchor.constraint(equalToConstant: 180)
        hConstraint = lg.heightAnchor.constraint(equalToConstant: 320)
        NSLayoutConstraint.activate([wConstraint, hConstraint])

        // layout guide constraints
        let lgConstraints: [NSLayoutConstraint] = ([
            lg.centerXAnchor.constraint(equalTo: safeArea.centerXAnchor),
            lg.centerYAnchor.constraint(equalTo: safeArea.centerYAnchor),
            lg.leadingAnchor.constraint(greaterThanOrEqualTo: safeArea.leadingAnchor, constant: 10),
            lg.trailingAnchor.constraint(lessThanOrEqualTo: safeArea.trailingAnchor, constant: 10),
            lg.topAnchor.constraint(greaterThanOrEqualTo: safeArea.topAnchor, constant: 10),
            lg.bottomAnchor.constraint(lessThanOrEqualTo: safeArea.bottomAnchor, constant: 10),

            lg.leadingAnchor.constraint(equalTo: safeArea.leadingAnchor, constant: 10).setPriority(.high),
            lg.trailingAnchor.constraint(equalTo: safeArea.trailingAnchor, constant: 10).setPriority(.high),
            lg.topAnchor.constraint(equalTo: safeArea.topAnchor, constant: 10).setPriority(.high),
            lg.bottomAnchor.constraint(equalTo: safeArea.bottomAnchor, constant: 10).setPriority(.high),
        ])
        NSLayoutConstraint.activate(lgConstraints)

        // drawingView constraints
        let drawingViewConstraints: [NSLayoutConstraint] = ([
            drawingView.leadingAnchor.constraint(equalTo: lg.leadingAnchor),
            drawingView.trailingAnchor.constraint(equalTo: lg.trailingAnchor),
            drawingView.topAnchor.constraint(equalTo: lg.topAnchor),
            drawingView.bottomAnchor.constraint(equalTo: lg.bottomAnchor)
        ])
        NSLayoutConstraint.activate(drawingViewConstraints)
    }
}

1 Ответ

0 голосов
/ 21 июня 2020

Свойство contentMode по умолчанию UIView - .scaleToFill

Изменение его на .scaleAspectFit предотвращает искажение ширины штриха.

Я установил self.drawingView.contentMode = .scaleAspectFit в loadView() из примера вопроса код для получения этого результата.

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...