下面是一个列表单元格cell的折叠展开效果的demo。当点击单元格时会展开该单元格,便于显示一些详情什么的。点击其他单元格原来的会关闭,同时有动画效果。
效果如如下:
![](http://www.hangge.com/blog_uploads/201506/2015060509531275601.png)
![](http://www.hangge.com/blog_uploads/201506/2015060509532196170.png)
代码如下:
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
import
UIKit
class
ViewController
:
UIViewController
,
UITableViewDelegate
,
UITableViewDataSource
{
var
tableView:
UITableView
?
var
ctrlnames:[
String
] = [
"UILabel 标签"
,
"UIButton 按钮"
,
"UIDatePiker 日期选择器"
,
"UITableView 表格视图"
]
var
selectedCellIndexPath:
NSIndexPath
!
override
func
viewDidLoad() {
super
.viewDidLoad()
//创建表视图
self
.tableView =
UITableView
(frame:
UIScreen
.mainScreen().applicationFrame,
style:
UITableViewStyle
.
Plain
)
self
.tableView!.delegate =
self
self
.tableView!.dataSource =
self
//创建一个重用的单元格
self
.tableView!.registerClass(
UITableViewCell
.
self
, forCellReuseIdentifier:
"SwiftCell"
)
self
.view.addSubview(
self
.tableView!)
}
//在本例中,只有一个分区
func
numberOfSectionsInTableView(tableView:
UITableView
!) ->
Int
{
return
1;
}
//返回表格行数(也就是返回控件数)
func
tableView(tableView:
UITableView
, numberOfRowsInSection section:
Int
) ->
Int
{
return
self
.ctrlnames.count
}
//创建各单元显示内容(创建参数indexPath指定的单元)
func
tableView(tableView:
UITableView
, cellForRowAtIndexPath indexPath:
NSIndexPath
)
->
UITableViewCell
{
var
label =
UILabel
(frame:
CGRectZero
)
label.setTranslatesAutoresizingMaskIntoConstraints(
false
)
label.text =
self
.ctrlnames[indexPath.row]
var
textview=
UITextView
(frame:
CGRectZero
)
textview.setTranslatesAutoresizingMaskIntoConstraints(
false
)
textview.textColor =
UIColor
.grayColor()
//演示效果,暂时写死
textview.text =
"UIDatePicker 是一个控制器类,封装了 UIPickerView,但是他是UIControl的子类,"
let
identify:
String
=
"SwiftCell"
var
cell =
UITableViewCell
(style:
UITableViewCellStyle
.
Default
, reuseIdentifier:identify)
//自动遮罩不可见区域,超出的不显示
cell.layer.masksToBounds =
true
cell.contentView.addSubview(label)
cell.contentView.addSubview(textview)
//创建一个控件数组
var
views:
NSMutableDictionary
=
NSMutableDictionary
()
views.setValue(label, forKey:
"label"
)
views.setValue(textview, forKey:
"textview"
)
cell.contentView.addConstraints(
NSLayoutConstraint
.constraintsWithVisualFormat(
"H:|-15-[label]-15-|"
, options:
nil
, metrics:
nil
, views: views))
cell.contentView.addConstraints(
NSLayoutConstraint
.constraintsWithVisualFormat(
"H:|-15-[textview]-15-|"
, options:
nil
, metrics:
nil
, views: views))
cell.contentView.addConstraints(
NSLayoutConstraint
.constraintsWithVisualFormat(
"V:|[label(40)]"
, options:
nil
, metrics:
nil
, views: views))
cell.contentView.addConstraints(
NSLayoutConstraint
.constraintsWithVisualFormat(
"V:|-40-[textview(80)]"
, options:
nil
, metrics:
nil
, views: views))
return
cell
}
// UITableViewDelegate 方法,处理列表项的选中事件
func
tableView(tableView:
UITableView
!, didSelectRowAtIndexPath indexPath:
NSIndexPath
!)
{
self
.tableView!.deselectRowAtIndexPath(indexPath, animated:
false
)
selectedCellIndexPath = indexPath
// Forces the table view to call heightForRowAtIndexPath
tableView!.reloadRowsAtIndexPaths([indexPath],
withRowAnimation:
UITableViewRowAnimation
.
Automatic
)
}
//点击单元格会引起cell高度的变化,所以要重新设置
func
tableView(tableView:
UITableView
,
heightForRowAtIndexPath indexPath:
NSIndexPath
) ->
CGFloat
{
if
(selectedCellIndexPath !=
nil
&& selectedCellIndexPath == indexPath){
return
120
}
return
40
}
}
|