将单个 iOS 屏幕分解为可重用的组件视图

Posted

技术标签:

【中文标题】将单个 iOS 屏幕分解为可重用的组件视图【英文标题】:Breaking a single iOS screen up into re-usable component views 【发布时间】:2018-01-09 07:46:32 【问题描述】:

学习 ios 并尝试找出跨多个屏幕共享“组件”的最佳方式。我正在使用程序化布局并且没有情节提要,因此这可能会使这比应有的更加困难。

我有一个 UIImageView 油漆调色板选择器,它有一个对应的选择历史 UICollectionView 以前选择的颜色,用于许多不同的屏幕。这些是数据源驱动的,还支持一些 UI 事件,如选择、滚动、拖动等。所有这些交互都会冒泡到视图控制器,以便与屏幕上的其他所有内容一起处理。这使得重用变得困难,因为该组件不是自包含的,而是分散在一些视图中,UI 处理全部流经控制器。我将如何着手让这个东西自成一体,这样我就可以将它放到多个屏幕中而不需要复制代码?

【问题讨论】:

【参考方案1】:

如果没有看到您的确切代码,我建议您将控制器嵌入为另一个视图控制器的子控制器。

来自documentation的示例:

- (void) displayContentController: (UIViewController*) content 
   [self addChildViewController:content];
   content.view.frame = [self frameForContentController];
   [self.view addSubview:self.currentClientView];
   [content didMoveToParentViewController:self];

这是一种 Swift 方法,您可以将其放入您的代码库。它扩展了UIViewController,所以在你的视图控制器的viewDidLoad中,你可以调用embed(myFancyNewChildController, withFrame: view.frame)

extension UIViewController 
    func embed(childViewController: UIViewController, withFrame frame: CGRect) 
        addChildViewController(childViewController)
        childViewController.view.frame = frame
        view.addSubview(childViewController.view)
        childViewController.didMove(toParentViewController: self)
    

通过这种方式,您可以将您的视图控制器嵌入到您选择的另一个视图控制器中,并在其他地方重用它。换句话说,所有这些移动部件都被封装到一个完整的控制器中,您可以在其他地方重复使用。如上例,您也可以相应地调整子控制器的框架。

为简单起见,您可以将其视为view.addSubview(mySubview) 方法,但带有一个完整的视图控制器。

【讨论】:

这很好用。我唯一的问题是是否有必要使用框架调整子控制器的大小?我试图通过在子控制器视图上设置自动布局约束来使其工作。基本上就像paletteController.view.topAnchor.constraint(equalTo: coloringPageScrollView.bottomAnchor, constant: 10).isActive = true 我可以理解必须使用框架以便控制器“绑定”到页面上的某个区域,但似乎自动布局将是更现代的方法? @DarkCastle 是的,使用自动布局通常是首选/最现代的方法。我可能建议不要使用它的唯一一次是在 tableView/collectionView 单元格内布局视图(即滚动的内容)。它的性能可能不如手动框架设置(请参阅此处:***.com/questions/16949248/…)。

以上是关于将单个 iOS 屏幕分解为可重用的组件视图的主要内容,如果未能解决你的问题,请参考以下文章

Vue @click 计数器并为可重用组件更新背景 2 分钟

如何使用自动布局在 Swift 中为可重用的 UIView 设置约束?

是否有可重用的标准 iOS“推送通知视图”?

Flutter 可重用组件

monotouch - 可重用的 iOS 自定义视图

我可以在屏幕上的多个位置重用组件的单个实例吗?