feat: Custom string attributes to BaseTextAttributes #15

Merged
ivan.smolin merged 2 commits from feature/uiviewbackground into master 2023-10-09 23:52:10 +03:00
Member

TL;DR

  • Добавлена возможность кастомизации фона UIView. На текущий момент реализовано два фона: сплошной цвет и градиентный слой
  • Добавлен SingleValueStorage для работы с Codable значениями в keychain
  • Переименованы методы startAnimation и stopAnimation у SkeletonPresenter, для избежания конфликтов с протоколом Animatable
  • Убран конформанс UIControl.State: Hashable т.к. вызывал проблемы линковки при дублировании реализации в проекте и/или других библиотеках

UIViewBackground

Для задания фона UIView можно использовать реализации протокола UIViewBackground:

UIViewColorBackground - сплошной фон одного цвета

import TIUIElements
import UIKit

let viewFrame = CGRect(origin: .zero,
                       size: CGSize(width: 164, height: 192))

let solidFillBackground = UIViewColorBackground(color: .green)

let genericView = UIView(frame: viewFrame)

solidFillBackground.apply(to: genericView)

Nef.Playground.liveView(genericView)

UIViewGradientBackground - градиентный фон

Для задания градиентного фона необходимо определить GradientValues и применить фон в UIView:

let gradientView = UIView(frame: viewFrame)

let gradientColorStart = UIColor(red: 0.8, green: 0.74, blue: 1, alpha: 1).cgColor
let gradientColorEnd = UIColor(red: 1, green: 0.82, blue: 0.84, alpha: 1).cgColor

let centerPoint = CGPoint(x: 0.98, y: 0.95)
let outerPoint = CGPoint(x: 0.02, y: .zero)

let gradientValues: GradientValues = .elliptical(stops: [
    (gradientColorStart, 0),
    (gradientColorEnd, 1)
],
                                                              center: centerPoint,
                                                              outerEdge: outerPoint)

let gradientBackground = UIViewGradientBackground(values: gradientValues)

gradientBackground.apply(to: gradientView)
gradientView.layer.round(corners: .allCorners, radius: 20)

Nef.Playground.liveView(gradientView)

Использование внутри кастомной view

Также возможно использование градиентного фона внутри кастомной view с более точным контролем над обновлением состояния

final class GradientView: BaseInitializableView {
    var gradientBackground = UIViewGradientBackground(observeViewBoundsChange: false) {
        willSet {
            gradientBackground.remove(from: self)
        }

        didSet {
            gradientBackground.gradientValues = gradientValues
        }
    }

    var gradientValues: GradientValues = GradientValues() {
        didSet {
            gradientBackground.gradientValues = gradientValues
        }
    }

    override func configureAppearance() {
        super.configureAppearance()

        gradientBackground.apply(to: self)
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        gradientBackground.updateGradientLayer(bounds: bounds, in: self)
    }
}

let customGradientView = GradientView(frame: viewFrame)
customGradientView.gradientValues = gradientValues
customGradientView.layer.round(corners: .allCorners, radius: 20)

Nef.Playground.liveView(customGradientView)
TL;DR - Добавлена возможность кастомизации фона UIView. На текущий момент реализовано два фона: сплошной цвет и градиентный слой - Добавлен SingleValueStorage для работы с Codable значениями в keychain - Переименованы методы `startAnimation` и `stopAnimation` у `SkeletonPresenter`, для избежания конфликтов с протоколом `Animatable` - Убран конформанс UIControl.State: Hashable т.к. вызывал проблемы линковки при дублировании реализации в проекте и/или других библиотеках # UIViewBackground Для задания фона UIView можно использовать реализации протокола UIViewBackground: ## UIViewColorBackground - сплошной фон одного цвета ```swift import TIUIElements import UIKit let viewFrame = CGRect(origin: .zero, size: CGSize(width: 164, height: 192)) let solidFillBackground = UIViewColorBackground(color: .green) let genericView = UIView(frame: viewFrame) solidFillBackground.apply(to: genericView) Nef.Playground.liveView(genericView) ``` ## UIViewGradientBackground - градиентный фон Для задания градиентного фона необходимо определить GradientValues и применить фон в UIView: ```swift let gradientView = UIView(frame: viewFrame) let gradientColorStart = UIColor(red: 0.8, green: 0.74, blue: 1, alpha: 1).cgColor let gradientColorEnd = UIColor(red: 1, green: 0.82, blue: 0.84, alpha: 1).cgColor let centerPoint = CGPoint(x: 0.98, y: 0.95) let outerPoint = CGPoint(x: 0.02, y: .zero) let gradientValues: GradientValues = .elliptical(stops: [ (gradientColorStart, 0), (gradientColorEnd, 1) ], center: centerPoint, outerEdge: outerPoint) let gradientBackground = UIViewGradientBackground(values: gradientValues) gradientBackground.apply(to: gradientView) gradientView.layer.round(corners: .allCorners, radius: 20) Nef.Playground.liveView(gradientView) ``` ### Использование внутри кастомной view Также возможно использование градиентного фона внутри кастомной view с более точным контролем над обновлением состояния ```swift final class GradientView: BaseInitializableView { var gradientBackground = UIViewGradientBackground(observeViewBoundsChange: false) { willSet { gradientBackground.remove(from: self) } didSet { gradientBackground.gradientValues = gradientValues } } var gradientValues: GradientValues = GradientValues() { didSet { gradientBackground.gradientValues = gradientValues } } override func configureAppearance() { super.configureAppearance() gradientBackground.apply(to: self) } override func layoutSubviews() { super.layoutSubviews() gradientBackground.updateGradientLayer(bounds: bounds, in: self) } } let customGradientView = GradientView(frame: viewFrame) customGradientView.gradientValues = gradientValues customGradientView.layer.round(corners: .allCorners, radius: 20) Nef.Playground.liveView(customGradientView) ```
ivan.smolin added 2 commits 2023-10-09 23:30:55 +03:00
2bf1fc052a feat: Custom string attributes to `BaseTextAttributes`
- Customizeable `UIViewBackground` and `UIViewBorder` for `UIView.Appearance`
- Keychain single value storage for codable models -`CodableSingleValueKeychainStorage`
- Renamed methods `startAnimation` and `stopAnimation` of `SkeletonPresenter`, so it won't conflict with `Animatable` protocol anymore
dmitriy.dudkin approved these changes 2023-10-09 23:51:22 +03:00
ivan.smolin merged commit 767c19d17b into master 2023-10-09 23:52:10 +03:00
ivan.smolin deleted branch feature/uiviewbackground 2023-10-09 23:52:11 +03:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: TouchInstinct/LeadKit#15
No description provided.