将单个 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 分钟