#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
}