我最近购买了paintcode。我用它来创建一个滑块。在 Xcode 中,当我在我的故事板中创建一个空视图并将其设置为Slider.m
我的滑块代码所在的类并运行此应用程序时,会发生这种情况:
我的绘图代码在里面 -
(void)drawRect:(CGRect)rect {}
我Slider.h
的继承框架UISlider
。如果我继承自 say UIButton
,则只会出现我的绘图。
这是为什么?
我最近购买了paintcode。我用它来创建一个滑块。在 Xcode 中,当我在我的故事板中创建一个空视图并将其设置为Slider.m
我的滑块代码所在的类并运行此应用程序时,会发生这种情况:
我的绘图代码在里面 -
(void)drawRect:(CGRect)rect {}
我Slider.h
的继承框架UISlider
。如果我继承自 say UIButton
,则只会出现我的绘图。
这是为什么?
显示结果的原因在于UISlider
(在许多其他控件中)实际上由多个子类组成,这些子类本身处理绘图。drawRect:
结果是一个高度优化的显示代码,仅使用它不能正确覆盖UISlider
。您将不得不覆盖该组合控件的其他几个部分封闭的实现。
事实上,有一个更简单、性能更高的解决方案,它提供了您希望自定义的图形元素UISlider
。可以在 Apple 对Sliders的概念性介绍中找到关于该主题的精彩介绍。
不过也有一些较小的陷阱——其中之一是 aUISlider
的拇指不“喜欢”被不同大小的东西替换。然而,许多教程都涵盖了这些内容——其中之一是how-to-make-a-custom-uislider。
作为一个经验法则:drawRect:
尽可能避免子类化和覆盖,因为它会极大地降低 UI 的性能。
相反,请查看将UIAppearance
协议用于不提供自定义接口的控件的解决方案。UISlider
但是确实提供了它们,因此请选择它们。
这将是我的方法优先级列表:
UIAppearance
协议。drawRect:
drawRect:
“奇怪”的方式处理时,您UIView
自己子类化并重新创建丢失的逻辑。