Подтвердить что ты не робот

Хотите, чтобы UITableView "привязывался к ячейке"

Я показываю довольно большие изображения в UITableView. По мере того, как пользователь прокручивает, я бы хотел, чтобы табличное представление всегда привязывало центральную фотографию в середине. То есть, когда таблица находится в состоянии покоя, она всегда будет иметь UITableViewCell, привязанный к центру.

Как это сделать?

4b9b3361

Ответ 1

Вы можете использовать методы UIScrollViewDelegate на UITableView для этого:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    // if decelerating, let scrollViewDidEndDecelerating: handle it
    if (decelerate == NO) {
        [self centerTable];
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    [self centerTable];
}

- (void)centerTable {
    NSIndexPath *pathForCenterCell = [self.tableView indexPathForRowAtPoint:CGPointMake(CGRectGetMidX(self.tableView.bounds), CGRectGetMidY(self.tableView.bounds))];

    [self.tableView scrollToRowAtIndexPath:pathForCenterCell atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}

Ответ 2

Для этого существует специальный метод делегата UIScrollView!

Вид таблицы (который представляет собой прокрутку) вызывает - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset, когда пользователь перестает прокручивать. Вы можете настроить манипулирование targetContentOffset, чтобы убедиться, что он заканчивается там, где вы хотите, и он будет замедляться, заканчиваясь в этой позиции (точно так же, как пейджинг UIScrollView).

Например, если ваши ячейки были на 100 пунктов выше, вы могли бы сделать:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    targetContentOffset->y = 100 * (int)targetContentOffset->y/100;
}

Конечно, вы также можете проверить переданный targetContentOffset, чтобы увидеть, куда он будет приземляться, а затем найти ячейку, в которой находится и изменить ее соответствующим образом.

Ответ 3

Построим из того, что отправлено @jszumski, если вы хотите, чтобы привязка произошла при середине перетаскивания, используйте этот код:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    [self centerTable];
}

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
    [self centerTable];
}

- (void)centerTable {
    NSIndexPath *pathForCenterCell = [self.tableView indexPathForRowAtPoint:CGPointMake(CGRectGetMidX(self.tableView.bounds), CGRectGetMidY(self.tableView.bounds))];

    [self.tableView scrollToRowAtIndexPath:pathForCenterCell atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}

Ответ 4

Расширение @jesse-rusak ответа выше, это код, который вам нужно будет добавить в ваш подкласс UITableViewController, если у вас есть ячейки с переменной высотой. Это позволит избежать проблемы с двойным прокруткой в ​​принятом ответе.

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    NSIndexPath *pathForTargetTopCell = [self.tableView indexPathForRowAtPoint:CGPointMake(CGRectGetMidX(self.tableView.bounds), targetContentOffset->y)];
    targetContentOffset->y = [self.tableView rectForRowAtIndexPath:pathForTargetTopCell].origin.y;
}

Ответ 5

для быстрых peeps

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) 
{
   if decelerate == false
   {
       self.centerTable()
   }
 }

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

func centerTable()
{
   let midX:CGFloat = self.tableView.bounds.midX
   let midY:CGFloat = self.tableView.bounds.midY
   let midPoint:CGPoint = CGPoint(x: midX, y: midY)

   if let pathForCenterCell:IndexPath = self.tableView .indexPathForRow(at: midPoint)
    {
      self.tableView.scrollToRow(at: pathForCenterCell, at: .middle, animated: true)
    }
}//eom

Ответ 6

UITableView расширяет UIScrollView...

myTableView.pagingEnabled = YES