как получить indexpath TableView любым способом

#ios #swift

Вопрос:

Я пытаюсь показать анимацию, если indexPath == 0 и направление прокрутки вниз, но я не могу получить indexPath TableView в методе scrollViewDidScroll. вот мой код … >

  func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let indexPath = tableView.indexPath(for: ThirdTableViewCell() as UITableViewCell)
    if (self.lastContentOffset > scrollView.contentOffset.y) amp;amp; indexPath?.row == 0  {
        print ("up")
    }
    else if (self.lastContentOffset < scrollView.contentOffset.y)  {
     //   print ("down")
    }

    self.lastContentOffset = scrollView.contentOffset.y
}
 

Я получил значение indexPath nil во время отладки

Комментарии:

1. Вы получаете, nil потому что проходите в только что созданной ячейке. Эта ячейка не видна в представлении таблицы и не имеет связанного пути к индексу.

2. @Paulw11 каков правильный метод ?

3. Возможно, вы сможете использовать это в сочетании со смещением вида прокрутки

4. Что вы подразумеваете под «если indexPath == 0 и направление прокрутки вниз» ? Вы имеете в виду, что хотите что-то сделать, когда пользователь прокручивает вашу таблицу, а затем перемещается вниз, и верхняя строка снова становится видимой?

5. @xahiw — это все еще не ясно. Вы хотите, чтобы эта «анимация со стрелкой вниз» находилась внутри первой ячейки/строки? Или это не часть ячейки, и вы хотите, чтобы она отображалась/анимировалась всякий раз, когда строка at indexPath == 0 видна?

Ответ №1:

Вы все еще не объяснили, что вы действительно хотите сделать, но, возможно, это поможет…

Начните с настройки вашего scrollViewDidScroll , как это:

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
    
    var partOfRowZeroIsVisible: Bool = false
    var topOfRowZeroIsVisible: Bool = false
    var userIsDraggingDown: Bool = false

    // if user pulls table DOWN when Row Zero is at top,
    //  contentOffset.y will be negative and table will
    //  bounce back up...
    // so, we make y AT LEAST 0.0
    let y = max(0.0, tableView.contentOffset.y)
    
    // point for the top visible content
    let pt: CGPoint = CGPoint(x: 0, y: y)
    
    if let idx = tableView.indexPathForRow(at: pt), idx.row == 0 {
        // At least PART of Row Zero is visible...
        partOfRowZeroIsVisible = true
    } else {
        // Row Zero is NOT visible...
        partOfRowZeroIsVisible = false
    }
    
    if y == 0 {
        // Table view is scrolled all the way to the top...
        topOfRowZeroIsVisible = true
    } else {
        // Table view is NOT scrolled all the way to the top...
        topOfRowZeroIsVisible = false
    }
    
    if (self.lastContentOffset >= y) {
        // User is DRAGGING the table DOWN
        userIsDraggingDown = true
    } else {
        // User is DRAGGING the table UP
        userIsDraggingDown = false
    }

    // save current offset
    self.lastContentOffset = y
 

Затем, чтобы показать или скрыть свою «стрелку»:

     // if you want to show your "arrow"
    //  when ANY PART of Row Zero is visible
    if partOfRowZeroIsVisible {
        arrow.isHidden = false
    } else {
        arrow.isHidden = true
    }
 

или:

     // if you want to show your "arrow"
    //  ONLY when table view has been scrolled ALL THE WAY to the top
    if topOfRowZeroIsVisible {
        arrow.isHidden = false
    } else {
        arrow.isHidden = true
    }
 

или:

     // if you want to show your "arrow"
    //  when ANY PART of Row Zero is visible
    //  and
    //  ONLY if the user is dragging DOWN
    if partOfRowZeroIsVisible amp;amp; userIsDraggingDown {
        arrow.isHidden = false
    } else {
        arrow.isHidden = true
    }
 

или:

     // if you want to show your "arrow"
    //  ONLY when table view has been scrolled ALL THE WAY to the top
    //  and
    //  ONLY if the user is dragging DOWN
    if topOfRowZeroIsVisible amp;amp; userIsDraggingDown {
        arrow.isHidden = false
    } else {
        arrow.isHidden = true
    }