2017-02-02 15 views
0

Я хочу, чтобы мои tableViewHeaders были видны, когда пользователь прокручивает, прикрепляя верх, что является текущим поведением в моем TableView. Однако, когда tableView перестает прокручиваться, я хочу удалить эти «закрепленные» заголовки. Я достижение этой цели в моем CollectionView проекте, используя следующий в моих методах делегата Scrollview:Как удержать заголовочные заголовки UITableView скрыть после прокрутки

if let cvl = chatCollectionView.collectionViewLayout as? UICollectionViewFlowLayout { 
      cvl.sectionHeadersPinToVisibleBounds = false 
      cvl.invalidateLayout() 
} 

Есть ли подобный способ скрыть «возлагали» (липкие) заголовки Tableview в? Я использую tableViewController.

ответ

0

Это мое решение этой проблемы. Интересно, есть ли еще более простой способ сделать это.

Обратите внимание, что это будет работать, только если ваш заголовок является UITableViewHeaderFooterView. Нет, если вы используете UITableViewCell для заголовка. Если вы используете UITableViewCell, tableView.headerView (forSection: indexPathForVisibleRow.section) вернет нуль.

Чтобы скрыть заголовочные заголовки, когда tableView перестает прокручиваться, и они снова появляются, когда tableView начинает прокрутку снова, переопределите эти четыре метода делегата scrollView.

В первых двух (scrollViewWillBeginDragging и scrollViewWillBeginDecelerating) получите заголовок раздела для первого раздела видимых строк и убедитесь, что он не скрыт.

Во вторых двух методах делегата выполните проверку, чтобы увидеть, что для каждой из видимых строк кадр заголовка для этой строки не перекрывает кадр для ячейки строки. Если это так, то это закрепленный заголовок, и мы скрываем его после задержки. Нам нужно убедиться, что scrollView по-прежнему не перетаскивается, прежде чем удалять закрепленный заголовок, как это будет в случае, когда пользователь поднимает палец, но свиток прокрутки продолжает прокручиваться. Кроме того, из-за временной задержки мы проверяем, что scrollView не перетаскивается, прежде чем удалять его, если пользователь снова начнет прокручиваться менее чем через 0,5 секунды после остановки прокрутки.

override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { 
    showPinnedHeaders() 
} 

override func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) { 
    showPinnedHeaders() 
} 

override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    removePinnedHeaders() 
} 

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
    removePinnedHeaders() 
} 

private func showPinnedHeaders() { 
    for section in 0..<totalNumberOfSectionsInYourTableView { 
     tableView.headerView(forSection: section)?.isHidden = false 
    } 
} 

private func removePinnedHeaders() { 
    if let indexPathsForVisibleRows = tableView.indexPathsForVisibleRows { 
     if indexPathsForVisibleRows.count > 0 { 
      for indexPathForVisibleRow in indexPathsForVisibleRows { 
       if let header = tableView.headerView(forSection: indexPathForVisibleRow.section) { 
        if let cell = tableView.cellForRow(at: indexPathForVisibleRow) { 
         if header.frame.intersects(cell.frame) { 
          let seconds = 0.5 
          let delay = seconds * Double(NSEC_PER_SEC) 
          let dispatchTime = DispatchTime.now() + Double(Int64(delay))/Double(NSEC_PER_SEC) 
          DispatchQueue.main.asyncAfter(deadline: dispatchTime, execute: { 
           if !self.tableView.isDragging && header.frame.intersects(cell.frame) { 
            header.isHidden = true 
           } 
          }) 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Дополнительно добавить removePinnedHeaders() в viewDidAppear() и любые другие методы изменения вращения или клавиатуры кадров, которые будут прокручивать ваш Tableview.

 Смежные вопросы

  • Нет связанных вопросов^_^