无法在iOS7上看到动态子视图(在iOS6上工作)

4
我有一个自定义的TableViewCell。在这个cell中,我在两侧添加了两个交叉图标(使用Unicode)。当用户滑动单元格时,它将在侧面显示交叉图标。
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // add a cross
        _crossLabel = [self createCueLabel];
        _crossLabel.text = @"\u274C";
        _crossLabel.textAlignment = NSTextAlignmentLeft;
        // none of the following code works
        [self insertSubview:_crossLabel aboveSubview:self];
        [self insertSubview:_crossLabel belowSubview:self];
        [self addSubview:_crossLabel];

        _crossLabel2 = [self createCueLabel];
        _crossLabel2.text = @"\u274C";
        _crossLabel2.textAlignment = NSTextAlignmentLeft;
        [self addSubview:_crossLabel2];

        // add a pan recognizer
        UIGestureRecognizer* recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
        recognizer.delegate = self;
        [self addGestureRecognizer:recognizer];
    }
    return self;
}

我使用了上面的代码来实现这个功能。_crossLabel确实被添加到了自定义的TableView单元格中。
我使用Reveal App检查我的iOS应用程序的布局enter image description here。我可以看到_crossLabel已经添加到我的单元格中。但是在我的iOS 7模拟器中看不到交叉图标。我尝试了不同的方法来添加子视图,但是没有一个方法起作用。

enter image description here

但是它在iOS6上运行得非常完美,而且当我在Reveal App中检查时,布局与iOS 7完全相同。谢谢你的帮助。

我还没有找到我的应用程序中相同崩溃的原因,但感谢您提到Reveal。我以前没有遇到过它,它很棒! - Richard K.
2个回答

11
请确保您将控件添加到单元格的contentView上,如[self.contentView addSubView:_crossLabel2];,而不是直接添加到单元格本身。 在使用Reveal检查iOS7时,您会发现UITableViewCell中UIKit已经添加了/滑入了一个UITableViewCellScrollView视图,因此在进行insertSubview:belowSubview调用时要小心。 另外,请注意您在Reveal的OutlineView中看到的“LocationCell”视图被置灰,表示它被隐藏了。 编辑 只是为了以后的参考:
在iOS 7中,新的UITableViewCellScrollView设置了其'clipToBounds'属性。这是一个hack方法,但如果您执行[self.contentView.superview setClipsToBounds:NO],则superview在iOS7上是UITableViewCellScrollView,在iOS6上是单元格本身。

谢谢,我确实尝试了self.contentView并再次尝试,但它不起作用。为什么“LocationCell”视图变灰是因为我从表格中删除了最后一个单元格,Reveal应用程序捕获了动画之前的最后一个布局。除了最后一个单元格外,上面的那个仍然可见。但是当我滑动它时,它也不显示十字图标。 - Jake Lin
当您检查标签时,它们使用哪个框架?无论如何,您应始终向单元格的contentView添加内容。从Reveal的屏幕截图可以看出,标签位于UITableViewCellContentView下方。 - theraven
我将它们添加到contentView,但仍然看不到它们,后来我发现如果我将它们添加到单元格可见边界内,那些交叉图标就可以显示出来,如果我将它们添加到单元格的边缘,它们将会被截断。所以我认为问题并不是addSubView方法,问题可能是iOS 7只会从x(0 ~ 320)渲染单元格。 - Jake Lin
一个标签的框架是 x=330.0,y=0.0,宽度=50.0,高度=44.0。谢谢。 - Jake Lin
4
好的,iOS 7 中新的 UITableViewCellScrollView 设置了它的 'clipToBounds' 属性。使用 Reveal 选择单元格滚动视图,在检查器中取消勾选 clipsToBounds。这是一个hack,但如果你在代码中使用 [self.contentView.superview setClipsToBounds:NO] 应该可以解决问题。在 iOS 6 中,contentview 的 superview 是单元格本身,在 iOS 7 中,它是单元格的 scrollView。 - theraven

-1

无需添加单元格内容视图。在iOS7中,您可以直接访问子视图。

[[cell.subviews lastObject] subviews]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接