Swift配置视图中的VIPER设计模式

时间:2018-08-17 21:05:30

标签: ios swift view configuration viper

我最近迁移到VIPER,在使用这种类型的体系结构时遇到了这样的问题:

例如,我在设计长(2000pt高)UI时,使用了超过50个界面元素,例如标签,按钮,视图,集合等,我需要在其中添加圆角和阴影。

我应该在哪里配置外观?是在View中显示,还是在Presenter中显示?

到目前为止,我已经扩展了UIView,它是创建阴影的方法。

现在,我在“查看”模块中拥有的是:

 override func viewDidLayoutSubviews() {
    doctorsNearCollection.backgroundColor = UIColor(white: 1, alpha: 0)
    newsMayBeInterestedCollection.backgroundColor = UIColor(white: 1, alpha: 0)
    recentSavedNewsCollection.backgroundColor = UIColor(white: 1, alpha: 0)
    setupCharts()

    scheduleMetting.dropShadow()
    scheduleMetting.layer.cornerRadius = 5

    monthlyPerformaceBackground.dropShadow()
    monthlyPerformaceBackground.layer.cornerRadius = 5

    firstMeeting.dropShadow()
    firstMeeting.layer.cornerRadius = 5
    firstMeetingNumber.layer.cornerRadius = self.firstMeetingNumber.frame.size.width / 2

    secondMeeting.dropShadow()
    secondMeeting.layer.cornerRadius = 5
    secondMeetingNumber.layer.cornerRadius = self.secondMeetingNumber.frame.size.width / 2

    thirdMeeting.dropShadow()
    thirdMeeting.layer.cornerRadius = 5
    thirdMeetingNumber.layer.cornerRadius = self.thirdMeetingNumber.frame.size.width / 2

    seeAllMeetings.dropShadow()
    seeAllMeetings.layer.cornerRadius = 5

    searchForDoctors.dropShadow()
    searchForDoctors.layer.cornerRadius = 5

    seeAllSavedNews.dropShadow()
    seeAllSavedNews.layer.cornerRadius = 5
}

这是一个好习惯吗? 我对设置视图外观感兴趣,因为对其他方法而言,这似乎或多或少对我来说很清楚。 预先感谢。

1 个答案:

答案 0 :(得分:1)

  • https://TheSwiftDev.com/the-ultimate-viper-architecture-tutorial 中所述,UI 详细信息和构造必须隔离在查看区中,绝不能出现在演示者区中,因为查看区将所有 UI 详细信息/概念作为内部事务处理/隔离,而演示者区处理/隔离所有纯应用域的详细信息/概念都属于内部事务。
  • 本着永不言败的精神,UI 元素的“圆角和阴影”唯一出现在演示者区域的情况是应用的 app-domain 本身是所有关于成为 UI 生成器或 UI 编辑器或 UI 设计器工具,其中一些下游(应用程序的)UI(即,不是这个 应用程序的 UI)是这个应用程序的应用程序域。因此,除非您的应用是用于 UI 开发的 UI 设计环境,否则 UI 内容永远不会超出视图区域(即使在例外情况下,它是其他应用的 UI 内容,而不是当前应用的 UI 内容)。
  • 仅仅因为一些以 UI 为中心的代码需要被分解为视图之间的共性,这并不意味着它可以通过 VIPER 处理闯入其他 4 个区域 {interactor、presenter、entities、router} 作为一种方式表达共性。视区本身可以有层。一个这样的层是两个或更多视图之间的共性基础设施库。 (另一个这样的层可能是一个外观,它将以 UI 为中心的事件转换为以应用程序域为中心的事件,这些事件跨区域交给演示者来处理,不是作为一个以 UI 为中心的事件,而是作为一个独立于它如何发生的应用程序域事件在 UI 中表示。)如果某个函数、方法、过程、子例程或协程需要分解为视图区域内多个视图之间的共性,则将分解出的函数、方法、过程、子例程或协程保留在库中在视图区域内,而不是任何其他 IPER 区域。