Я пытаюсь реализовать представление таблицы, в котором при прокрутке высоты ячейки сверху становится больше, чем остальные ячейки. Я в основном хочу, чтобы первая ячейка всегда была 200f и оставалась 100f. Я могу сделать это, когда пользователь прокручивается вниз, но когда пользователь прокручивается вверх и прокручивается слишком быстро, кадр не сбрасывается должным образом.Как изменить высоту кадра uitableviewcell с помощью contentOffset
relavant код:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
int row = scrollView.contentOffset.y/kSmallHeight;
_currentCellIndexPath = [NSIndexPath indexPathForRow:row inSection:0];
UITableViewCell *topCell = [self.tableView cellForRowAtIndexPath:_currentCellIndexPath];
NSIndexPath *path = [NSIndexPath indexPathForRow:_currentCellIndexPath.row + 1 inSection:_currentCellIndexPath .section];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:path];
[self.tableView insertSubview:cell aboveSubview:topCell];
[self adjustCellHeightForCell:cell withDefaultOffset:NO];
}
- (void)adjustCellHeightForCell:(UITableViewCell *)cell withDefaultOffset:(BOOL)defailtOffset
{
int row = self.tableView.contentOffset.y/kSmallHeight;
double fakeOriginy = (kBigHeight + kSmallHeight * (cell.tag-1));
double set = row * kSmallHeight;
CGRect frame = cell.frame;
double offset;
if(defailtOffset)
offset = kSmallHeight;
else {
offset = ((self.tableView.contentOffset.y - set) * ((kBigHeight - kSmallHeight)/ kSmallHeight));
}
frame.origin.y = fakeOriginy - offset;
frame.size.height = kSmallHeight + offset;
cell.frame = frame;
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
int row = self.tableView.contentOffset.y/kSmallHeight;
_currentCellIndexPath = [NSIndexPath indexPathForRow:row inSection:0];
if(indexPath.row != 0 && indexPath.row < _currentCellIndexPath.row)
[self adjustCellHeightForCell:cell withDefaultOffset:YES];
}
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
//This is the index of the "page" that we will be landing at
NSUInteger nearestIndex = (NSUInteger) ((int)targetContentOffset->y % (int)kSmallHeight) >= kSmallHeight/2 ? targetContentOffset->y/kSmallHeight + 1 : targetContentOffset->y/kSmallHeight;
//Just to make sure we don't scroll past your conpo tent
nearestIndex = MAX(MIN(nearestIndex, self.store.coupons.count - 1), 0);
//This is the actual x position in the scroll view
CGFloat yOffset = nearestIndex * kSmallHeight;
//I've found that scroll views will "stick" unless this is done
yOffset = yOffset==0?1:yOffset;
//Tell the scroll view to land on our page
*targetContentOffset = CGPointMake(targetContentOffset->x,yOffset);
}
Это не имеет никакого значения. Первая ячейка не нуждается ни в каких настройках. Проблема заключается в том, что пользователь слишком быстро прокручивает метод, который не вызывается для каждого непрерывного изменения смещения, и, следовательно, кадры не возвращаются к исходным размерам. –
Возникает ли проблема при прокрутке назад или в обоих направлениях? Надеюсь, это помогло, обновлено. – Bejibun
Проблема заключается в том, что я прокручиваю слишком быстро в любом направлении, но в основном видимый, когда я просматриваю назад, потому что расширенный tableviewcell не может полностью восстановить исходный размер из-за того, что метод doscroll не вызывается для каждого непрерывного изменения смещения. сброс смещения содержимого до 0, когда indexPath.row равен нулю, не имеет смысла –