【问题标题】:Putting a custom view into a UITableView将自定义视图放入 UITableView
【发布时间】:2012-01-30 16:52:08
【问题描述】:

我有一个常规样式的 UITableView——它有一个白色背景和灰色水平线来分隔行。

我有另一个自定义 UIView,它只是一个 100x100 的矩形,用 redColor 填充。

我怎样才能将后者放入前者,使它出现在 水平线上,但在我滚动表格视图时仍然是表格视图的“一部分”周围,​​红色的视图随之滚动?事实上,我应该也可以将手指放在红色区域并滚动表格视图。

再一次,如果红色视图与一些水平线重叠,它应该出现在这些线上。可悲的是,当我只是将红色视图作为子视图添加到表格视图时,水平线会越过红色视图;见this screenshot

如何做到这一点?

【问题讨论】:

  • 你想让红色视图隐藏线条内容吗????

标签: objective-c ios cocoa-touch


【解决方案1】:

处理红色方块的堆叠顺序的正确位置是在layoutSubviews 方法中。表格视图在添加或删除子视图(以及其他时间)时会向自身发送layoutSubviews

您需要创建一个引用红色方块的UITableView 的子类:

@interface MyTableView : UITableView

@property (weak, readonly) IBOutlet UIView *redSquare;

@end

你可以用任何你想要的方式初始化redSquare。我只是将它与表格视图一起放入我的笔尖,并将其移动到awakeFromNib中的表格视图的子视图:

@implementation MyTableView

@synthesize redSquare = _redSquare;

- (void)awakeFromNib {
    [self addSubview:self.redSquare];
}

无论如何,要真正确保红色方块始终位于表格单元格和网格线的顶部,请像这样覆盖layoutSubviews

- (void)layoutSubviews {
    [super layoutSubviews];
    [self bringSubviewToFront:self.redSquare];
}

【讨论】:

  • 没错。每当添加或删除单元格时,UITableView 都会重新布局。单元格实际上只是表格的子视图,可以按任何顺序排列。
  • 如果我不使用 XIB 文件,你能告诉我你是怎么做你提到的吗?如何在不使用 XIB 的情况下指定自定义子类?我以编程方式初始化我的UITableViewController 子类,我所做的一切都只在代码中。
  • 您的代码在某处显示[[UITableView alloc] init...]。你需要让它说[[MyTableView alloc] init...]并设置它的redSquare属性。
  • 或者如果您只是使用UITableViewController 的默认表格视图,请创建您自己的MyTableView 实例并将其分配给控制器的viewtableView 属性。跨度>
  • 人们一直在说“永远不要继承 UITableView”,以及多年来他们如何在不这样做的情况下过得很好。我不知道如何在没有子类化的情况下获取 layoutSubviews 调用。子类化结果很容易,所以我不知道发生了什么。
【解决方案2】:

编辑

如果您尝试将视图 a 添加到线条上方(隐藏线条),请尝试使用 – bringSubviewToFront: 将其带到表格视图的前面。

[self.tableView bringSubviewToFront:redView];

否则

将视图添加到self.tableView.tableHeaderView,这会将其放置在表格视图上方,并随着表格视图滚动。

UIView *redView = [[UIView alloc]init];
  redView.frame = //set the frame 
  redView.backgroundColor = [UIColor redColor];
  self.tableView.tableHeaderView = redView;

祝你好运

【讨论】:

  • bringSubviewToFront: 成功了,谢谢。我没有必要像这里的其他人建议的那样多次调用它(在scrollViewDidScroll:layoutSubviews 等地方)。我刚刚在viewWillAppear:(在UITableViewController 子类中)初始化了我的红色视图,然后在viewDidAppear 中调用了bringSubviewToFront:(我将红色视图放在一个实例变量中)。这对我很有用。
【解决方案3】:

只需将此视图作为子视图添加到 UITableView:

[tableView addSubview:myRedView];

请参阅userInteractionEnabled 属性以处理交互和滚动。

【讨论】:

  • 这样做的问题是表格视图的水平线与红色视图重叠。红色视图应超过水平线。还有什么想法吗?
  • @Enchilada,不,红色视图位于 UITableView 的顶部。我刚刚从头开始创建新项目并在 viewWillAppear 中编写了 3 行代码,请在此处查看结果 - img585.imageshack.us/img585/3584/screenshot20120131at112.png
  • 奇怪,这不是这里发生的事情。这是我的截图:i.stack.imgur.com/Ooaf0.png 任何想法为什么我们的结果不同?
  • 没有想法(。我无法在我的项目中重现此错误。真的我不知道您为什么会遇到这种奇怪的情况。
【解决方案4】:

使您的视图成为UITableView 的任何普通子视图的子视图:页眉、页脚或任何UITableViewCell

【讨论】:

  • 这并不能保证它在分隔线的前面。事实上,这甚至不能保证它在其容器视图之外可见
【解决方案5】:

我认为您所描述的最好使用UITableViewCell 甚至标题的子视图来实现。单元格具有滚动表格的固有能力,并且可以按照您喜欢的方式进行自定义。它本质上是一个视图。

例如,在您的情况下,您可能希望红色框默认显示在表格顶部。您可以将第一个单元格设为“红框”单元格,然后将红框插入单元格的内容视图中。

【讨论】:

    【解决方案6】:

    所以,您的问题基本上是,UITableView 的 UITableViewCells 是作为子视图动态添加的,您无法控制它们是添加在视图前面还是后面。

    因此,为了让您的视图保持在前面,您需要在每次添加单元格时将其放回原处,这会在 UITableView 滚动时发生。

    我建议您尝试将自定义视图添加为子视图,然后像这样覆盖 -scrollViewDidScroll

    - (void)scrollViewDidScroll {
        [super scrollViewDidScroll];
        // myCustomView is your custom view referenced in an IVar
        [self.tableView bringSubviewToFront:myCustomView];
    }
    

    【讨论】:

      【解决方案7】:

      使用这些行编辑您的 viewWillAppear 委托

      UIView *redView=[[UIView alloc]initWithFrame:CGRectMake(30,30, 100, 100)];
      redView.backgroundColor=[UIColor redColor];
      [self.tableView addSubview:redView];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多