Swift - 实现点击UITableView单元格时自动展开单元格
下面是一个列表单元格cell的折叠展开效果的demo。当点击单元格时会展开该单元格,便于显示一些详情什么的。点击其他单元格原来的会关闭,同时有动画效果。
效果如如下:
代码如下:
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 } } |