Как перекрыть UINavigationBar с анимацией?

У меня есть UIImageView, который расширяет границы со следующей анимацией:

override func viewDidAppear(animated: Bool) {

        var longPress = UILongPressGestureRecognizer(target: self, action: Selector("longPress:"))

        imageView.addGestureRecognizer(longPress)
        imageView.userInteractionEnabled = true
    }

    func longPress(gesture:UILongPressGestureRecognizer)
    {
        if gesture.state == UIGestureRecognizerState.Began
        {
            oldbounds = self.imageView.bounds

            let bounds = self.imageView.bounds
            UIView.animateWithDuration(0.5, delay: 0.0, usingSpringWithDamping: 0.4, initialSpringVelocity: 10, options: UIViewAnimationOptions.CurveEaseInOut, animations: {
                self.imageView.bounds = CGRect(x: bounds.origin.x, y: bounds.origin.y, width: bounds.size.width + 50, height: bounds.size.height + 50)
            }, completion: nil)

            println("user pressed on image")
        }
        else if gesture.state == UIGestureRecognizerState.Changed
        {
            gesture.state == UIGestureRecognizerState.Began
        }
        else
        {
            let bounds = self.imageView.bounds
            UIView.animateWithDuration(0.2, animations: {
                self.imageView.bounds = self.oldbounds
            })

            println("user release on image")
        }
    }

однако навигационная панель покрывает часть UIImageview, когда она анимирована. Как мне как-то перекрывать панель навигации с UIImageview, когда он анимирован? Я бы просто переместил положение иерархии элементов в структуре документа, но я не знаю, как это сделать с навигационной панелью. Так что, есть предложения?

1 ответ

Решение

РЕШЕНИЕ 1

В начале я думал, что можно было бы переместить imageView в KeyWindow -> Animate it ->. Однако перемещение imageView из UIWindow также заставит его немедленно исчезнуть. Вот почему я придумал прогулку ниже:

https://gist.github.com/dobaduc/79374c42d3af3756e345

РЕШЕНИЕ 2 (ЛУЧШЕ)

Вернувшись к предыдущему решению, я смог выяснить, что после перемещения imageView обратно из ключевого окна, если я немного подожду, прежде чем восстановить свой предыдущий кадр, все работает просто отлично!

// This method is to ensure that the imageView will appear exactly at the point you want in the key window
func bringImageViewToWindow() {
    let window = UIApplication.sharedApplication().keyWindow!
    let origin = imageView.superview!.convertPoint(imageView.frame.origin, toView: window)

    frameInSuperView = imageView.frame
    frameInWindow = CGRect(origin: origin, size: frameInSuperView.size)
    imageView.frame = frameInWindow

    window.addSubview(imageView)
}

func bringImageViewBack() {
    view.addSubview(imageView)

    // Without this block, the imageView will `disappear` magically for some reasons :-)
    let delay = 0.01 * Double(NSEC_PER_SEC)
    let time  = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue(), {
      self.imageView.frame = self.frameInSuperView
    })
}

Вот лучшая версия: https://gist.github.com/dobaduc/1894fc8c8e6a28c2d34c

Оба решения работают нормально, но второе намного чище.

Надеюсь это поможет:)

Другие вопросы по тегам