如何从 UITableViewCell 呈现 UIView

Posted

技术标签:

【中文标题】如何从 UITableViewCell 呈现 UIView【英文标题】:How to present UIView from UITableViewCell 【发布时间】:2017-05-06 12:01:18 【问题描述】:

在我的应用程序中,我有一个 UITableViewCell,其中有一个按钮。

- (void)buttonPressed:(id)sender 
    UIView *test = [[UIView alloc] initWithFrame:CGRectMake(self.frame.origin.y+5, self.frame.origin.x+53, 200, 200)];
    test.backgroundColor = [UIColor redColor];
    test.layer.cornerRadius = 15.0f;
    test.layer.masksToBounds = YES;
    [self addSubview:test];

但是,此红色视图显示在节标题后面。以正确的方式从UITableViewCell 内部将其添加到视图中的最佳方法是什么?

【问题讨论】:

使用 UItableView 的 viewForHeaderInSection 方法。 【参考方案1】:

获取要添加的单元格,然后使用

[cell.contentView addSubview: test];

您可以通过将点转换为表格视图的坐标系并使用 UITableView 方法indexPathForRowAtPoint 从按钮的 frame.origin 获取单元格。该代码可能如下所示:

- (NSIndexPath *) indexPathForView: (UIView*) view;

  CGPoint viewCenter = CGPointMake(
                                       CGRectGetMidX(view.bounds),
                                       CGRectGetMidY(view.bounds)
                                       );
  viewCenter = [self.tableView convertPoint: viewCenter fromView: view];
  NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: viewCenter];
  return indexPath;

或者更好的是,作为 UITableView 的扩展:

@implementation UITableView (indexPathForCellContainingView)

- (NSIndexPath *) indexPathForCellContainingView: (UIView *) view;

  //get the view's center point (which will be in it's parent view's coordinate system
  //And convert it to the table view's coorindate system
  CGPoint viewCenter = [self convertPoint: view.center fromView: view.superview];

  //Ask the table view which cell's index path contains that point.
  return [self indexPathForRowAtPoint: viewCenter];


@end

【讨论】:

【参考方案2】:

你可以试试这个:

- (void)buttonPressed:(id)sender 
    UIView *test = [[UIView alloc] initWithFrame:CGRectMake(5, 53, 200, 200)];
    test.backgroundColor = [UIColor redColor];
    test.layer.cornerRadius = 15.0f;
    test.layer.masksToBounds = YES;
    [self.contentView addSubview:test];

【讨论】:

如果您解释为什么您的建议会有所帮助,这个答案会更好。 在你的代码中 UIView *test = [[UIView alloc] initWithFrame:CGRectMake(self.frame.origin.y+5, self.frame.origin.x+53, 200, 200)];表示如果单元格位于其超级视图的 (0,0) 坐标中,则测试视图将具有坐标 (5,53)。但是如果单元格坐标是 (0,50) 那么 test 将有一个坐标 (55, 53)。 视图坐标是相对于其超级视图计算的。

以上是关于如何从 UITableViewCell 呈现 UIView的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UITableViewCell 获取当前位置(帧)?

从 UITableViewCell 呈现 UIViewController:addChildViewController 无法识别的选择器发送到实例

如何从 UI 视图控制器呈现选项卡栏控制器

如何在 swift 中创建新闻提要 UI

在呈现的视图控制器上的 UITableViewCell 中呈现 UIAlertController

UITableViewCell 在首次加载时无法正确呈现