2

我正在尝试将活力效果添加到我的表格视图单元格的文本标签中,它有点工作,但并不完全正确。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
    NSDictionary *jobDictionary = [self.jobs objectAtIndex:[indexPath row]];

    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
    }

    if (cell) {
        cell.backgroundColor = [UIColor clearColor];
        cell.textLabel.textColor = [UIColor whiteColor];

        cell.textLabel.text = [jobDictionary objectForKey:@"job"];

        UIBlurEffect *blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
        UIVisualEffectView *blurView = [[UIVisualEffectView alloc]initWithEffect:blur];
        blurView.frame = cell.bounds;
        [cell addSubview:blurView];
        UIVisualEffectView *vibrantView = [[UIVisualEffectView alloc]initWithEffect:[UIVibrancyEffect effectForBlurEffect:blur]];
        vibrantView.frame = blurView.bounds;
        [vibrantView.contentView addSubview:cell.textLabel];

        [blurView.contentView addSubview:vibrantView];
    }

    return cell;
}

在此处输入图像描述

4

1 回答 1

0

我想我看到您的代码存在两个主要问题。第一个问题似乎是 cellForRowAtIndexPath 中的单元格在出列以在 iPhone 4 或 5 屏幕尺寸上显示时假定宽度为 320。如果该屏幕截图是从 6 或 6+ 拍摄的,这将解释奇怪的差距。在此方法之后的某个地方,单元格会调整大小以适应表格的整个宽度。这意味着当你设置 blurView.frame = cell.bounds 时,此时的边界实际上太窄了。假设您可以通过将该代码移动到以下方法中来解决此问题,但需要注意一个主要警告。

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

虽然在此处添加模糊视图应该为您提供正确的框架,但在这些方法中的任何一种中添加子视图都会导致单元格被回收时出现重大问题。每次该单元出列时,都会向其中添加一个新的子视图,并且它们将随着时间的推移继续堆叠。如果它们不是完全不透明,这将导致视觉问题,并且还会使您的单元格可能需要大量内存,因为理论上您可以在表格滚动时在一个单元格上堆叠数百个子视图。

我认为解决您的问题的最佳方法是继承 UITableViewCell 并在 -initWithStyle:reuseIdentifier: 上添加视图。在那里,您还可以将该视图限制为超级视图的顶部、底部、前导和尾随,以确保它始终正确调整大小。另一种方法是在单元格子类的 -layoutSubviews 中设置子视图的框架。

这样做可以确保只添加一次视图,并且框架将是您所期望的。

于 2015-05-12T17:45:54.070 回答