2014-10-07 2 views
1

Я хочу добавить небольшую кнопку в нижнем правом углу UITableView. Когда мы находимся в верхней половине таблицы, кнопка программно прокручивает вас до нижней части, а когда вы находитесь в нижней половине, она поднимает вас вверх. Иконка кнопки меняется с «goto top» на «goto bottom» или наоборот в зависимости от ситуации.UITableView получает среднее положение через смещение содержимого

В моем коде ниже кнопка работает нормально - вы нажимаете ее, когда находитесь наверху, вы попадаете в нижнюю часть, а изображение кнопки меняется на значок «goto top». Однако, перетаскивание вверх и вниз, как вы бы традиционно в таблице, не заставляет кнопку менять значок. Вам даже нужно пройти мимо границы (сверху или снизу) таблицы, чтобы она перевернулась в правильное состояние.

При нажатии кнопки, если мы пройдем на полпути (как определено функцией pastHalfway), мы переходим либо в верхнюю, либо нижнюю часть таблицы. Что-то не так с этим, но я немного побеспокоился и в основном делал вещи не так хорошо по-разному. Я думаю, что проблема заключается в том, что я не правильно определяю смещение содержимого средней точки таблицы.

func pastHalfway() -> Bool { 
    // TODO: This doesn't work 
    let offset:CGPoint = self.tableView.contentOffset 
    let height:CGFloat = self.tableView.frame.height 
    println("pastHalfway offset.y=\(offset.y) height=\(height)") 
    return offset.y > (height/3.0) // 3.0 is 3/4 down the table 
} 


func gotoButtonPressed(sender: UIButton!) { 
    if let realPost = post { 
     if realPost.numberComments > 0 { 
      if self.pastHalfway() { 
       let indexPath:NSIndexPath = NSIndexPath(forRow: 0, inSection: 0) 
       self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.Top, animated: true) 
      } else { 
       let indexPath:NSIndexPath = NSIndexPath(forRow: realPost.numberComments - 1, inSection: 1) 
       self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: true) 
      } 
     } 
    } 
} 

func maybeShowGotoButtons() { 
    let yOffset:CGFloat = self.tableView.contentOffset.y 

    if (self.post!.numberComments < minRowsToShowGotoButtons) { 
     // Hide and disable buttons 
     self.gotoButton.hidden = true 
     self.gotoButton.enabled = false 
    } else { 
     // Show buttons, depending on content offset 

     if self.pastHalfway() { 
      self.gotoButton.setImage(UIImage(named: "gotoTopIcon"), forState: .Normal) 
     } else { 
      self.gotoButton.setImage(UIImage(named: "gotoBottomIcon"), forState: .Normal) 
     } 

     // And enable 
     self.gotoButton.hidden = false 
     self.gotoButton.enabled = true 
    } 
} 

UIScrollView Делегаты

override func scrollViewWillBeginDragging(scrollView: UIScrollView) { 
    UIView.animateWithDuration(0.1, animations: { 
     self.gotoButton.alpha = 0.5 
    }) 
} 

override func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
    UIView.animateWithDuration(0.2, animations: { 
     self.gotoButton.alpha = 1.0 
     self.maybeShowGotoButtons() 
    }) 
} 

override func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) { 
    // This is used for the programmatic scroll top/bottom when clicking buttons 
    self.maybeShowGotoButtons() 
} 
+0

это связано? http://stackoverflow.com/a/26142136/388280 – ytbryan

+0

это было частью решения – nflacco

ответ

1

Необходимые исправления были добавления 1)

override func scrollViewDidEndDecelerating(scrollView: UIScrollView) { 
    self.maybeShowGotoButtons() 
} 

2)

func atBottom() -> Bool { 
    let height = self.tableView.contentSize.height - self.tableView.frame.size.height 

    if self.tableView.contentOffset.y < 10 { 
     //reach top 
     return false 
    } 
    else if self.tableView.contentOffset.y < height/2.0 { 
     //not top and not bottom 
     return false 
    } 
    else { 
     return true 
    } 
} 
Смежные вопросы