1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/sinduke-SDWebImageSwiftUI

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

SDWebImageSwiftUI

SDWebImageSwiftUI — это фреймворк для загрузки изображений в SwiftUI, основанный на SDWebImage.

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

Фреймворк предоставляет различные структуры View, API которых соответствует рекомендациям фреймворка SwiftUI. Если вы знакомы с Image, вам будет легко использовать WebImage и AnimatedImage.

Функции

Поскольку SDWebImageSwiftUI построен на основе SDWebImage, он предоставляет как готовые функции, так и расширенные мощные функции, которые могут потребоваться в реальных приложениях. Проверьте нашу Вики, когда вам нужно:

  • Анимированное изображение, полное решение со сбалансированным использованием ЦП и ОЗУ;
  • Прогрессивная загрузка изображений с поддержкой анимации;
  • Повторное использование загрузки, никогда не запрашивайте один URL дважды;
  • Модификатор запросов/ответов URL, предоставляющий пользовательский HTTP-заголовок;
  • Трансформатор изображений, применяющий закруглённые углы или CIFilter;
  • Система множественных кэшей, запрос из разных источников;
  • Система нескольких загрузчиков, загрузка из разных ресурсов.

Вы также можете воспользоваться всеми преимуществами существующего сообщества вокруг SDWebImage. Вы можете получить обширную поддержку форматов изображений (GIF/APNG/WebP/HEIF/AVIF/SVG/PDF) через плагины кодера, поддержку PhotoKit через SDWebImagePhotosPlugin, интеграцию с Firebase через FirebaseUI и т. д.

Помимо всех этих функций, мы оптимизируем SwiftUI, например, Binding, View Modifier, используя тот же шаблон проектирования, чтобы стать хорошим гражданином SwiftUI.

Версия

Этот фреймворк активно разрабатывается, рекомендуется по возможности использовать последнюю версию (включая зависимость SDWebImage).

Версия v1.0.0 теперь выпущена, она предоставляет все вышеперечисленные функции со стабильным API, полной документацией и модульным тестированием.

Этот фреймворк следует семантическому управлению версиями. Каждое изменение API, нарушающее работу источника, приводит к увеличению основной версии.

Журнал изменений

В этом проекте используется формат ведения журнала изменений, чтобы записывать изменения. Ознакомьтесь с CHANGELOG.md об изменениях между версиями. Изменения также будут обновлены на странице выпуска.

Вклад

Приветствуются все отчёты о проблемах, запросы функций, вклады и звёзды GitHub. Надеемся на активную обратную связь и продвижение, если вы считаете этот фреймворк полезным.

Требования

  • Xcode 11+;
  • iOS 13+;
  • macOS 10.15+;
  • tvOS 13+;
  • watchOS 6+;
  • Swift 5.1+.

Установка

Swift Package Manager

SDWebImageSwiftUI доступен через Swift Package Manager.

Для интеграции приложений вы должны использовать Xcode 11 или выше, чтобы добавить этот пакет в цель вашего приложения. Для этого проверьте добавление зависимостей пакетов в ваше приложение. Использование SDWebImageSwiftUI в приложениях

Пошаговый туториал по использованию Xcode.

  • Для последующих фреймворков:

Автору последующего фреймворка следует создать файл Package.swift в своём git-репозитории, а затем добавить следующую строку, чтобы отметить зависимость вашего фреймворка от SDWebImageSwiftUI.

let package = Package(
    dependencies: [
        .package(url: "https://github.com/SDWebImage/SDWebImageSwiftUI.git", from: "1.0")
    ],
)

CocoaPods

SDWebImageSwiftUI доступен через CocoaPods. Чтобы установить его, просто добавьте следующую строку в свой Podfile:

pod 'SDWebImageSwiftUI'

Carthage

SDWebImageSwiftUI также доступен через Carthage.

github "SDWebImage/SDWebImageSwiftUI"

Использование

Использование WebImage для загрузки сетевого изображения

  • Поддерживает параметры и контекст для управления загрузкой изображений, такие как .delayPlaceholder, чтобы показывать заполнитель только при ошибке.
  • Поддерживает прогрессивную загрузку изображений (как базовая версия).
  • Поддерживает события изменений успеха/неудачи/прогресса для пользовательской обработки.
  • Поддерживает индикатор с индикатором активности/прогресса и настройку.
  • Поддерживает встроенную анимацию и переходы на основе SwiftUI.
  • Также поддерживает анимированные изображения!
var body: some View {
    WebImage(url: URL(string: "https://nokiatech.github.io/heif/content/images/ski_jump_1440x960.heic"))
    // Поддерживает опции и контекст, например, `.queryMemoryData`, если вам действительно нужны данные
}

Обратите внимание: данные существуют только тогда, когда они запрашиваются из дискового кэша или сети. Используйте .queryMemoryData, если они вам действительно нужны.

Также поддерживается использование ViewBuilder.

.placeholder {
    Rectangle().foregroundColor(.gray)
}

Поддерживает использование модификатора .resizable() для изменения размера изображения.

Примечание: этот WebImage использует Image для внутренней реализации, что обеспечивает лучшую совместимость с системой компоновки и анимации SwiftUI. Однако, в отличие от SwiftUI Image, который не поддерживает анимированные или векторные изображения, WebImage также поддерживает анимированные изображения.

Рекомендуется использовать AnimatedImage для расширенного управления, такого как прогрессивная анимация рендеринга.

@State var isAnimating: Bool = true
var body: some View {
    WebImage(url: URL(string: "https://raw.githubusercontent.com/liyong03/YLGIFImage/master/YLGIFImageDemo/YLGIFImageDemo/joy.gif"), isAnimating: $isAnimating)) // Управление анимацией, поддерживает динамические изменения
    // Начальное значение привязки должно быть истинным
    .customLoopCount(1) // Пользовательский счётчик циклов
    .playbackRate(2.0) // Скорость воспроизведения
    // `WebImage` поддерживает расширенное управление, как и `AnimatedImage`, но без поддержки прогрессивной анимации
}

Использование AnimatedImage для воспроизведения анимации

  • Поддержка сетевых изображений, локальных данных и изображений из пакета.
  • Поддержка анимированных изображений и форматов векторных изображений.
  • Поддержка прогрессивной загрузки анимированных изображений (например, веб-браузер).
  • Управление анимацией с использованием SwiftUI Binding.
  • Индикатор и переход, поддерживаемые SDWebImage и Core Animation.
  • Расширенное управление, такое как количество циклов, скорость воспроизведения, размер буфера, режим runloop и т. д.
  • Координация с собственными представлениями UIKit/AppKit. Использование для обратной совместимости и слабого связывания SwiftUI

SDWebImageSwiftUI поддерживает использование, когда целевая версия вашего приложения меньше iOS 13/macOS 10.15/tvOS 13/watchOS 6. Это позволяет осуществлять слабое связывание SwiftUI (Combine) для написания кода с доступной проверкой во время выполнения.

Чтобы использовать обратную совместимость, необходимо выполнить следующие действия:

  1. Добавить слабое связывание фреймворка. Необходимо добавить -weak_framework SwiftUI -weak_framework Combine в настройку сборки «Другие флаги компоновщика» вашей целевой версии приложения. Вы также можете сделать это, используя флажок Xcode «Необязательный фреймворк», что даст тот же эффект.

    Обратите внимание, что все сторонние фреймворки SwiftUI должны иметь эту настройку сборки, а не только SDWebImageSwiftUI. В противном случае при запуске на устройстве iOS 12 возникнет ошибка времени выполнения dyld.

  2. Обратная совместимость на iOS 12.1 и ниже. Для версий целевой версии ниже iOS 12.2 (первая версия, в которой среда выполнения Swift 5 была включена в систему iOS), необходимо изменить минимальную целевую версию SDWebImageSwiftUI. Это может привести к некоторым побочным эффектам в оптимизации компилятора и вызвать массовые предупреждения для некоторых фреймворков.

    Однако для версий iOS 12.2+ вы можете сохранить минимальную целевую версию на уровне iOS 13 без дополнительных предупреждений или замедления производительности для клиентов iOS 13.

    Поскольку Swift использует минимальную целевую версию для определения того, следует ли связать приложение со встроенной средой выполнения или с системной (/usr/lib/swift/libswiftCore.dylib).

    Для пользователей CocoaPods можно изменить минимальную целевую версию в Podfile через пост-установщик:

    post_install do |installer|
      installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
          config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' # нужная вам версия
        end
      end
    end

    Для пользователя Carthage можно использовать carthage update --no-build, чтобы загрузить зависимость, затем изменить целевую версию Xcode проекта и собрать бинарный фреймворк.

    Для пользователя SwiftPM необходимо использовать локальную зависимость (с подмодулем Git), чтобы изменить целевую версию.

  3. Обратная совместимость на iOS 12.2 и выше. Для пользователя Carthage собранный бинарный фреймворк будет использовать Library Evolution, чтобы поддерживать обратную совместимость.

    Для пользователя CocoaPods можно пропустить проверку версии платформы в Podfile с помощью:

    platform :ios, '13.0' # Это не влияет на целевую версию вашего приложения, просто подсказка для CocoaPods

    Для пользователя SwiftPM SwiftPM не поддерживает ни слабое связывание, ни Library Evolution, поэтому он не может быть развёрнут для пользователей iOS 12+ без изменения минимальной целевой версии.

  4. Добавьте доступную аннотацию. Добавьте весь код SwiftUI с доступной аннотацией и проверкой времени выполнения, например:

    // AppDelegate.swift
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // ...
        if #available(iOS 13, *) {
            window.rootViewController = UIHostingController(rootView: ContentView())
        } else {
            window.rootViewController = ViewController()
        }
        // ...
    }
    
    // ViewController.swift
    class ViewController: UIViewController {
        var label: UILabel = UILabel()
        override func viewDidLoad() {
            super.viewDidLoad()
            view.backgroundColor = .white
            view.addSubview(label)
    ``` ## Демо
    

Чтобы запустить пример с использованием SwiftUI, выполните следующие действия:

cd Example
pod install

Затем откройте Xcode Workspace, чтобы запустить демонстрационное приложение.

Поскольку SwiftUI предназначен для поддержки всех платформ Apple, наша демонстрация также это делает, включая одну кодовую базу:

  • iOS (iPhone/iPad/Mac Catalyst)
  • macOS
  • tvOS
  • watchOS

Советы по демонстрации:

  1. Используйте Switch (щелкните правой кнопкой мыши на macOS/нажмите и удерживайте на watchOS), чтобы переключаться между WebImage и AnimatedImage.
  2. Используйте Reload (щелкните правой кнопкой мыши на macOS/нажмите и удерживайте на watchOS), чтобы очистить кэш.
  3. Используйте Swipe Left (кнопка меню на tvOS), чтобы удалить один URL-адрес изображения из списка.
  4. Жест щипка (цифровая корона на watchOS, кнопка воспроизведения на tvOS) для увеличения масштаба детализированного изображения страницы.
  5. Очистите кэш и перейдите на подробную страницу, чтобы увидеть прогрессивную загрузку.

Тест

У SDWebImageSwiftUI есть модульный тест для повышения качества кода. Для SwiftUI нет официального решения для модульного тестирования, предоставленного Apple.

Однако, поскольку SwiftUI является системой компоновки на основе состояний и атрибутов, существуют проекты с открытым исходным кодом, которые предоставляют решение:

  • ViewInspector: проверяет значение атрибута представления во время выполнения (например, модификатор .frame, значение .image). Мы используем это для тестирования AnimatedImage и WebImage. Это также позволяет проверять собственные UIView/NSView, которые мы используем для проверки ActivityIndicator и ProgressIndicator.

Для запуска теста:

  1. Запустите carthage build в корневом каталоге, чтобы установить зависимость.
  2. Откройте SDWebImageSwiftUI.xcodeproj, дождитесь завершения загрузки тестовой зависимости SwiftPM.
  3. Выберите схему SDWebImageSwiftUITests и начните тестирование.

Мы уже настроили конвейер CI, каждый PR будет запускать тестовый случай и загружать отчет о тестировании на codecov.

Скриншот

  • Демонстрация iOS
  • Демонстрация macOS
  • Демонстрация tvOS
  • Демонстрация watchOS

Дополнительные примечания

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

  • Совместимость со SwiftUI
  • Интеграция диспетчера пакетов Swift
  • Совместимость исходного кода Swift и Swifty

Это означает, что этот проект является основным вариантом использования и зависимостью от нисходящего потока, которая определяет будущее развитие SDWebImage.

Автор

DreamPiggy

Благодарности

Лицензия

SDWebImageSwiftUI доступен под лицензией MIT. Дополнительную информацию см. в файле LICENSE.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

SwiftUI Image loading and Animation framework powered by SDWebImage Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/sinduke-SDWebImageSwiftUI.git
git@api.gitlife.ru:oschina-mirror/sinduke-SDWebImageSwiftUI.git
oschina-mirror
sinduke-SDWebImageSwiftUI
sinduke-SDWebImageSwiftUI
master