Создание полностью пользовательского UIRfreshControl

Мне нужно создать полностью настраиваемый элемент управления UIRefresh. Анимация, изображение, количество раскрывающихся элементов и т. д.

Моя первоначальная мысль - начать с нуля, использовать UIViewController, добавить к нему свое собственное представление, анимировать, обратившись к методам UIScrollViewDelegate.

Я могу сделать все это, но есть ли способ с немного меньшим объемом работы и более простым добавлением к нескольким UITableView?

Можно ли создать подкласс UIRefreshControl и изменить внутри него такое количество вещей?


person Fogmeister    schedule 17.07.2013    source источник


Ответы (3)


ОТВЕТ ОБНОВЛЕН

  • Обновление проекта GitHub до Swift 3.1
  • Обновлен QuartzCode до версии 1.55.0 (изменения в сгенерированном коде)
  • Код переработан для использования нового свойства refreshControl (появилось в iOS 10) (теперь также более "быстро").
  • Включено предложение @Hanny (внизу) (спасибо!)

Мне нравится ссылка на YouTube, которую вы разместили. :) Хороший результат.

Для справки: QuartzCode очень хорош для создания анимации UIRefreshControl с нуля.

Ознакомьтесь с этим небольшим проектом (GitHub). В нем вы найдете файл проекта QuartzCode, а также пример его интеграции с UITableView.

Я думаю, что самая важная часть — это функция refresh:

/// Called everytime refresh control's value changes.
///
/// - parameter sender: The `UIRefreshControl` of this TableView.
@IBAction func refresh(_ sender: UIRefreshControl) {

    animate()

    // In this "demo", the refresh will last 5.0 seconds.
    DispatchQueue.main.asyncAfter(deadline: .now() + 5) {

        // Do something with the retrieved data...
        // TODO

        // ... then end the refresh operation.
        self.refreshControl?.endRefreshing()

        // Stop animations.
        self.stopAnimations()
    }
}

Посмотрите, как легко использовать анимации:

/// Three examples. Uncomment / comment to check all of them.
func animate() {

    // Example 01.
    animateCloudUpAndDown()

    // Example 02.
    //animateCloudStrokeWithGradientFill()

    // Example 03.
    //animateCloudStrokeWithSolidFill()
}

// MARK: - Animation Examples

/// Animates the cloud up and down.
func animateCloudUpAndDown() {
    customUIRefreshControl.addRefreshUpDownAnimation()
}

/// "Draws" the cloud by make its stroke line gradually visible, then shows
/// a solid blueish background and then fades everything out.
func animateCloudStrokeWithGradientFill() {
    customUIRefreshControl.addRefreshGradientAnimation()
}

/// "Draws" the cloud by make its stroke line gradually visible, then shows
/// a gradient blueish background and then fades everything out.
func animateCloudStrokeWithSolidFill() {
    customUIRefreshControl.addRefreshSolidAnimation()
}

Ваше здоровье!

person backslash-f    schedule 11.05.2016
comment
Я думаю, что animate() лучше разместить в начале функции обновления. Нет смысла анимировать, пока мы прокручиваем данные. - person Hanny; 10.05.2017
comment
@Hanny, большое спасибо за ваш комментарий. Я согласен. Я внес некоторые изменения в код и включил ваше предложение. Посмотри. ;) - person backslash-f; 10.05.2017

EGOTableViewPullRefresh — отличная функция «потяните вниз, чтобы обновить». Он доступен на github. Вы можете настроить свои изображения, поведение и т. д. UIRefreshControl доступно только в iOS 6.0 и более поздних версиях. EGOTableViewPullRefresh можно использовать в iOS 5 и более ранних версиях!

person Valentin Shamardin    schedule 17.07.2013
comment
Спасибо, похоже на то, как я собирался сделать это сам :) - person Fogmeister; 17.07.2013

у нас есть учебник с примером кода на Objective-C и Swift для реализации настраиваемых элементов управления Pull to Refresh. Вы можете найти его здесь: http://www.jackrabbitmobile.com/design/ios-custom-pull-to-refresh-control/

Надеюсь, это поможет, и дайте мне знать, если у вас есть какие-либо вопросы!

--Энтони

person Anthony Blatner    schedule 27.02.2015
comment
Спасибо, я смог заставить его работать в конце концов. youtu.be/lN1HejGmlYI очень мало кода, так как все было направлено на правильное определение ограничений макета. - person Fogmeister; 27.02.2015