SKObservableUIKit 0.0.3

SKObservableUIKit 0.0.3

sakiyamaK维护。



  • Kei Sakiyama

ObservableUIKit

Swift Platforms Swift Package Manager Twitter

这是一个希望使 UIKit 参数能与 Observation 框架对应起来的库

支持 Observation 框架的 UIKit 参数的库。

import UIKit
import ObservableUIKit

@Observable
class TestData {
    var color: UIColor = .green
    var rotate: CGFloat = 0
    var cornerRadius: CGFloat = 0
    
    var title: String?
}

class ViewController: UIViewController {
    
    let testData = TestData()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        layout()
        track()
        update()
    }

    func layout() {
        let testView = UIView(frame: .zero)
        
        self.view.addSubview(testView)
        
        testView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            testView.widthAnchor.constraint(equalToConstant: 100),
            testView.heightAnchor.constraint(equalToConstant: 100),
            testView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            testView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor)
        ])

        let testLabel = UILabel(frame: .zero)
        
        self.view.addSubview(testLabel)
        
        testLabel.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            testLabel.heightAnchor.constraint(equalToConstant: 100),
            testLabel.centerXAnchor.constraint(equalTo: testView.centerXAnchor),
            testLabel.topAnchor.constraint(equalTo: testView.bottomAnchor, constant: 20)
        ])
    }
    
    func track() {
        
        let testView: UIView = self.view.subviews.first!
        let testLabel: UILabel = self.view.subviews.first(where: { $0 is UILabel}) as! UILabel

        // UIViewの各パラメータを監視
        testView.observation(keyPath: \.backgroundColor) { [weak self] in
            self?.testData.color
        }.observation(keyPath: \.layer.cornerRadius) { [weak self] in
            self?.testData.cornerRadius ?? 0
        }.observation(keyPath: \.transform) { [weak self] in
            let angle = self?.testData.rotate ?? 0
            return .init(rotationAngle: angle)
        }
        
        // UILabelの各パラメータを監視
        testLabel.observation(keyPath: \.text) { [weak self] in
            self?.testData.title ?? "default"
        }.observation(keyPath: \.textColor) { [weak self] in
            self?.testData.color
        }
    }
    
    // 監視対象のデータを更新
    func update() {
        Task {
            try await Task.sleep(for: .seconds(1.0))
            testData.color = .red
            testData.title = "change 1"

            try await Task.sleep(for: .seconds(1.0))
            testData.color = .blue
            testData.rotate = 10.0 * 180.0 / Double.pi
            testData.cornerRadius = 20
            testData.title = "change 2"
            
            try await Task.sleep(for: .seconds(1.0))
            testData.color = .black
            testData.rotate = 20.0 * 180.0 / Double.pi
            testData.cornerRadius = 30
            testData.title = "change 3"

            try await Task.sleep(for: .seconds(1.0))
            testData.color = .red
            testData.cornerRadius = 50
            testData.title = "change 4"

        }

    }
}

安装

Swift 包管理器

一旦您已经设置了 Swift 包,将 ObservableUIKit 添加为依赖项就像将其添加到 Package.swift 的 dependencies 值一样简单。

dependencies: [
    .package(url: "https://github.com/sakiyamaK/ObservableUIKit", .upToNextMajor(from: "0.2"))
]

要通过 Xcode 安装 ObservableUIKit 包

转到文件 -> Swift Packages -> 添加包依赖... 然后搜索 https://github.com/sakiyamaK/ObservableUIKit 并选择您想要的版本

CocoaPods

CocoaPods 是一个针对 Cocoa 项目的依赖项管理器。有关使用和安装说明,请访问他们的网站。要使用 CocoaPods 将 ObservableUIKit 集成到您的 Xcode 项目中,请将其指定在您的 Podfile

pod 'ObservableUIKit'