Фоновое изображение Viewcontroller с горизонтальной анимацией

ios swift animation

592 просмотра

2 ответа

Я пытаюсь создать анимированное фоновое изображение для одного из моих контроллеров представления, где изображение прокручивается по горизонтали слева направо, а затем повторяется, когда оно достигает конца изображения по горизонтали. Этот эффект чрезвычайно распространен в играх с SpriteKit, но нет четкой информации о том, как это сделать в стандартном контроллере представления с UIKit. Дополнительные очки, если вы можете сказать мне, как установить верхние границы изображения в нижней части панели навигации, а не в верхней части контроллера представления :)

Вот изображение: фоновая картинка

Автор: jwhubert91 Источник Размещён: 08.11.2019 11:32

Ответы (2)


1 плюс

Решение

Используйте две копии изображения. Начните с одного изображения, полностью занимающего экран. Другой слева. Анимируйте вправо, чтобы вторая копия вытеснила первую копию с экрана. Когда анимация подходит к концу, так что только одна копия полностью занимает экран, вернитесь к началу и повторите. Прыжок не будет виден, потому что изображения идентичны, и прыжок выполняется, когда они находятся в одинаковых положениях.

Приятно то, что поведение, которое я только что описал, является значением по умолчанию для повторяющейся CABasicAnimation; он возвращается к началу автоматически в конце каждого повторения. Таким образом, мне удалось очень быстро написать подтверждение концепции (Swift 3, iOS 10):

    let im = UIImage(named:"stuff")!
    // create double image
    let r = UIGraphicsImageRenderer(size:
        CGSize(width:im.size.width*2,height:im.size.height))
    let im2 = r.image { _ in
        im.draw(at: .zero)
        im.draw(at: CGPoint(x: im.size.width, y: 0))
    }
    // create layer to hold double image
    let imlay = CALayer()
    imlay.frame.size = im2.size
    imlay.contents = im2.cgImage
    // put it inside a single-image-sized container
    let scroll = CALayer()
    scroll.frame = CGRect(origin: .zero, size: im.size)
    scroll.masksToBounds = true
    scroll.addSublayer(imlay)
    scroll.bounds.origin = CGPoint(x:im.size.width, y:0)
    // put it in the interface
    self.view.layer.addSublayer(scroll)
    // animate
    let anim = CABasicAnimation(keyPath: "bounds.origin")
    anim.toValue = NSValue(cgPoint: .zero)
    anim.duration = 10
    anim.repeatCount = .infinity
    scroll.add(anim, forKey: nil)
Автор: matt Размещён: 20.08.2016 04:27

1 плюс

You can achieve it by setting the `frame` of your `imageview` within an animation block like below:


func animate(){
        imageView.frame.origin.x = 0
        UIView.animateWithDuration(2, delay: 0.0, options: .CurveLinear, animations: {[unowned self] () -> Void in

            self.imageView.frame.origin.x = self.view.frame.size.width
            }) {[unowned self] (finsihed) -> Void in
                self.animate()
        }

    }
Автор: Mohammed Shakeer Размещён: 20.08.2016 04:31
Вопросы из категории :
32x32