首先以 "微信" 应用我的界面为例, 怎么让快速的实现如下的界面呢?
可以先猜一下,我会给出什么样的简化方案.
好了, 废话不多话, 步骤也省了. 直接上结果: StaticTableViewAdapter
UITableViewCell
的容器.public protocol StaticHeightAware{
var staticHeight: CGFloat{ get }
}
public class StaticTableViewAdapter: NSObject, UITableViewDataSource, UITableViewDelegate{
public private(set) var cells:[UITableViewCell] = []
private weak var tableView: UITableView?
public var didTapCell: ((UITableViewCell) -> Void)?
init(cells: [UITableViewCell]){
self.cells = cells
}
public func bind(to tableView: UITableView){
self.tableView = tableView
tableView.dataSource = self
tableView.delegate = self
}
public func staticCell(atIndexPath indexPath: IndexPath) -> UITableViewCell{
return cells[indexPath.row]
}
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cells.count
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return cells[indexPath.row]
}
// MARK: UITableViewDelegate
public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let cell = staticCell(atIndexPath: indexPath)
if let heightAware = cell as? StaticHeightAware{
return heightAware.staticHeight
}
return tableView.rowHeight
}
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
didTapCell?(staticCell(atIndexPath: indexPath))
tableView.deselectRow(at: indexPath, animated: true)
}
}
EmptyCell
来实现.作为空白的 Hack. 可以指定高度.public class EmptyCell: UITableViewCell, StaticHeightAware{
public var staticHeight: CGFloat = 15
public init(height: CGFloat = 15){
super.init(style: .default, reuseIdentifier: "emptyCell")
staticHeight = height
contentView.backgroundColor = UIColor(white: 0.932, alpha: 1.0)
}
required public init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
func makeEntryCell(title:String) -> UITableViewCell{
let cell = UITableViewCell(style: .default, reuseIdentifier: "entryCell")
cell.textLabel?.text = title
return cell
}
let albumCell = makeEntryCell(title: "相册")
let favoriteCell = makeEntryCell(title: "收藏")
let walletCell = makeEntryCell(title: "钱包")
let cardCell = makeEntryCell(title: "卡包")
let emotionCell = makeEntryCell(title: "表情")
let settingsCell = makeEntryCell(title: "设置")
let adapter = StaticTableViewAdapter(cells: [
albumCell, favoriteCell, EmptyCell(), walletCell, cardCell, EmptyCell(), emotionCell, EmptyCell(),settingsCell
])
let tableView = UITableView(frame: CGRect(x:0,y:0,width:320,height:480), style: .plain)
tableView.backgroundColor = UIColor(white: 0.932, alpha: 1.0)
tableView.tableFooterView = UIView()
adapter.bind(to: tableView)
adapter.didTapCell = { cell in
switch cell {
case albumCell:
NSLog("Did Tap Cell albumCell")
default:
break
}
}
最后,我这只是抛砖引玉, 各位可以根据自己的需要再进一步扩展. 有什么不足,敬请指正. 实例截图:
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.