测试已测试 | ✗ |
Lang语言 | Obj-CObjective C |
许可证 | 自定义 |
发布最后发布 | 2014年12月 |
由未认领维护。
依赖项 | |
JRSwizzle | ~> 1.0 |
ViewUtils | ~> 1.1 |
首先布局子视图,然后是其容器。不在 AutoLayout 下使用,支持 iOS5 及以上。
(在 #objectivechackathon 中开发 把 Objective C 拿回地图)
YIVariableViewSize
实际上是一个以 ObjC 协议风格编写的抽象概念。因此,你的任务是使你的 UIView 子类符合 <YIVariableViewSize>
协议,并实现其类似以下的方法
- (CGSize)sizeThatFits:(CGSize)size
{
[self resizeSubviewsWithFittingSize:size];
[self positionSubviews];
size.height = self.mostBottomVisibleSubview.bottom + self.paddingBottomForVariableViewSize;
return size;
}
- (void)layoutSubviews
{
[super layoutSubviews];
[self positionSubviews]; // don't resize, just set origin
}
// change subview's frame.size & drawing contents
- (void)resizeSubviewsWithFittingSize:(CGSize)fittingSize
{
[self.subview1 sizeToFitWithMaxSize:fittingSize];
[self.subview2 sizeToFitWithMaxSize:fittingSize];
}
// change subview's frame.origin
- (void)positionSubviews
{
self.subview2.top = self.subview1.bottom;
}
- (CGFloat)paddingBottomForVariableViewSize
{
return 10;
}
请注意,-sizeThatFits:
实际上计算子视图的大小、位置,最后是 paddingBottom(Right),而 -layoutSubviews
则仅处理位置。通过这样做,我们可以将调整大小和定位代码分开,并且永远不要在 -layoutSubviews
中尝试调整子视图内容,这是性能关键。
到目前为止一切都很顺利。但如果你在 AppDelegate 中调用 [YIVariableViewSize install]
,甚至可以省略编写 -sizeThatFits:
和 -layoutSubviews
。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[YIVariableViewSize install];
return YES;
}
YIVariableViewSize
在 Beerware 许可下可用。
如果我们有一天相遇,你觉得这个玩意儿值得,你可以请我喝一杯。