设置 UIControl 的框架会更改视图边界,但不会更改它可以接收触摸的位置

Posted

技术标签:

【中文标题】设置 UIControl 的框架会更改视图边界,但不会更改它可以接收触摸的位置【英文标题】:Setting UIControl's frame changes view bounds but not where it can receive touches 【发布时间】:2012-03-01 20:06:47 【问题描述】:

我有一个headerView,按下它可以展开和折叠。它的默认状态是折叠。

我使用下面的代码来扩展headerView

if (!self.headerViewIsExpanded) 
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [self.collapsedHeaderView removeFromSuperview];
    self.headerView.frame = self.expandedHeaderView.frame;
    [self.headerView addSubview:self.expandedHeaderView];

    self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y + offset, self.tableView.frame.size.width, self.tableView.frame.size.height - offset);

    [UIView commitAnimations];
    self.headerViewIsExpanded = YES;

它正确地扩展了视图框架并缩小了 tableView 框架。但是,它无法扩展原始UIControl的触摸接收区域,所以我只能通过按原始框架所在的位置来折叠它。

我该如何解决这个问题?

编辑:或者,我会接受一个很好地解释为什么我不能解决问题的答案,或者至少不能安全地解决它。

编辑 1:更清楚地说,headerView 不是 tableView 标题视图。它只是位于表格顶部的视图,恰好被称为headerViewheaderViewtableView 都是跨越可用窗口的主 UIView 的子视图。

【问题讨论】:

【参考方案1】:

您可以尝试重载 layoutSubviews 方法。在里面你应该为你的 headerView 使用 setFrame 方法来定义所有视图元素的位置。

【讨论】:

为什么我需要覆盖layoutSubviews?这不是禁止的吗? 该方法在UIView调用- (void)layoutIfNeeded时调用,根据某些事件期间重新定义子视图位置。例如,我使用这种方法在不同框架的 UITableView 单元格中放置标准 textLabel 并在单元格内添加额外的 UITableView ......但是我认为如果在 tableView reloadData 之后使用 heightForHeaderInSection 方法,您可以获得相同的效果。 我应该更清楚地说明...headerView 存在于tableView 之外。它只是一个普通的旧UIControl,恰好被称为headerView。 tableView 没有定义headerForSection:。这真的只是一个关于UIControl的问题。 哦,那是误会。不幸的是,我对你的问题无话可说,因为我以前没有遇到过这样的问题。

以上是关于设置 UIControl 的框架会更改视图边界,但不会更改它可以接收触摸的位置的主要内容,如果未能解决你的问题,请参考以下文章

设置视图的边界会改变框架的坐标,为啥?

UIView 框架、边界和中心

为啥使用两种类型(边界/框架)来描述视图而不是一种?

如何修改 UIControl 框架

如何保持 UIscrollview 框架固定但动态范围

突出显示时如何更改 UIControl 的大小?