如果超出父视图边界,则会修剪iOS7的子视图

时间:2013-09-18 09:43:12

标签: ios objective-c uitableview ios7

我从苹果公布了新的用户界面信息 - 没有帮助。

现在让代码和屏幕截图向您展示我遇到的问题。 为了确保这不是我的错误代码,我创建了一个新项目,只有一个文件 - 一个在id里面有一个tableView的UIViewController。代表们已经确定。

我执行以下操作:

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

    // Return the number of sections.
    return 3;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    return 3;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"UITableViewCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"%d",indexPath.row];
    // Configure the cell...

    UIView * redView = [[UIView alloc] initWithFrame:CGRectMake(0, -10, 100, 20)];
    redView.backgroundColor = [UIColor redColor];
    [cell addSubview:redView];

    return cell;
}

表视图在Grouped上设置。 让我们在iOS 6上运行它:

当然,Y起源是负面的! 是的,它是,这是我想要实现的结果。 让我们看看它在iOS 7上显示的内容:

提示:如果我们将redView添加到普通的UIView中,则不会发生这种情况。

另一个提示:如果我将tableView的背景颜色设置为蓝色,则各部分之间的灰线将为蓝色,而不是灰色(作为灰色不是设置标题的演示)。 另一个提示:同样适用于ipad。

为什么在iOS 7中它会削减一切超出范围的内容?请帮忙!

3 个答案:

答案 0 :(得分:7)

这是因为iOS 7对UITableViewCells的视图层次结构进行了一些更改。

曾经是UITableViewCell view -> contentView

现在它更像是UITableViewCell view -> scrollView -> contentView

解决方法是在scrollView上设置clipsToBounds = NO(默认情况下设置为YES)。实现这一目标的方法是通过superview属性。

所以基本上在iOS6和之前,为了让内容溢出单元格范围,你会这样做:

self.clipsToBounds = NO;                        //cell's view
self.contentView.clipsToBounds = NO;            //contentView

在iOS7中,您还必须防止滚动视图不被剪切,因此您可以执行以下操作:

self.clipsToBounds = NO;                        //cell's view
self.contentView.clipsToBounds = NO;            //contentView
self.contentView.superview.clipsToBounds = NO;  //scrollView

我使用的向后兼容解决方案是:

self.clipsToBounds = NO;
self.contentView.clipsToBounds = NO;
if ([self.contentView.superview isKindOfClass:[NSClassFromString(@"UITableViewCellScrollView") class]]) self.contentView.superview.clipsToBounds = NO;

请记住这是Hacky™,如果在iOS 8中视图层次结构再次发生变化,您可能会遇到麻烦。不幸的是,似乎Apple不希望我们将内容从UITableViewCells中溢出,所以AFAIK这是唯一可行的解​​决方案。

答案 1 :(得分:2)

以下将解决它:

cell.layer.masksToBounds = NO

然而,它可能会打破别的东西,例如细胞动画。

你遇到的问题是由于单元格不支持从边界中绘制内容这一事实(实际上,使用扩展超级视图范围的子视图总是一个hacky解决方案)。

最好的建议是重新设计并避免这种功能。

另一种解决方案可能是将相同的视图添加到上一个单元格的底部,或者直接将它们添加为UITableView的子视图。

答案 2 :(得分:2)

我不认为内容实际上是以masksToBounds意义修剪,而是视图被其他(不透明)单元格覆盖。您可以尝试通过更改UITableView的子视图的顺序(“z-Index”)来修复它,使用bringSubviewToFront:和类似的方法,只要出现单元格以确保最靠近底部的单元格屏幕边缘是所有细胞的最前面的视图。