【问题标题】:What is the need of subclassing UIView子类化 UIView 需要什么
【发布时间】:2014-04-23 18:02:12
【问题描述】:

我有一个问题,当我可以在任何视图控制器中放置尽可能多的 UIViews 并且可以使用 IBOutlet 访问它们时,为什么要创建一个派生自 UIView 的类

在子类化UIView 之后我们是否有任何特殊功能。 可能不是一个有效的问题,但我真的很想知道答案。

任何帮助将不胜感激。

提前致谢。 示例:

@Interface CustomView: UIView
{

}

【问题讨论】:

    标签: ios iphone objective-c ipad uiview


    【解决方案1】:

    大多数情况下,您将 UIView 或任何 UIComponent 子类化以进行自定义。当您继承子类时,您可以覆盖 drawRect 方法并进行自己的自定义。

    请参阅子类化 UIView here 的最佳实践。

    【讨论】:

    【解决方案2】:

    这完全取决于!如果我想在视图上绘制一些自定义形状怎么办?我可以继承一个 UIView 并使用drawRect: 做任何我想要的然后使用它。因此,原因很多,但实际上取决于您的愿望。

    进一步支持。参考以下链接:

    https://softwareengineering.stackexchange.com/questions/209576/what-are-the-reasons-to-create-uiview-subclass

    【讨论】:

    • 你能给我举个例子吗?
    【解决方案3】:

    只有当你需要添加一些额外的属性、行为时才需要子类,比如视图应该有一些光泽效果、圆角等。

    但是,从 UIView 或任何其他 Cocoa 类(基础或 UIKit 或任何其他工具包)中,它们为您提供了大部分必需的通用功能,但有时根据您的要求,您需要添加一些额外的东西。为此,您通过

    扩展类
    1. 子类化或继承。

    2. 类扩展。

    3. 类别。

    【讨论】:

      【解决方案4】:

      自定义视图更易于重用。您可以在视图内封装一些逻辑(例如绘图逻辑),然后重用此视图。

      在我当前的项目中,书页显示在几个地方。所以将页面展示/绘图封装在一个 UIView 中是非常方便的。

      【讨论】:

        【解决方案5】:

        有几个用例可以应用于UIView继承,比如

        1. 实现自定义控件
        2. 使用实现特定功能的方法扩展 UIView(尽管也可以通过使用 category 来完成,尽管它以不同的方式工作并且通常适用于不同的用例)
        3. 将相关视图组合到一个视图中,以提高使用率、公开干净的界面并在内部处理视图管理
        4. 创建要在其他UIView 继承的类中重用的基本视图,而不必在每个子类上实现自定义外观和/或行为

        下面是一些例子

        自定义控件 - 您想实现一个 4 状态平面按钮,每次点击时“前进”到下一个状态。每个状态都以不同的方式在视觉上表示,例如通过更改标签、边框和/或颜色。 注意:在本例中,最好扩展UIControlUIButton,它们都是UIView 的子类

        扩展 - 您想要一个具有圆形边框、标题和正文部分的视图,标题具有更大的字体和倒置的颜色(深灰色背景上的白色文本)。

        分组 - 您有一个面板,要在其中显示用户个人资料,其中包含多个标签和值(即用户名:myusername)、个人资料图片,动态布局。

        基类 - 您有一组具有相同外观的视图,具有圆形边框、右上角与边框重叠的标题以及用于布置内容的内部面板。你创建一个名为SOMyPanelBaseViewUIView 子类,然后从它继承其他类,自动继承外观

        在许多情况下(但不是全部)你可以跳过继承并在视图控制器中实现所有内容,但除了不是一个好的面向对象设计(视图与视图控制器高度绑定)之外,它还使视图控制器过度复杂的。通过从 UIView 继承,您可以在单独的类中实现视图功能,并将这些功能插入视图控制器。 此外,UIView 继承的类可以重用 - 而如果您在视图控制器中实现所有内容,则除非您复制和粘贴代码,否则您不能。

        总结一下,我觉得你的问题可以概括为:为什么要在面向对象编程中使用继承? 在 OOP 中使用继承的原因与在特定情况下使用继承相同,在我们的例子中是 UIView。这个话题在wikipedia上描述得很好

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多