设置 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
标题视图。它只是位于表格顶部的视图,恰好被称为headerView
。 headerView
和 tableView
都是跨越可用窗口的主 UIView
的子视图。
【问题讨论】:
【参考方案1】:您可以尝试重载 layoutSubviews 方法。在里面你应该为你的 headerView 使用 setFrame 方法来定义所有视图元素的位置。
【讨论】:
为什么我需要覆盖layoutSubviews
?这不是禁止的吗?
该方法在UIView调用- (void)layoutIfNeeded
时调用,根据某些事件期间重新定义子视图位置。例如,我使用这种方法在不同框架的 UITableView 单元格中放置标准 textLabel 并在单元格内添加额外的 UITableView ......但是我认为如果在 tableView reloadData 之后使用 heightForHeaderInSection 方法,您可以获得相同的效果。
我应该更清楚地说明...headerView
存在于tableView
之外。它只是一个普通的旧UIControl
,恰好被称为headerView
。 tableView 没有定义headerForSection:
。这真的只是一个关于UIControl
的问题。
哦,那是误会。不幸的是,我对你的问题无话可说,因为我以前没有遇到过这样的问题。以上是关于设置 UIControl 的框架会更改视图边界,但不会更改它可以接收触摸的位置的主要内容,如果未能解决你的问题,请参考以下文章