UIView.animate с imageArray внутри UIScrollView, но с таким эффектом, как включение разбиения по страницам

Я новичок в Swift, но у меня есть базовый опыт. Я успешно создал анимацию с тремя изображениями, и они повторяются. Но я бы хотел, чтобы эффект от этого повторения был как при включении проверки разбиения на страницы в инспекторе атрибутов UIScrollView.

Внутри опций: UIView.AnimationOptions Я пробовал разные константы, но не могу найти, что мне подходит.

Мой вопрос: могу ли я анимировать массив изображений, как если бы вы прокручивали изображения в режиме прокрутки с включенным разбиением по страницам?

class ViewController: UIViewController {

    @IBOutlet weak var mainScrollView: UIScrollView!

    var imageArray = [UIImage]()

    override func viewDidLoad() {
        super.viewDidLoad()

        imageArray = [UIImage(named: "forest")!, UIImage(named: "slika1")!, UIImage(named: "slika2")!]

        for i in 0..<imageArray.count {

            let imageView = UIImageView()
            imageView.image = imageArray[i]
            imageView.contentMode = .scaleAspectFit
            let xPosition = self.miniView.frame.width * CGFloat(i)
            imageView.frame = CGRect(x: xPosition, y: 0, width: self.mainScrollView.frame.width, height: self.mainScrollView.frame.height)

            mainScrollView.contentSize.width = mainScrollView.frame.width * CGFloat(i + 1)
            mainScrollView.addSubview(imageView)

        }

        startAnimating()
    }

    func startAnimating() {
        var newOffset = mainScrollView.contentOffset
        newOffset.x = 0.0
        newOffset.x += mainScrollView.frame.width * CGFloat(imageArray.count - 1)
        UIView.animate(withDuration: Double(imageArray.count), delay: 5, options: [.repeat, .allowUserInteraction], animations: {
            self.mainScrollView.contentOffset = newOffset
        })
    }

}

Вы пробовали использовать self.mainScrollView.setContentOffset(contentOffset: newOffset, animated: true), а не UIView.animate(withDuration: Double(imageArray.count), delay: 5, options: [.repeat, .allowUserInteraction], animations: { self.mainScrollView.contentOffset = newOffset })?

Romulo BM 18.12.2018 17:11

Нет, я не пробовал, потому что мне нужна анимация, в которой движутся сами картинки. С этим кодом, который вы отправляете, у меня нет такого эффекта. Но спасибо, что пытаетесь найти хоть какое-то решение.

DJ Djus 19.12.2018 01:15

Итак, я не понимаю, что вы пытаетесь сказать с помощью «Могу ли я анимировать массив изображений, как будто вы прокручиваете изображения в режиме прокрутки с включенным разбиением по страницам», вы можете лучше всего объяснить?

Romulo BM 19.12.2018 14:21

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

DJ Djus 19.12.2018 15:32

Ладно, я понял. Я кое-что делаю и перехожу к доставке по ответу

Romulo BM 19.12.2018 17:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, если я правильно понимаю, что вы хотите, это правильный ответ. Анимируйте постранично с задержкой в ​​5 секунд с одной анимацией и другой.

Вам необходимо использовать Timer.scheduledTimer для запуска метода перехода на следующую страницу. С помощью этого решения вы можете проверить включение разбиения по страницам, чтобы пользователь мог изменить саму страницу.

Я надеюсь, что это помогает

class ViewController: UIViewController {

        @IBOutlet weak var mainScrollView: UIScrollView!

        var imageArray = [UIImage]()

        var currentPage = 0

        override func viewDidLoad() {
            super.viewDidLoad()

            imageArray = [UIImage(named: "forest")!, UIImage(named: "slika1")!, UIImage(named: "slika2")!]

            for i in 0..<imageArray.count {

                let imageView = UIImageView()
                imageView.image = imageArray[i]
                imageView.contentMode = .scaleAspectFit
                let xPosition = self.miniView.frame.width * CGFloat(i)
                imageView.frame = CGRect(x: xPosition, y: 0, width: self.mainScrollView.frame.width, height: self.mainScrollView.frame.height)

                mainScrollView.contentSize.width = mainScrollView.frame.width * CGFloat(i + 1)
                mainScrollView.addSubview(imageView)

            }

            Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(startAnimating), userInfo: nil, repeats: true)
        }

        @objc func startAnimating() {

           //that line check if the current page is the last one, and set it to the first, otherwise, it increment the currentPage
           self.currentPage = (self.currentPage == imageArray.count-1) ? 0 : self.currentPage+1


           var newOffset = mainScrollView.contentOffset
           newOffset.x = mainScrollView.frame.width * CGFloat(self.currentPage)

           self.mainScrollView.setContentOffset(newOffset, animated: true)
       }

    }

Да, это мне очень помогло. Большое Вам спасибо. Функция Timer.scheduledTimer широко используется, я встречался с этой функцией, но я не использовал ее таким образом с комбинацией текущей страницы. Спасибо за быстрое решение

DJ Djus 20.12.2018 11:08

Рад помочь вам, можете ли вы выбрать правильный ответ?

Romulo BM 20.12.2018 12:59

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