还在手动计算UITableViewCell
的行高吗?还在每次都因为需求变化一点就要大量调整cell
的高度而烦恼吗?现在教大家如何通过Masonry
的自动布局来实现自动计算cell
的行高!!!
在github
没有找到基于Masonry
自动计算行高的库,倒是找到了使用xib/storyboard
在添加约束来自动计算行高的库,如: UITableView-FDTemplateLayoutCell
本人非常推崇Masonry
来实现代码的自动布局,因此项目中都是使用Masonry
布局的,为了自动计算行高,决定写一个扩展,以达到自动计算的效果,如此一来,开发者不用再关心那些非固定行高的cell
的动态计算问题了。
要想自动计算出cell
的行高,我们还需要指定以哪个视图作为cell
的最后一个视图,比如我们最后要添加一条线,我们可以以这条线作为hyb_lastViewInCell
,如果这条线还需要距离底部一定距离,那么可以设置hyb_bottomOffsetToCell
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/**
* 必传设置的属性,也就是在cell中的contentView内最后一个视图,用于计算行高
* 例如,创建了一个按钮button作为在cell中放到最后一个位置,则设置为:self.hyb_lastVieInCell = button;
* 即可。
* 默认为nil,如果在计算时,值为nil,会crash
*/
@property
(
nonatomic
,
strong
)
UIView
*hyb_lastViewInCell
;
/**
* 可选设置的属性,默认为0,表示指定的hyb_lastViewInCell到cell的bottom的距离
* 默认为0.0
*/
@property
(
nonatomic
,
assign
)
CGFloat
hyb_bottomOffsetToCell
;
|
要计算行高,只需要在UITableView
的计算行高的代理方法中调用此API即可:
1
2
3
4
5
6
7
8
9
10
11
|
/**
* 通过此方法来计算行高,需要在config中调用配置数据的API
*
* @param indexPath 必传,对应的indexPath
* @param confi 必须要实现,且需要调用配置数据的API
*
* @return 计算的行高
*/
+
(
CGFloat
)
hyb_heightForIndexPath
:
(
NSIndexPath
*
)
indexPath
config
:
(
HYBCellBlock
)
config
;
|
在调用时,config
传回来了cell
对象,需要在调用处调用方法来配置好数据,才能正确地计算出cell
的行高。通常是这样调用的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-
(
CGFloat
)
tableView
:
(
nonnull
UITableView
*
)
tableView
heightForRowAtIndexPath
:
(
nonnull
NSIndexPath
*
)
indexPath
{
HYBNewsModel
*model
=
nil
;
if
(
indexPath
.
row
<
self
.
dataSource
.
count
)
{
model
=
[
self
.
dataSource
objectAtIndex
:indexPath
.
row
]
;
}
return
[
HYBNewsCell
hyb_heightForIndexPath
:indexPath
config
:
^
(
UITableViewCell
*sourceCell
)
{
HYBNewsCell
*cell
=
(
HYBNewsCell
*
)
sourceCell
;
// 配置数据
[
cell
configCellWithModel
:model
]
;
}
]
;
}
|
效果图如下:
我们看下实现-initWithStyle: reuseIdentifier:
方法,因为我们要自动计算cell
行高会自动调用此方法,因此一定要实现此方法来布局:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
-
(
nonnull
instancetype
)
initWithStyle
:
(
UITableViewCellStyle
)
style
reuseIdentifier
:
(
nullable
NSString
*
)
reuseIdentifier
{
if
(
self
=
[
super
initWithStyle
:style
reuseIdentifier
:reuseIdentifier
]
)
{
self
.
mainLabel
=
[
[
UILabel
alloc
]
init
]
;
[
self
.
contentView
addSubview
:self
.
mainLabel
]
;
self
.
mainLabel
.
numberOfLines
=
0
;
[
self
.
mainLabel
sizeToFit
]
;
[
self
.
mainLabel
mas_makeConstraints
:
^
(
MASConstraintMaker
*make
)
{
make
.
left
.
mas_equalTo
(
15
)
;
make
.
top
.
mas_equalTo
(
20
)
;
make
.
right
.
mas_equalTo
(
-
15
)
;
make
.
height
.
mas_lessThanOrEqualTo
(
80
)
;
}
]
;
// 如果需要支持6.0,需要加上这句
// self.mainLabel.preferredMaxLayoutWidth = ...
self
.
descLabel
=
[
[
UILabel
alloc
]
init
]
;
[
self
.
contentView
addSubview
:self
.
descLabel
]
;
self
.
descLabel
.
numberOfLines
=
0
;
[
self
.
descLabel
sizeToFit
]
;
[
self
.
descLabel
mas_makeConstraints
:
^
(
MASConstraintMaker
*make
)
{
make
.
left
.
mas_equalTo
(
15
)
;
make
.
right
.
mas_equalTo
(
-
15
)
;
make
.
top
.
mas_equalTo
(
self
.
mainLabel
.
mas_bottom
)
.
offset
(
15
)
;
}
]
;
// 如果需要支持6.0,需要加上这句
// self.mainLabel.preferredMaxLayoutWidth = ...
self
.
button
=
[
UIButton
buttonWithType
:UIButtonTypeSystem
]
;
[
self
.
contentView
addSubview
:self
.
button
]
;
[
self
.
button
sizeToFit
]
;
[
self
.
button
setTitle
:
@"我是cell的最后一个"
forState
:UIControlStateNormal
]
;
[
self
.
button
setBackgroundColor
:
[
UIColor
greenColor
]
]
;
[
self
.
button
mas_makeConstraints
:
^
(
MASConstraintMaker
*make
)
{
make
.
left
.
mas_equalTo
(
15
)
;
make
.
right
.
mas_equalTo
(
-
15
)
;
make
.
height
.
mas_equalTo
(
45
)
;
make
.
top
.
mas_equalTo
(
self
.
descLabel
.
mas_bottom
)
.
offset
(
40
)
;
}
]
;
// 必须加上这句
self
.
hyb_lastViewInCell
=
self
.
button
;
self
.
hyb_bottomOffsetToCell
=
20
;
}
return
self
;
}
|
注意到这两行代码了吗:
1
2
3
4
|
self
.
hyb_lastViewInCell
=
self
.
button
;
self
.
hyb_bottomOffsetToCell
=
20
;
|
先是设置哪个视图作为cell
的最后一个视图,然后设置了最后一个参考视图与cell
的底部的距离。其中,self.hyb_lastViewInCell
属性是必须要设置的,否则会抛出异常。
这个组件是开源的,而且是支持cocoapods
的,因此大家若是使用了cocoapods
来管理项目第三方库,可以这样使用:
1
2
3
|
pod
'HYBMasonryAutoCellHeight'
,
'~> 0.0.1'
|
如果项目未使用cocoapods
,直接下载源代码,然后将HYBMasonryAutoCellHeight
文件夹拖入工程即可使用!
大家可以到github
下载源代码来看看,内部实现很简单,当然要实现自动计算行高也是有系统方法的,不一定需要像笔者这样来实现。
下载源代码:https://github.com/CoderJackyHuang/HYBMasonryAutoCellHeight
如果在使用过程中遇到问题,或者想要与我交流,可加入有问必答QQ群:324400294
关注微信公众号:iOSDevShares
关注新浪微博账号:标哥Jacky