🚴 A declarative library for building component-based user interfaces in UITableView and UICollectionView.
struct HelloMessage: Component, View {
...
}
struct ContentView: View {
var body: some View {
ScrollView {
VStack {
Text("GREET")
.font(.title)
.padding(.horizontal, 16)
HelloMessage("World")
.frame(height: 60)
.background(Color.red)
}
}
}
}
Component.intrinsicContentSize(for:)
to get intrinsic content size for content to infer size of the UIView in SwiftUI (#58)This version Carbon supports both Swift 5.0 and Swift 5.1.
Adapter.alwaysRenderVisibleComponents
true by default. (#37)Component.shouldContentUpdate
returns false by default. (#37)Adapter
in UITableViewUpdater
is now changed to UITableViewAdapter
. (#37)- class CustomUpdater<A: Adapter & UITableViewDataSource & UITableViewDelegate>: UITableViewUpdater<A> {...}
+ class CustomUpdater<A: UITableViewAdapter>: UITableViewUpdater<A> {...}
Adapter
in UICollectionViewUpdater
is now changed to UICollectionViewAdapter
. (#37)- class CustomUpdater<A: Adapter & UICollectionViewDataSource & UICollectionViewDelegate>: UICollectionViewUpdater<A> {...}
+ class CustomUpdater<A: UITableViewAdapter>: UITableViewUpdater<A> {...}
Adapter.skipReloadComponents
is now obsolete. (#37)referenceSize(in bounds:)
returns nil
by default. (#38)UITableViewUpdater/UICollectionViewUpdater
. (#40)
You can now intercepts arbitrary processes before or after updates, for example:- override func performDifferentialUpdates(target: UITableView, adapter: A, data: [Section], stagedChangeset: StagedDataChangeset, completion: (() -> Void)?) {
}
+ super.performDifferentialUpdates(target: target, adapter: adapter, stagedChangeset: stagedDataChangeset)
open func performDifferentialUpdates(target: UITableView, adapter: Adapter, stagedChangeset: StagedDataChangeset) {
super.performDifferentialUpdates(target: target, adapter: adapter, stagedChangeset: stagedDataChangeset)
if stagedChangeset.allSatisfy({ $0.hasChanges }) {
let y = target.contentSize.height - (target.bounds.height - target.adjustedContentInset.bottom)
let contentOffset = CGPoint(x: target.contentOffset.x, y: y)
setContentOffset(contentOffset, animated: true)
}
}
completion
from Renderer
. (#40)- renderer.completion {
- // do something
- }
+ renderer.updater.completion {
+ // do something
+ }
UITableViewReloadDataUpdater/UICollectionReloadDataViewUpdater
to UITableViewAdapter/UICollectionViewAdapter
. (#40)UICollectionViewUpdater. renderVisibleComponents
supports custom supplementary elements. (#37)completion
to UITableViewUpdater/UICollectionViewUpdater
. (#40)This version Carbon supports both Swift 5.0 and Swift 5.1.
Section
(#28)Renderer
(#28)UITableViewCellContent
, UITableViewHeaderFooterViewContent
, UICollectionViewCellContent
and UICollectionReusableViewContent
(#21)UITableViewAdapter.Config
and UICollectionViewAdapter.Config
(#21)This version Carbon supports both Swift 4.2 and Swift 5.
isAnimationEnabledWhileScrolling
option for disable animation while scrolling (#17)Renderer
without passing the target instance (#18)let renderer = Renderer(
adapter: UITableViewAdapter(),
updater: UITableViewUpdater()
)
renderer.target = tableView
Renderer.init(target:adapter:updater:)
is now deprecated. Use Renderer.init(adapter:updater:)
instead (#18)