Получить текущее местоположение значения y на экране каждого UITableViewCell

У меня есть UITableViewController с пользовательским классом для моего UITableViewCell . У меня UIImageView и UILabel на этом UITableViewCell .

Я хочу, чтобы содержимое на UITableViewCell стало немного более прозрачным / прозрачным, когда оно превышает определенное значение y на экране, поэтому вы получаете эффект «затухания», аналогичный приложению Rdio:

Альфа-значение <code> UIImageView </ code> и UILabel: 1.0Теперь значение ниже, например 0,7 или что-то еще.

MyUIViewController.h

 @property (strong, nonatomic) IBOutlet UITableView *tableview; 

MyUIViewController.m

 @synthesize tableview; - (void)scrollViewDidScroll:(UIScrollView *)scrollView { NSArray *listOfVisibleCells = tableview.visibleCells; for (int i=0; i<[listOfVisibleCells count]; i++) { MTTableViewCell *cell = [listOfVisibleCells objectAtIndex:i]; /* Smooth fade out */ if (scrollView.contentOffset.y > (cell.frame.origin.y + 10)) { [cell.companyImage setAlpha:0.7]; } if (scrollView.contentOffset.y > (cell.frame.origin.y + 20)) { [cell.companyImage setAlpha:0.5]; } if (scrollView.contentOffset.y > (cell.frame.origin.y + 30)) { [cell.companyImage setAlpha:0.3]; } if (scrollView.contentOffset.y > (cell.frame.origin.y + 40)) { [cell.companyImage setAlpha:0.1]; } /* Fade in */ if (scrollView.contentOffset.y < (cell.frame.origin.y + 10)) { [cell.companyImage setAlpha:1.0]; } } } 

Эта строка:

if (scrollView.contentOffset.y > ((i*90)+30) ) {

должно быть:

if (scrollView.contentOffset.y > (cell.frame.origin.y + 30)) {

Я полагаю, что вы можете использовать методы делегата UITableView для их обработки.

UITableViewDelegate:

Сообщает делегату, что представление таблицы предназначено для рисования ячейки для определенной строки.

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

UIScrollViewDelegate:

Сообщает делегату, когда пользователь просматривает представление содержимого в приемнике. Вы также можете знать смещение содержимого.

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 

Следуя этим методам, вы можете обнаружить текущее значение UITableViewCell или значение offset.y.

Надеюсь, это может вам помочь.

Несмотря на то, что вы получили желаемый ответ, я добавлю альтернативный способ сделать это.

В вашем scrollViewDidScroll: метод:

 if ([myTableView indexPathsForVisibleRows].count) { NSIndexPath* firstCellIndexPath = [myTableView indexPathsForVisibleRows].firstObject; CGRect cellRect = [myTableView rectForRowAtIndexPath:firstCellIndexPath];//frame of cell with respect to the table content CGFloat yOriginForTopCell = [myTableView convertRect:cellRect toView:self.view].origin.y;//get y-origin after converting the co-ordinates to self.view NSLog(@"%f", yOriginForTopCell); } 

Здесь вы получаете y-происхождение самой первой видимой ячейки внутри таблицы, независимо от состояния прокрутки. Как только вы получите свое происхождение, вы можете использовать его так, как вам нравится. Преимущество: никаких вычислений не требуется на вашем конце. Просто выберите значение для вашего верхнего края (где должно начинаться замирание), предпочтительно ваш y-origin topBar / navBar + height, который оказывается постоянным значением.

Вы можете настроить свою альфа динамически, с более постепенным исчезновением:

 customCell* yourCell = (customCell*)[myTableView cellForRowAtIndexPath:firstCellIndexPath]; yourCell.yourView.alpha = yOriginForTopCell/<CONSTANT_VALUE>;//yourCell = `MTTableViewCell` | yourView = `companyImage` 

Здесь ваш CONSTANT_VALUE должен предпочтительно иметь 64px (если используется собственный UINavigationBar) или yourTopBar.frame.origin.y + yourTopBar.frame.size.height (если используется пользовательский вид вверху).

Попробуйте это решение за один раз.