Swift:当tableView宽度比屏幕大小宽时,如何处理tableView?

时间:2018-05-02 00:22:41

标签: ios swift tableview

我需要实现附图的场景。 当我尝试实现底层表格时,我遇到了一些问题。

底部表格有以下要求:

  1. 前2行应贴在头部,不允许向上/向下滚动。我使用表格部分来实现。

  2. 所有其他行都可以向上/向下滚动并可点击。我使用表格视图来实现

  3. 由于app支持更大的文本,当文本更大时,屏幕大小无法显示所有tableView,因此在这种情况下,整个tableview应支持水平滚动。

  4. 当tableview行数据与" currentBitting"不同时,其值为" 33342431",单个标签应显示背景颜色。

    < / LI>
  5. 每列应与表格对齐

  6. 以下是我如何实施的想法:

    1. 为了实现所有这些要求,我使用tableView来实现。数组项中的每个字符都使用标签来显示。

    2. 我使用最大宽度和常规宽度来定义每列的宽度

    3. 当文本字体大小改变时,我尝试设置底部的tableView contentSize =&#34; viewWillLayoutSubViews()&#34;

    4. 中的当前新内容大小
    5. 我为剖面头添加了背​​景颜色,否则,当底部桌面视图向上滚动时,它将与剖面头部重叠,并且屏幕外文本背景颜色不会渲染。所以我添加了部分头部背景颜色以避免这个问题。

    6. 目前,问题是水平滚动不起作用。很奇怪。

      老实说,我尝试了很多方法:

      1. 底部表单首先使用父scrollView,然后放一个子tableView。问题:顶部标题很难粘住或垂直滚动​​不那么平滑。我粘贴了我的scrollViewDidScroll部分。有用。但垂直滚动不那么顺利。如果有人可以帮助改进它,我将非常感激。
      2.     func scrollViewDidScroll(_ scrollView: UIScrollView) {
        
                let recognizer = scrollView.panGestureRecognizer
        
                let distance = recognizer.translation(in: scrollView)
        
                let deltaHeight:CGFloat = parentScrollView.contentSize.height - parentScrollView.frame.height
        
                let goingUp = distance.y < 0 //going up
                if distance.y != 0 {
        
                    if goingUp {
                        parentScrollView.contentOffset.y = 0
                        switch recognizer.state {
                        case .began,.changed:
                            if bottomTableview.contentOffset.y < deltaHeight {
                                bottomTableview.contentOffset.y -= distance.y
                                recognizer.setTranslation(.zero, in: scrollView)
                            }
                        case .ended:
                            if bottomTableview.contentOffset.y > deltaHeight{
                                bottomTableview.contentOffset.y = deltaHeight
                                UIView.animate(withDuration: 0.1, animations: {
                                    scrollView.layoutIfNeeded()
                                })
                            }
                        default:
                            break 
                        }  
                    }
                    else{
                        switch recognizer.state {
                        case .began,.changed:
                            if bottomTableview.contentOffset.y > 0 {
                                bottomTableview.contentOffset.y -= distance.y
                                recognizer.setTranslation(.zero, in: scrollView)
                            }
                        case .ended:
                            if bottomTableview.contentOffset.y < 0 {
                                bottomTableview.contentOffset.y = 0
                                UIView.animate(withDuration: 0.1, animations: {
                                    scrollView.layoutIfNeeded()
                                })
                            }
                        default:
                            break
                        } 
                    }
                }
            }
        
        
        
        1. 集合视图实施。但我不知道如何选择整行以获取数据以及如何粘贴顶部标题
        2. 有没有人有更好的想法来实施这个案例?非常感谢您的帮助。

          在表格视图中使用的数据是:

          let extensionCodeArray = ["Position", "Current Bitting", "11407", "10253", "10492", "14195", "11665", "10547", "12332", "12536", "10211", "11034", "10725", "11036", "12928"]
          
          let extensionResultBitting = ["12345678", "33342431", "33133244", "33243134", "32343134", "33134243", "31343234", "33342134", "31344233", "34342133", "31334342", "33134342", "34343132", "34231343", "32431343"]
          

          ScreenShot

2 个答案:

答案 0 :(得分:0)

对于您尝试的第一个解决方案。

UITableViewUIScrollView的子类,这意味着UITableView也有scrollViewDidScroll(_ scrollView: UIScrollView)个事件。

要解决此问题,您只需执行以下操作即可。将标记设置为tableView或scrollView以识别它 1.例如,要标识scrollView,请在初始化scrollView之后添加以下行。

scrollView.tag = 101  
  1. func scrollViewDidScroll(_ scrollView: UIScrollView)
  2.     func scrollViewDidScroll(_ scrollView: UIScrollView) 
         {
            if scrollView.tag == 101 { 
              // Triggered by scrollView
             } else { 
             // Triggered by tableView 
            }
    
         }
    

答案 1 :(得分:0)

我解决了这个问题。这个想法如下:

  1. 定义一个集合视图,设置其numberOfItemsInSection = 1
  2. 用于collectionView,设置其
  3. func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize --> return CGSize(width: contentSize.width, height: collectionView.frame.size.height)
    

    cotentSize是预先计算出的最终表格

    1. 对实现UICollectionViewCell数据源和tableView的{​​{1}}进行客户关注。 delegate的所有datasource来自tableView中定义的protocol。 Outerside UICollectionViewCellcollectionView
    2. delegate

      完成。