From 6ee01134ff671487e7e9619287c6d0ca6ce1c2e9 Mon Sep 17 00:00:00 2001 From: Max Sokolov Date: Sat, 14 Nov 2015 17:49:30 +0300 Subject: [PATCH] estimatedRowHeight --- Tablet/TableDirector.swift | 28 ++++++++++----- Tablet/TableRowBuilder.swift | 29 ++++++++------- Tablet/Tablet.swift | 5 +-- .../TabletDemo.xcodeproj/project.pbxproj | 4 +++ .../UserInterfaceState.xcuserstate | Bin 20028 -> 24923 bytes .../TabletDemo/Base.lproj/Main.storyboard | 31 ++++++++++++---- .../ConfigurableTableViewCell.swift | 1 + .../TabletDemo/CustomTableActions.swift | 10 ++++++ TabletDemo/TabletDemo/ViewController.swift | 34 +++++++++++------- 9 files changed, 101 insertions(+), 41 deletions(-) create mode 100644 TabletDemo/TabletDemo/CustomTableActions.swift diff --git a/Tablet/TableDirector.swift b/Tablet/TableDirector.swift index 2e8ed72..8f2f74e 100644 --- a/Tablet/TableDirector.swift +++ b/Tablet/TableDirector.swift @@ -35,7 +35,7 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate self.tableView = tableView self.tableView.delegate = self self.tableView.dataSource = self - + NSNotificationCenter.defaultCenter().addObserver(self, selector: "didReceiveAction:", name: kActionPerformedNotificationKey, object: nil) } @@ -43,8 +43,8 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate NSNotificationCenter.defaultCenter().removeObserver(self) } - - // MARK: Public methods + + // MARK: Sections manipulation public func appendSection(section: TableSectionBuilder) { sections.append(section) @@ -69,7 +69,7 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate return sections[indexPath.section].builderAtIndex(indexPath.row)! } - private func triggerAction(action: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath) -> AnyObject? { + public func triggerAction(action: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath) -> AnyObject? { let builder = builderAtIndexPath(indexPath) return builder.0.triggerAction(action, cell: cell, indexPath: indexPath, itemIndex: builder.1) @@ -103,10 +103,13 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate let cell = tableView.dequeueReusableCellWithIdentifier(builder.0.reusableIdentifier, forIndexPath: indexPath) builder.0.triggerAction(.configure, cell: cell, indexPath: indexPath, itemIndex: builder.1) - + return cell } - +} + +extension TableDirector { + // MARK: UITableViewDataSource - section setup public func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { @@ -140,11 +143,14 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate return sections[section].footerHeight } +} + +extension TableDirector { // MARK: UITableViewDelegate - actions public func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { - + let cell = tableView.cellForRowAtIndexPath(indexPath) if triggerAction(.click, cell: cell, indexPath: indexPath) != nil { @@ -169,8 +175,14 @@ public class TableDirector: NSObject, UITableViewDataSource, UITableViewDelegate return triggerAction(.shouldHighlight, cell: tableView.cellForRowAtIndexPath(indexPath), indexPath: indexPath) as? Bool ?? true } + public func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + + return 300 + } + public func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { - return triggerAction(.height, cell: nil, indexPath: indexPath) as? CGFloat ?? tableView.rowHeight + print(indexPath) + return triggerAction(.height, cell: nil, indexPath: indexPath) as? CGFloat ?? UITableViewAutomaticDimension } } \ No newline at end of file diff --git a/Tablet/TableRowBuilder.swift b/Tablet/TableRowBuilder.swift index a7f2044..c3cf2fd 100644 --- a/Tablet/TableRowBuilder.swift +++ b/Tablet/TableRowBuilder.swift @@ -21,12 +21,14 @@ import UIKit import Foundation +public typealias ReturnValue = AnyObject? + internal enum ActionHandler { case actionBlock((data: ActionData) -> Void) - case actionReturnBlock((data: ActionData) -> AnyObject) + case actionReturnBlock((data: ActionData) -> AnyObject?) - func call(data: ActionData) -> AnyObject { + func call(data: ActionData) -> AnyObject? { switch (self) { case .actionBlock(let closure): @@ -45,23 +47,26 @@ public class TableRowBuilder : RowBuilder { private var actions = Dictionary>() private var items = [I]() - + public var reusableIdentifier: String + public var estimatedRowHeight: Float public var numberOfRows: Int { get { return items.count } } - public init(item: I, id: String) { + public init(item: I, id: String, estimatedRowHeight: Float = 0) { reusableIdentifier = id + self.estimatedRowHeight = estimatedRowHeight items.append(item) } - public init(items: [I]? = nil, id: String) { - + public init(items: [I]? = nil, id: String, estimatedRowHeight: Float = 0) { + reusableIdentifier = id + self.estimatedRowHeight = estimatedRowHeight if items != nil { self.items.appendContentsOf(items!) @@ -94,7 +99,7 @@ public class TableRowBuilder : RowBuilder { return self } - public func action(actionType: ActionType, closure: (data: ActionData) -> AnyObject) -> Self { + public func action(actionType: ActionType, closure: (data: ActionData) -> ReturnValue) -> Self { actions[actionType.key] = .actionReturnBlock(closure) return self @@ -116,12 +121,12 @@ public class TableRowBuilder : RowBuilder { */ public class TableConfigurableRowBuilder : TableRowBuilder { - public init(item: I) { - super.init(item: item, id: C.reusableIdentifier()) + public init(item: I, estimatedRowHeight: Float = 0) { + super.init(item: item, id: C.reusableIdentifier(), estimatedRowHeight: estimatedRowHeight) } - - public init(items: [I]? = nil) { - super.init(items: items, id: C.reusableIdentifier()) + + public init(items: [I]? = nil, estimatedRowHeight: Float = 0) { + super.init(items: items, id: C.reusableIdentifier(), estimatedRowHeight: estimatedRowHeight) } public override func triggerAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? { diff --git a/Tablet/Tablet.swift b/Tablet/Tablet.swift index 5c6f0ee..64cfafa 100644 --- a/Tablet/Tablet.swift +++ b/Tablet/Tablet.swift @@ -40,8 +40,8 @@ public enum ActionType { var key: String { switch (self) { - case .custom(let str): - return str + case .custom(let key): + return key default: return "_\(self)" } @@ -112,6 +112,7 @@ public protocol RowBuilder { var numberOfRows: Int { get } var reusableIdentifier: String { get } + var estimatedRowHeight: Float { get } func triggerAction(actionType: ActionType, cell: UITableViewCell?, indexPath: NSIndexPath, itemIndex: Int) -> AnyObject? } \ No newline at end of file diff --git a/TabletDemo/TabletDemo.xcodeproj/project.pbxproj b/TabletDemo/TabletDemo.xcodeproj/project.pbxproj index 42969fb..3a5cbf8 100644 --- a/TabletDemo/TabletDemo.xcodeproj/project.pbxproj +++ b/TabletDemo/TabletDemo.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 508B71841BF48DD300272920 /* TableSectionBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508B71831BF48DD300272920 /* TableSectionBuilder.swift */; }; 508B71861BF48E0D00272920 /* TableRowBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508B71851BF48E0D00272920 /* TableRowBuilder.swift */; }; DA1BCD0F1BF5472C00CC0479 /* TableDirector.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA1BCD0E1BF5472C00CC0479 /* TableDirector.swift */; }; + DA1BCD111BF7388C00CC0479 /* CustomTableActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA1BCD101BF7388C00CC0479 /* CustomTableActions.swift */; }; DAB7EB2B1BEF787300D2AD5E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB7EB2A1BEF787300D2AD5E /* AppDelegate.swift */; }; DAB7EB2D1BEF787300D2AD5E /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB7EB2C1BEF787300D2AD5E /* ViewController.swift */; }; DAB7EB301BEF787300D2AD5E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DAB7EB2E1BEF787300D2AD5E /* Main.storyboard */; }; @@ -23,6 +24,7 @@ 508B71831BF48DD300272920 /* TableSectionBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableSectionBuilder.swift; sourceTree = ""; }; 508B71851BF48E0D00272920 /* TableRowBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableRowBuilder.swift; sourceTree = ""; }; DA1BCD0E1BF5472C00CC0479 /* TableDirector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableDirector.swift; sourceTree = ""; }; + DA1BCD101BF7388C00CC0479 /* CustomTableActions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomTableActions.swift; sourceTree = ""; }; DAB7EB271BEF787300D2AD5E /* TabletDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TabletDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; DAB7EB2A1BEF787300D2AD5E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DAB7EB2C1BEF787300D2AD5E /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -68,6 +70,7 @@ DAB7EB2A1BEF787300D2AD5E /* AppDelegate.swift */, DAB7EB2C1BEF787300D2AD5E /* ViewController.swift */, DAB7EB3F1BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift */, + DA1BCD101BF7388C00CC0479 /* CustomTableActions.swift */, DAB7EB2E1BEF787300D2AD5E /* Main.storyboard */, DAB7EB311BEF787300D2AD5E /* Assets.xcassets */, DAB7EB331BEF787300D2AD5E /* LaunchScreen.storyboard */, @@ -165,6 +168,7 @@ DA1BCD0F1BF5472C00CC0479 /* TableDirector.swift in Sources */, DAB7EB401BEFD07E00D2AD5E /* ConfigurableTableViewCell.swift in Sources */, DAB7EB2B1BEF787300D2AD5E /* AppDelegate.swift in Sources */, + DA1BCD111BF7388C00CC0479 /* CustomTableActions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/TabletDemo/TabletDemo.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate b/TabletDemo/TabletDemo.xcodeproj/project.xcworkspace/xcuserdata/maxsokolov.xcuserdatad/UserInterfaceState.xcuserstate index 3ddca07c471873da543d3a20d78336aa2dffdbd2..6c57e1d730bc92263b02d50902a776224ae6f460 100644 GIT binary patch literal 24923 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 a-Wzp%)c2##cru@q^po!%koZKS&iy}4qridy delta 11633 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 - + - + @@ -49,24 +49,41 @@ - + - - + + + + + + + diff --git a/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift b/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift index 3d96de5..a83405f 100644 --- a/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift +++ b/TabletDemo/TabletDemo/ConfigurableTableViewCell.swift @@ -15,6 +15,7 @@ class ConfigurableTableViewCell: UITableViewCell, ConfigurableCell { typealias Item = String @IBOutlet weak var button: UIButton! + @IBOutlet weak var contentLabel: UILabel! static func reusableIdentifier() -> String { diff --git a/TabletDemo/TabletDemo/CustomTableActions.swift b/TabletDemo/TabletDemo/CustomTableActions.swift new file mode 100644 index 0000000..3c55cd9 --- /dev/null +++ b/TabletDemo/TabletDemo/CustomTableActions.swift @@ -0,0 +1,10 @@ +// +// CustomTableActions.swift +// TabletDemo +// +// Created by Max Sokolov on 14/11/15. +// Copyright © 2015 Tablet. All rights reserved. +// + +import UIKit +import Foundation diff --git a/TabletDemo/TabletDemo/ViewController.swift b/TabletDemo/TabletDemo/ViewController.swift index fd74961..9b0aa9b 100644 --- a/TabletDemo/TabletDemo/ViewController.swift +++ b/TabletDemo/TabletDemo/ViewController.swift @@ -23,29 +23,39 @@ class ViewController: UIViewController { data.cell?.textLabel?.text = "\(data.item)" } - .action(.height) { data in - - return 50 - } .action(.shouldHighlight) { data in return false } - let configurableRowBuilder = TableConfigurableRowBuilder(items: ["5", "6", "7", "8"]) + let configurableRowBuilder = TableConfigurableRowBuilder(items: ["5", "6", "7", "8"], estimatedRowHeight: 300) .action(.click) { data -> Void in - - data.cell!.textLabel?.text = "" - + print("click action indexPath: \(data.indexPath), item: \(data.item)") } - .action(kConfigurableTableViewCellButtonClickedAction) { data in + .action(kConfigurableTableViewCellButtonClickedAction) { data -> Void in print("custom action indexPath: \(data.indexPath), item: \(data.item)") } - - let sectionBuilder = TableSectionBuilder(headerTitle: "Tablet", footerTitle: "Deal with table view like a boss.", rowBuilders: [rowBuilder, configurableRowBuilder]) + .action(.height) { data -> ReturnValue in + + if data.item == "5" { + return 70 + } + return nil + } + .action(.configure) { (data) -> Void in + + data.cell!.contentLabel.text = "With iOS 8, Apple has internalized much of the work that previously had to be implemented by you prior to iOS 8. In order to allow the self-sizing cell mechanism to work, you must first set the rowHeight property on the table view to the constant UITableViewAutomaticDimension. Then, you simply need to enable row height estimation by setting the table view's estimatedRowHeight property to a nonzero value, for example" + + //data.cell!.setNeedsUpdateConstraints() + //data.cell!.updateConstraintsIfNeeded() + } + + let sectionBuilder = TableSectionBuilder(headerTitle: "Tablet", footerTitle: "Deal with table view like a boss.", rowBuilders: [configurableRowBuilder]) tableDirector.appendSection(sectionBuilder) } -} \ No newline at end of file +} + +// вход со стороны кутузовского проспекта между домами 10 14 левее чайхоны, на охране сказать кодовое слово Магия - найти клуб лабиринт \ No newline at end of file