Странная анимация происходит при расширении UIView - PullRequest
0 голосов
/ 17 октября 2018

У меня есть класс XUIView, как показано ниже.Когда я запускаю анимацию, это не влияет на сворачивание.

Кто может мне объяснить?

class ViewController: UIViewController {

    // Width constraint of XUIView instance
    @IBOutlet weak var vwWrapperWidth: NSLayoutConstraint! {
        didSet{
            self.vwWrapperWidth.constant = UIScreen.main.bounds.width
        }
    }

    @IBAction func btnToggleTouchUp(_ sender: UIButton) {
        if(self.vwWrapperWidth.constant == 55) {
            // animation effect is OK when expanding
            self.vwWrapperWidth.constant = UIScreen.main.bounds.width

            UIView.animate(withDuration: 0.5, animations: {
                self.view.layoutIfNeeded()
            })
        }
        else {
            // animation effect is not OK when folding
            self.vwWrapperWidth.constant = 55
            UIView.animate(withDuration: 0.5, animations: {
                self.view.layoutIfNeeded()
            })
        }
    }
    //.....
}

@IBDesignable
class XUIView: UIView {

    @IBInspectable
    var roundTopLeftCorner: Bool = false

    @IBInspectable
    var roundBottomLeftCorner: Bool = false

    @IBInspectable
    var roundTopRightCorner: Bool = false

    @IBInspectable
    var roundBottomRightCorner: Bool = false

    @IBInspectable
    var cornerRadius: CGFloat = 0.0

    @IBInspectable
    var borderWidth: CGFloat = 0.0

    @IBInspectable
    var borderColor: UIColor?

    fileprivate var borderLayer: CAShapeLayer? {
        didSet{
            self.layer.addSublayer(self.borderLayer!)
        }
    }

    func roundCorners(_ corners: UIRectCorner) {
        if(self.borderLayer == nil) { self.borderLayer = CAShapeLayer() }

        let bounds = self.bounds

        let maskPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: self.cornerRadius, height: self.cornerRadius))

        let maskLayer = CAShapeLayer()
        maskLayer.frame = bounds
        maskLayer.path = maskPath.cgPath

        self.layer.mask = maskLayer

        self.borderLayer?.frame = bounds
        self.borderLayer?.path = maskPath.cgPath
        self.borderLayer?.strokeColor = self.borderColor?.cgColor
        self.borderLayer?.lineWidth = self.borderWidth
        self.borderLayer?.fillColor = nil

    }

    override func layoutSubviews() {
        super.layoutSubviews()
        var roundedCorners: UIRectCorner = []
        if(roundTopLeftCorner) { roundedCorners.insert(.topLeft) }
        if(roundTopRightCorner) { roundedCorners.insert(.topRight) }
        if(roundBottomLeftCorner) { roundedCorners.insert(.bottomLeft) }
        if(roundBottomRightCorner) { roundedCorners.insert(.bottomRight) }
        roundCorners(roundedCorners)
    }


}

исходный код: http://www.mediafire.com/file/n6svp1mk44fc0uf/TestXUIView.zip/file

1 Ответ

0 голосов
/ 17 октября 2018

Проблема в том, что вы создаете CAShapeLayer в layoutSubviews, что означает, что каждый раз, когда происходит анимация, она получает вызов.

Попробуйте комментировать строку 91, и вы получите то, что хотите.

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