ios - 从 UISlider 继承时会出现一个额外的 slider

标签 ios inheritance storyboard uislider paintcode

我最近购买了 paintcode。我用它来创建一个 slider 。在 Xcode 中,当我在 Storyboard中创建一个空 View 并将其设置为我的 slider 代码所在的类 Slider.m 并运行此应用程序时,会发生这种情况:

enter image description here

我的绘图代码在里面-

(void)drawRect:(CGRect)rect {}

我的 Slider.h 继承了 fram UISlider。如果我继承自 UIButton,则只会显示我的绘图。

这是为什么?

最佳答案

显示结果的原因是 UISlider(以及许多其他控件)实际上由多个子类组成,它们自己处理绘图。结果是一个高度优化的显示代码,不能仅在 UISlider 上使用 drawRect: 正确覆盖它。您将不得不覆盖该组合控件的其他几个部分封闭的实现。

事实上,有一个更简单、更高效的解决方案,它提供您希望自定义的图形元素到 UISlider。关于这个主题的一个很好的介绍可以在 Apple 对 Sliders 的概念介绍中找到。 .

虽然有一些小陷阱 - 其中之一是 UISlider 的拇指不“喜欢”被不同大小的东西替换。然而,许多教程都涵盖了这些 - 其中之一是 how-to-make-a-custom-uislider .

根据经验:尽可能避免子类化和重写 drawRect:,因为这会大大降低 UI 的性能。

相反,请查看对不提供自定义界面的控件使用 UIAppearance 协议(protocol)的解决方案。 UISlider 但是确实提供了它们,所以请使用它们。

这将是我的方法优先级列表:

  1. 非常仔细地检查有问题的控件是否允许通过提供图像等进行自定义。
  2. 检查相关控件是否遵守 UIAppearance 协议(protocol)。
  3. 使用子类化并可能覆盖 drawRect:
  4. 当发现有问题的控件似乎以“奇怪”的方式处理drawRect: 时,将UIView 子类化并自己重新创建缺少的逻辑。

关于ios - 从 UISlider 继承时会出现一个额外的 slider ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20772026/

相关文章:

ios - Swift:在 touchesBegan/touchesEnded 中延迟双击

ios - dictionaryWithContentsOfFile 返回 Nil 而不是 NSdictionary

javascript - 在Javascript中扩展继承的原型(prototype)方法

android - 任何适用于 Android 开发的 iOS Storyboard?

ios - 缺少主从 Controller 的详细信息侧的导航栏

iphone - iOS应用程序的企业分发

ios - 从纵向模式转为横向模式时,屏幕上的图像位置不佳?

javascript - 这是一个可继承的 Promise 吗?

c++ - 从模板化父类中的派生内部类访问 protected 成员变量

ios - 强制 viewDidLoad 在开始时再次运行