Skip to content

Instantly share code, notes, and snippets.

@vivekguptaraw
Last active May 14, 2018 05:45
Show Gist options
  • Select an option

  • Save vivekguptaraw/ad1bffa72afe54201a16fc33051c35a3 to your computer and use it in GitHub Desktop.

Select an option

Save vivekguptaraw/ad1bffa72afe54201a16fc33051c35a3 to your computer and use it in GitHub Desktop.

Revisions

  1. vivekguptaraw revised this gist May 14, 2018. 1 changed file with 3 additions and 1 deletion.
    4 changes: 3 additions & 1 deletion HRScrollDemo.swift
    Original file line number Diff line number Diff line change
    @@ -8,6 +8,8 @@

    import UIKit

    let rightCollectionViewCellSize: CGFloat = 50

    class HRScrollDemo: UIViewController {
    let hrScrollTableView: HRScrollTableView = HRScrollTableView()
    let leftCellIdentifier = "LeftTableViewCell"
    @@ -28,7 +30,7 @@ class HRScrollDemo: UIViewController {
    dataSource.map{
    if let _rightArray = $0.value as? [Int]{
    self.rightTableArray.append(_rightArray)
    let arrayWidth = CGFloat(_rightArray.count * 50)
    let arrayWidth = CGFloat(_rightArray.count) * rightCollectionViewCellSize
    if arrayWidth > rightCellWidth{
    //MARK: right table view cell width is calculated as per the maximum element in any child array.
    rightCellWidth = arrayWidth
  2. vivekguptaraw created this gist May 14, 2018.
    136 changes: 136 additions & 0 deletions HRScrollDemo.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,136 @@
    //
    // HRScrollDemo.swift
    // DynamicUIDemo
    //
    // Created by Vivek Gupta on 11/05/18.
    // Copyright © 2018 Vivek Gupta. All rights reserved.
    //

    import UIKit

    class HRScrollDemo: UIViewController {
    let hrScrollTableView: HRScrollTableView = HRScrollTableView()
    let leftCellIdentifier = "LeftTableViewCell"
    let rightCellIdentifier = "RightTableViewCell"
    let dataSource = arrayForBirectional
    let leftTableArray: [String] = Array(arrayForBirectional.keys)
    var rightTableArray: [[Int]] = []
    override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "HRScrollTable"
    hrScrollTableView.leftTable.register(UINib.init(nibName: "LeftTableViewCell", bundle: nil), forCellReuseIdentifier: leftCellIdentifier)
    hrScrollTableView.rightTable.register(UINib.init(nibName: "RightTableViewCell", bundle: nil), forCellReuseIdentifier: rightCellIdentifier)
    self.view.addSubview(hrScrollTableView)
    self.hrScrollTableView.delegate = self
    self.hrScrollTableView.reloadTables()
    self.hrScrollTableView.leftTableWidth = 0.35 * UIScreen.main.bounds.width
    var rightCellWidth: CGFloat = 0
    dataSource.map{
    if let _rightArray = $0.value as? [Int]{
    self.rightTableArray.append(_rightArray)
    let arrayWidth = CGFloat(_rightArray.count * 50)
    if arrayWidth > rightCellWidth{
    //MARK: right table view cell width is calculated as per the maximum element in any child array.
    rightCellWidth = arrayWidth
    }
    }
    }
    self.hrScrollTableView.rightTableWidth = rightCellWidth
    self.hrScrollTableView.scrollView.alwaysBounceHorizontal = true
    DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.3) {
    self.hrScrollTableView.applyRightShadowToLeftTable()
    }
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }

    override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    }

    override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    //MARK: 54 is taken as navigation bar height. You can pass height, width as per your requirement that which you size of control you want
    hrScrollTableView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height - 54)
    }

    }

    extension HRScrollDemo : HRScrollDelegate{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return leftTableArray.count
    }
    func numberOfSectionsInTableView(_ tableView: UITableView) -> Int {
    return 1
    }
    func tableView(_ tableView: UITableView, willdisplayCellVG cell: UITableViewCell, indexPath: IndexPath) {
    if tableView.isEqual(self.hrScrollTableView.rightTable){
    guard let rightCell = cell as? RightTableViewCell else{return}
    rightCell.setCollectionViewDataSourceDelegate(dataSourceDelegate: self.hrScrollTableView, forRow: indexPath.row)
    }
    }

    func tableView(_ tableView: UITableView, atIndexPath: IndexPath) -> UITableViewCell {
    if tableView.isEqual(self.hrScrollTableView.rightTable){
    let cell = self.hrScrollTableView.rightTable.dequeueReusableCell(RightTableViewCell.self, forIndexPath: atIndexPath)
    return cell
    }else{
    let cell = self.hrScrollTableView.leftTable.dequeueReusableCell(LeftTableViewCell.self, forIndexPath: atIndexPath)
    cell.labelText.text = "\(leftTableArray[atIndexPath.row])"
    return cell
    }
    }

    func tableView(_ tableView: UITableView, heightAtIndexPath: IndexPath)->CGFloat {
    return 50
    }

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 50
    }

    func tableView(_ tableView: UITableView, headerAtSection: Int) -> UIView {

    if tableView.isEqual(self.hrScrollTableView.leftTable){
    let lblLeft = UILabel(frame: CGRect(x: 0, y: 0, width: self.hrScrollTableView.leftTable.frame.width - 2, height: 50))
    lblLeft.textAlignment = .center
    lblLeft.text = "Left title"
    lblLeft.backgroundColor = UIColor.lightGray
    return lblLeft
    }else{
    let vw = UIView(frame: CGRect(x: 0, y: 0, width: self.hrScrollTableView.rightTable.frame.width, height: 50))
    let lblRight = UILabel()
    lblRight.textAlignment = .left
    lblRight.text = "Right Title"
    lblRight.sizeToFit()
    lblRight.lineBreakMode = .byTruncatingTail
    lblRight.frame = CGRect(x: 50, y: 0, width: lblRight.frame.width, height: 50)
    vw.addSubview(lblRight)
    vw.backgroundColor = UIColor.white
    return vw
    }
    }

    func tableView(_ tableView: UITableView, didSelectIndexPath indexPath: IndexPath) {
    print(indexPath)
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSectionVG section: Int) -> Int {
    return rightTableArray[collectionView.tag].count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAtVG indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(forIndexPath: indexPath) as RightCollectionViewCell
    cell.labelText.text = "\(rightTableArray[collectionView.tag][indexPath.row])"
    return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectVGItemAt indexPath: IndexPath) {
    print("\(collectionView.tag) \(indexPath)")
    }

    }