ObservableUIKit 0.0.3

ObservableUIKit 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包

转到File -> Swift Packages -> Add Package Dependency... 然后,找到 https://github.com/sakiyamaK/ObservableUIKit 并选择您想要的版本。

CocoaPods

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

pod 'ObservableUIKit'