【发布时间】:2011-04-06 20:53:40
【问题描述】:
在我的项目的主屏幕上,我有一个 TableView,顶部有一个导航栏,底部有一个工具栏。问题是,工具栏中的一个按钮需要从工具栏中向上滑动 UISegmentedControl。我已经在自定义 UIView 中实现了这个控件,但是,如果我只是将它添加到我的 rootviewcontroller.view 并将其滑动到位,它将与表格的其余部分一起滚动,这是不希望的(我希望它显示为工具栏的扩展)。
那么,我该怎么办?在 rootViewController 我做
self.filterView = [[FilterView alloc] initWithTarget:self.tableView reloadDataSelector:@selector(reloadData)];
[[self.view superview] addSubview:self.filterView];
[[self.view superview] bringSubviewToFront:self.filterView];
我将控制视图 (self.filterView) 添加到我的视图的超级视图中,并将其置于 tableview 的滚动上方。
但是,现在问题来了。一旦 tableView 离开视图(我在 navigationController 上推送另一个视图,或者特别是如果应用程序进入后台),这个视图就会重新布局,我的控制器视图就会移动到 (0,0)。
问题是,就在 navigationController 上推送新视图而言,我可以通过在我的 rootViewController 中的 viewWillAppear 和 viewWillDisappear 中重新定位它来控制它。但是当应用程序进入后台并返回时,这些函数不会被调用。
那么,有什么办法
(a)防止我的控制器视图被移动
(b)检测它何时被无意移动
(c)从 rootViewController 检测来自后台的进出
???
我知道我可以在 appDelegate 中检测到后台的传递,但我不喜欢在那里处理布局问题。
谢谢!!
编辑:
添加一些信息,如果我这样做了
NSLog(@"%@",[self.view superview]);
//I get <UIViewControllerWrapperView: 0x61589d0; frame = (0 64; 320 372); autoresize = W+H; layer = <CALayer: 0x615d9c0>>
EDIT2:我想我可以先创建自己的包装 UIView,在其中加载我当前的所有视图层次结构,然后将控制器视图放在那里。你们认为这值得麻烦吗?没有更简单的方法吗?
EDIT3: 最终选择将我的 rootViewController 从 UITableViewController 更改为 UIViewController,并以编程方式添加 tableView,如下 Phil 建议的那样。我现在可以随心所欲地控制我的主视图,因为我将我的 segmentedControl 视图放在那里,我可以控制它的位置,而不是以前,当我把它放在 UIViewControllerWrapperView 中时,我不太确定谁控制它或者它对它的子视图做了什么。
所以,出于好奇,有谁知道为什么包装我的 UITableViewController 视图的 UIViewControllerWrapperView 将我的 UIView 从后台移回??
为了澄清,设置是这样的:
UIViewControllerWrapperView
|
|UITableView
|Custom SegmentedControl UIView
【问题讨论】:
-
什么是 self.view superview 在这种情况下?
-
@Matt 老实说,我并不完全确定,因为这是一种实验。但是,如果我这样做,我会得到
<UIViewControllerWrapperView: 0x61589d0; frame = (0 64; 320 372); autoresize = W+H; layer = <CALayer: 0x615d9c0>>NSLog(@"%@", [self.view superview]);也许我应该从一开始就将我的 ViewController 加载到我自己的容器 UIView 中并在那里添加 controllerView?
标签: iphone objective-c ios uiview uinavigationcontroller