UIScrollView 常见于不同的 viewControllers

Posted

技术标签:

【中文标题】UIScrollView 常见于不同的 viewControllers【英文标题】:UIScrollView common for different viewControllers 【发布时间】:2013-06-13 14:30:32 【问题描述】:

我必须有一个带有 9 个选项卡的 tabBar,所以我添加了一个带有 9 个按钮的 Srollview(MHScrollViewController) 而不是 tabBar。单击每个按钮时,我将 viewController 作为子视图添加到 Srollview。

在 AppDelegate 中,有以下代码:

MHScrollViewController *scrollViewController = [[MHScrollViewController alloc] initWithNibName:@"MHScrollView" bundle:nil];
scrollViewController.managedObjectContext = [self managedObjectContext];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:scrollViewController];
self.window.rootViewController = self.navigationController;

现在说一个选项卡(按钮),我已将 MHBikesViewController 添加到 MHScrollViewController 作为子视图。在 MHScrollViewController 中,我这样做了

bikesViewController = [[MHBikesViewController alloc] initWithNibName:@"MHBikesView" bundle:nil];
bikesViewController.managedObjectContext = self.managedObjectContext;
bikesViewController.view.frame = baseViewiPhone.frame;
CGRect theFrame = bikesViewController.view.frame;
theFrame.origin.y = 0;
bikesViewController.view.frame = theFrame;
bikesViewController.navigationController = self.navigationController;
[baseViewiPhone addSubview:bikesViewController.view];

现在,我在 MHBikesViewController 页面上有两个按钮。单击时,我想在 MHBikesViewController 上推送一个新的视图控制器。我可以推送,但滚动视图隐藏在此视图控制器下。

【问题讨论】:

【参考方案1】:

UINavigationController 无论如何都会用新推送的控制器覆盖其所有内容,因此您需要使用导航控制器之外的按钮来获取滚动视图。

【讨论】:

【参考方案2】:

在设计 UI 时要注意 UIViewController 父/子关系和责任。

控制器拥有一个主 UIView 及其所有子视图。 当将此 viewController 的视图添加到更复杂的视图层次结构中时,此控制器应该是控制此“包含”UI 的 viewController 的子级。

问问自己:你的遏制模型是什么?

9 个标签和一些占据屏幕其余部分的相关内容?

那么在你的情况下,MHScrollViewController 是爸爸,它拥有可滚动的标签和当前的 viewController 主视图。它不应该是UINavigationController(可以是持有你的MHBikesViewController 的自己的父“内容”)

父母->您的情况下的儿童收容措施:

MHScrollViewController -> UINavigationController -> MHBikesViewController

添加和删除子 viewController 是父级的责任。

//(somewhere in MHScrollViewController.m or .h )
@property (nonatomic, strong) UIViewController *newContentController;
@property (nonatomic, weak) UIScrollView *tabsScrollView;

// method for pushing any 'tab' controller
// might be your UINavigationController
- (void)displayTabController:(UIViewController *)vc

    // remove previous controller
    if (self.contentController) 
        [self.contentController.view removeFromSuperview];
        [self.contentController removeFromParentViewController];
     


    //push the new controller, maintaining child/parent relationship
    self.contentController = newContentController;

    [self.view addSubview:contentController.view];
    [self.contentController didMoveToParentViewController:self];

    // set frame  of contentController so that it stays above scrollView
    self.contentController.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height - self.tabsScrollView.bounds.size.height)


【讨论】:

【参考方案3】:

您可以按标准方式拥有一个带有 9 个选项卡的选项卡栏。它将自动创建一个“更多”选项卡。它可能不像你想要的那样光滑。

【讨论】:

以上是关于UIScrollView 常见于不同的 viewControllers的主要内容,如果未能解决你的问题,请参考以下文章

问题解决:Python中取消科学计数法,常见于Numpy|Pandas

004 执行计划的id

004 执行计划的id

性能优化--面试官问缓冲与缓存有什么区别?

如何使在Swift中使用UIScrollView进行滚动和缩放

06.网页布局