基于 Yoga
引擎二次开发的给 iOS
用的盒子布局~
-
虚拟视图
-
链式调用
-
异步计算
-
自动更新布局
-
支持
UIScrollView
布局 -
UITableViewCell
、UICollectionViewCell
高度自动计算
PS:开启自动更新布局后,在布局发生改变需要更新时需要手动调用
markDirty
,gone
不需要调用markDirty
,它内部会自己处理
pod 'ZDFlexLayoutKit'
从
0.1.2
开始支持Swift
支持编译为静态库,但如果想使用
Literal
字面量特性,需要把这个repo
编译为framework
的形式,比如在podfile
中开启use_framework!
或者其他方式让它以framework
的形式存在如果它被编译为了动态库,其依赖的
yoga
也需要以动态库的形式集成,即动态库不能依赖静态库
默认使用的是ZDYoga,如果想使用官方Yoga
,可以在Podfile
中添加设置:
ENV['Yoga'] = 'true'
pod 'Yoga', :podspec => './Yoga.podspec'
Swift
avatarImgView.zd.makeFlexLayout {
$0.position(.absolute)
$0.width(100%).height(100%)
}
gradientView.zd.makeFlexLayout {
$0.position(.relative).flexDirection(.column)
$0.paddingHorizontal(8)
$0.width(100%)
}
titleLabel.zd.makeFlexLayout { (make) in
make.marginTop(3.5)
make.width(100%)
make.flexShrink(1)
}
// 虚拟视图
let userInfoDiv = ZDFlexLayoutDiv.zd.makeFlexLayout { (make) in
make.flexDirection(.row)
make.alignItems(.center)
make.marginTop(2.5)
make.marginBottom(6)
}
// 这里需要调用 `addChildren` 函数,因为我们重新构建了视图树
gradientView.addChildren([titleLabel, avatarImgView])
userInfoDiv.addChildren([gradientView])
// 计算布局,以下2种方式皆可,第二种会当你标记为mark之后会在runloop空闲时自动计算布局
//userInfoDiv.calculateLayoutPreservingOrigin(true, dimensionFlexibility: .flexibleHeight)
userInfoDiv.calculateLayout(withAutoRefresh: true, preservingOrigin: false, dimensionFlexibility: .flexibleHeight)
Objective-C
[self zd_makeFlexLayout:^(ZDFlexLayoutMaker * _Nonnull make) {
make.flexDirection(YGFlexDirectionColumn).flexWrap(YGWrapWrap).alignContent(YGAlignCenter);
}];
[self.iconimageV zd_makeFlexLayout:^(ZDFlexLayoutMaker * _Nonnull make) {
// 属性设置支持链式调用
make.marginLeft(YGPointValue(10)).marginTop(YGPointValue(6)).marginBottom(YGPointValue(6)).width(YGPointValue(20)).height(YGPointValue(20));
}];
[self.contentLabel zd_makeFlexLayout:^(ZDFlexLayoutMaker * _Nonnull make) {
make.marginLeft(YGPointValue(5)).marginRight(YGPointValue(10));
}];
[self calculateLayoutWithAutoRefresh:YES preservingOrigin:YES dimensionFlexibility:ZDDimensionFlexibilityFlexibleHeight];
pre_install do |installer|
dynamic_framework = ['ZDFlexLayoutKit','Yoga']
Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {}
installer.pod_targets.each do |pod|
if dynamic_framework.include?(pod.name)
def pod.build_type;
Pod::BuildType.dynamic_framework
end
end
end
end