滚动时触摸UITableView背景(复活节彩蛋的种类)

时间:2014-10-19 19:57:54

标签: objective-c uitableview

我需要在表格视图本身的背景中,在表格视图的底部而不是单元格中执行隐藏按钮。

我在游戏中看到了类似的东西"我的水在哪里",如果你滚出界限,你可以找到一个隐藏的按钮。

首先,我创建了一个简单的按钮,并放置在表视图的底部

self.tableView.backgroundColor = [UIColor purpleColor]; //just to see better
UIButton *venom = [[UIButton alloc] initWithFrame:CGRectMake(50.0, self.tableView.contentSize.height+80.0, 100.0, 40.0)];
venom.backgroundColor = [UIColor redColor];
[venom addTarget:self action:@selector(venomAction) forControlEvents:UIControlEventTouchDown];
[self.tableView addSubview:venom];

由于self.tableView.contentSize.height+80.0,我需要滚出表格视图的边界才能看到按钮,如下所示:

enter image description here

结果是正确的,我希望这有点隐藏,但问题是,我无法点击按钮,看到按钮,我需要滚动,我不能多点触控。

任何人都可以帮助我吗?或指向正确的方向

1 个答案:

答案 0 :(得分:0)

我将按钮设置为tableView的子视图,而不是tableView上方的兄弟视图。
例如,您的代码可能如下所示

- (void)viewDidLoad {
  [super viewDidLoad];

  // Just creating a simple UITableView
  UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
  tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  tableView.dataSource = self;
  tableView.delegate = self;
  self.tableView = tableView;
  [self.view addSubview:tableView];

  // Creating the Easter Egg Button
  UIButton *easterEggButton = [UIButton buttonWithType:UIButtonTypeSystem];
  [easterEggButton setTitle:@"Easter Egg Button" forState:UIControlStateNormal];
  [easterEggButton addTarget:self
                      action:@selector(easterEggButtonPressed)
            forControlEvents:UIControlEventTouchUpInside];
  self.easterEggButton = easterEggButton;

  // NOTE that we add the Easter Egg Button to self.view over the Table View, not into Table View
  [self.view addSubview:easterEggButton];
}

因此我们将按钮放在tableView上。这使得它不会干扰tableView的gestureRecognizer 现在你需要一些代码来调整按钮的框架,使其放在tableView的最后一个单元格下面的某个位置。它可能看起来像这样:

- (void)updateButtonFrame {
  UIButton *button = self.easterEggButton;

  // Just the easiest way calculate the width and height of the button depending on it's content
  [button sizeToFit];
  CGRect frame = button.bounds;

  // Now, we want to place the button under all the cells
  frame.origin.y = self.tableView.contentSize.height;
  frame.origin.y += 60.0f; // add some padding to place it even lower

  /* We have calculated button's frame in tableView's coordinate space, so we need to convert it to
   * button superview's coordinate space. */
  frame = [self.tableView convertRect:frame toView:button.superview];

  // And finally apply the frame to the button
  button.frame = frame;
}

当然,您需要在适当的时刻调用此布局方法,即每当tableView重新加载数据时(因为contentSize可能会更改),以及每当tableView滚动时。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
  /* Button resides in self.view and is unaware of Table View scrolling, so we need to update
   * it's frame whenever Table View's content offset changes */
  [self updateButtonFrame];
}

如果tableView的单元格高度取决于屏幕方向等,您也可以称之为viewDidLayoutSubviews是安全的。

- (void)viewDidLayoutSubviews {
  [super viewDidLayoutSubviews];
  // It's safe to recalculate button's frame whenever self.view layout updates
  [self updateButtonFrame];
}

您可以查看此示例实现 https://gist.github.com/bartekchlebek/429906e05fcbd976291d