将自定义视图放入UITableView
我有一个常规样式的UITableView – 具有白色背景和灰色水平线来分隔行的那个。
我有另一个自定义UIView,只是一个100X100矩形填充redColor。
我怎样才能把后者放到前者中,使其出现在水平线上,但仍然是桌面视图的“部分”,因为当我滚动桌面视图时,红色视图会随之滚动? 事实上,我也应该能够把手指放在红色区域,并滚动表格视图。
再一次,如果红色视图重叠一些水平线,它应该出现在线上。 不幸的是,当我只是将红色的视图作为子视图添加到表视图中时,水平线覆盖了红色视图; 看这个截图 。
这怎么能做到呢?
编辑
如果您正在尝试– bringSubviewToFront:
上添加视图(隐藏行),请尝试使用– 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;
祝你好运
处理红色方块堆叠顺序的正确位置是layoutSubviews
方法。 表视图发送自身layoutSubviews
任何时候它添加或删除子视图(和其他时间)。
您需要创build一个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作为子视图:
[tableView addSubview:myRedView];
请参阅userInteractionEnabled属性以处理交互和滚动。
使你的视图的UITableView
的任何正常的子视图的子视图:头,页脚或任何UITableViewCell
。
我认为你所描述的最好使用UITableViewCell
甚至是头部的子视图来实现。 单元格具有滚动表格的固有能力,并且可以按照您喜欢的方式自定义。 这基本上是一个观点。
例如,在你的情况下,你可能会希望红色框默认出现在表格的顶部。 你可以将第一个单元格设置为“红色方块”单元格,在那里你可以将红色方块插入到单元格的内容视图中。
所以,你的问题基本上是,UITableView的UITableViewCells被dynamic地添加为Subviews,你无法控制它们被添加到视图的前面还是后面。
所以为了保持你的观点在前面,你需要在每次添加单元格的时候把它放回原处,这在UITableView滚动时发生。
我build议你尝试添加自定义视图作为子视图,然后重写-scrollViewDidScroll
像这样:
- (void)scrollViewDidScroll { [super scrollViewDidScroll]; // myCustomView is your custom view referenced in an IVar [self.tableView bringSubviewToFront:myCustomView]; }
用这些行编辑你的viewWillAppear委托
UIView *redView=[[UIView alloc]initWithFrame:CGRectMake(30,30, 100, 100)]; redView.backgroundColor=[UIColor redColor]; [self.tableView addSubview:redView];