下面是一个列表单元格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 } } |