我最近购买了 paintcode。我用它来创建一个 slider 。在 Xcode 中,当我在 Storyboard中创建一个空 View 并将其设置为我的 slider 代码所在的类 Slider.m
并运行此应用程序时,会发生这种情况:
我的绘图代码在里面-
(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
但是确实提供了它们,所以请使用它们。
这将是我的方法优先级列表:
- 非常仔细地检查有问题的控件是否允许通过提供图像等进行自定义。
- 检查相关控件是否遵守
UIAppearance
协议(protocol)。 - 使用子类化并可能覆盖
drawRect:
- 当发现有问题的控件似乎以“奇怪”的方式处理
drawRect:
时,将UIView
子类化并自己重新创建缺少的逻辑。
关于ios - 从 UISlider 继承时会出现一个额外的 slider ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20772026/