【问题标题】:Get current y value location on screen of each UITableViewCell获取每个 UITableViewCell 屏幕上的当前 y 值位置
【发布时间】:2014-04-27 16:23:21
【问题描述】:

我有一个UITableViewController,其中有一个用于我的UITableViewCell 的自定义类。我在这个UITableViewCell 上有一个UIImageView 和一个UILabel

我希望UITableViewCell 上的内容在屏幕上的某个 y 值以上时变得更加半透明/透明,这样您就可以获得类似于 Rdio 应用程序的“褪色效果”:

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];
        }
    }
}

【问题讨论】:

  • 请发布您目前尝试过的代码

标签: ios objective-c uitableview transparent alpha


【解决方案1】:

这一行:

if (scrollView.contentOffset.y &gt; ((i*90)+30) ) {

应该是:

if (scrollView.contentOffset.y &gt; (cell.frame.origin.y + 30)) {

【讨论】:

    【解决方案2】:

    我想你可以使用 UITableView 的委托方法来处理这些。

    UITableViewDelegate:

    告诉代理表视图即将为特定行绘制一个单元格。

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

    UIScrollViewDelegate:

    当用户在接收器中滚动内容视图时告诉代理。您还可以知道内容偏移量。

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    

    通过这些方法,你可以检测当前的 UITableViewCell 或者 offset.y 的值。

    希望对你有帮助。

    【讨论】:

    • 在scrollViewDidScroll方法中,使用tableView上的visibleCells方法来获取屏幕上所有当前可见的单元格。这些单元格中的每一个都将通过cell.frame.origin.y 具有特定的 y 偏移量,您可以将其用于淡化效果。
    【解决方案3】:

    即使你已经收到了你想要的答案,我也会添加另一种方法来做到这一点。

    在您的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 原点。一旦你得到你的起源,你可以以任何你喜欢的方式使用它。优点是,您无需进行任何计算。只需为您的顶部边缘(必须开始褪色)选择一个值,最好是您的 topBar/navBar y-origin + height,结果是一个常数值。

    您可以动态设置您的 alpha,并通过以下方式逐渐淡出:

    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(如果使用顶部的自定义视图)。

    试试这个解决方案一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      相关资源
      最近更新 更多