自定义背景图像到UITableView,但有tableHeaderView忽略它并保持透明?

时间:2012-10-31 21:44:15

标签: iphone ios parallax uitableview

坚持某事,我不确定它是否可能。有没有办法将UITableView的背景设置为自定义图像,但不要让该背景应用于tableHeaderView。我的桌子上有一个标题需要保持透明,因为我有一个视差类型效果(如路径2应用程序),透明表格标题后面的图像实现了tableview的前1/3 ...但我需要在表的其余部分后面获得自定义图像。

我可以成功地接近背景样式,即可在每个单元格后面填充:

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

然而,这并不是我想要的,因为我想要在屏幕上的整个tableview后面的径向渐变背景视图,减去透明标题......不仅仅是每个单元格的相同图像。此外,这种方法确实击中了我的tableview的滚动性能,为每个单元格加载了一个新的BG图像。

我知道你可以使用:

  UIImageView *tempImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]];
  [tempImageView setFrame:self.tableView.frame];

  self.tableView.backgroundView = tempImageView;

为tableview设置BG图像,它非常接近我正在尝试做的事情,但我认为该标题是透明的。有没有办法使用它,还告诉tableHeaderView忽略它并透明? 谢谢大家,&万圣节快乐!

2 个答案:

答案 0 :(得分:0)

是否有理由不能让tableHeaderView成为您希望产生视差效果的图像的容器?

创建UIView并将其粘贴为tableHeaderView的{​​{1}},然后将UITableView(或其他)添加到UIImageView。使用tableHeaderView的委托方法,您可以在其父视图中根据用户滚动重新定位此UIScrollView

请参阅此开源项目,了解路径启发的视差UIViewRBParallaxTableViewController

答案 1 :(得分:0)

是的,你可以。我为分组UITableView实现了视差效果的解决方案。您可以使用相同的方法,除了黑色背景(下面的示例),您可以使用您的图像。基本上,您在tableview后面有两个视图(清晰,标题视图背景清晰以及表视图背景本身)。基于滚动(UIScrollViewDelegate)移动的这两个视图。你的tableview背景图片你将“滚动”1对1与表,而你的视差图像将以不同的速率“滚动”当然。在下面的示例中,我认为我的“_secondParaView”将是您桌面的背景图片。

首先,在viewDidLoad中,创建一个视图以部分隐藏您的图像以获得视差效果,应该是与您想要的tableview相同的颜色,在我的情况下是blackColor。我根据图像的大小将视图放置在固定偏移处,您希望此视图的顶部与“section 0”标题视图末尾的顶部对齐。然后它将在桌面滚动时“滚动”。在tableview下方插入此视图。

_secondParaView = [[UIView alloc] initWithFrame: CGRectMake(0.0, kTableViewOffset, self.view.frame.size.width, 200.0)];
_secondParaView.backgroundColor = [UIColor colorWithRed: 0.0 green: 0.0 blue: 0.0 alpha: 1.0];
[self.view insertSubview: _secondParaView belowSubview: _tableView];

_headerImageYOffset = -40.0;
_headerImageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"SpaceRedPlanet640x480.png"]];
CGRect headerImageFrame = _headerImageView.frame;
headerImageFrame.origin.y = _headerImageYOffset;
_headerImageView.frame = headerImageFrame;
[self.view insertSubview: _headerImageView belowSubview: _secondParaView];
_tableView.backgroundColor = [UIColor clearColor];

然后为标题视图/标题视图大小实现两个分组的tableview方法:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section == 0) {
        UIView * tableHeaderView = [[UIView alloc] initWithFrame: CGRectMake(0.0, 0.0, self.view.frame.size.width, kTableViewOffset)];
        tableHeaderView.backgroundColor = [UIColor clearColor];     
        return tableHeaderView;
    } else
        return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (section == 0) {
        return kTableViewOffset;
    } else 
        return 2;
}

就像在“普通”tableview parallax实现中一样,让你的VC成为UIScrollViewDelegate并实现这个scrollViewDidScroll如下:

#pragma mark -
#pragma mark UIScrollViewDelegate methods
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat scrollOffset = scrollView.contentOffset.y;
    CGRect headerImageFrame = _headerImageView.frame;
    CGRect underParaFrame = _secondParaView.frame;

    if (scrollOffset < 0) {
        // Adjust top image proportionally
        headerImageFrame.origin.y = _headerImageYOffset - ((scrollOffset / 3));
    } else {
        // We're scrolling up, return to normal behavior
        headerImageFrame.origin.y = _headerImageYOffset - scrollOffset;
    }
    underParaFrame.origin.y = kTableViewOffset - scrollOffset;
    _headerImageView.frame = headerImageFrame;
    _secondParaView.frame = underParaFrame;
}

希望这会有所帮助,或者至少可以帮助某人为分组的桌面视图实现视差效果。我找不到解决办法。