2013-12-25 4 views
1

Недавно я приобрел код для рисования. Я использовал это для создания слайдера. В Xcode, когда я, в моей раскадровке создать пустой вид и установить его в класс Slider.m, где мой слайдер код является, и запустить это приложение, это происходит:При наследовании от UISlider появляется дополнительный ползунок

enter image description here

Моего код рисунок внутри -

(аннулируются) DrawRect: (CGRect) прямоугольник {}

Мои Slider.h наследуется Фрам UISlider. Если я наследую, скажем, UIButton, появляется только мой рисунок.

Почему?

+0

Как правило, нет необходимости использовать пользовательскую покраску ('drawRect:') для настройки ползунка. Вы можете просто предоставить графические части к своему экземпляру - см. 'SetMaximumTrackImage: forState:' и аналогично. Для полного руководства по этому вопросу вы можете захотеть использовать (первый хит google) http: //www.getappninja.com/blog/how-to-make-a-custom-uislider – Till

+0

@ Пойду, я ценю подсказку. Но я все еще хочу знать, почему это происходит (дополнительный ползунок появляется при наследовании от uislider). –

+0

Причина в том, что Apple решила использовать несколько подклассов в UISlider для обработки всех пользовательских интерфейсов (рисование, отслеживание, ...). Таким образом, метод drawRect довольно бессмыслен. Следовательно, вы должны прочитать о https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/UIKitUICatalog/UISlider.html#//apple_ref/doc/uid/TP40012857-UISlider и сделать так, как они предлагают - ИЛИ - создать полностью настраиваемую версию путем подкласса 'UIView'. – Till

ответ

2

Отображаемые результаты мотивированы тем фактом, что UISlider (среди многих других элементов управления) фактически состоит из нескольких подклассов, которые сами обрабатывают чертеж. Результатом является высоко оптимизированный код отображения, который нельзя правильно переопределить, используя только drawRect: только на UISlider. Вы должны были бы переопределить несколько других, частично закрытых реализаций этого составного элемента управления.

На самом деле существует гораздо более удобное и много более эффективное решение, которое предоставляет графические элементы, которые вы хотите настроить до UISlider. Хорошее введение по этому вопросу можно найти в концептуальном представлении Apple до Sliders.

Есть несколько небольших подводных камней, хотя один из них - тот факт, что большой палец UISlider не «похож» на что-то с другим размером. Тем не менее, они охвачены многими учебниками - одним из них будет how-to-make-a-custom-uislider.

Как правило, избегайте подклассификации и переопределения drawRect:, когда это возможно, любыми средствами, поскольку это значительно ухудшит производительность вашего пользовательского интерфейса.

Вместо этого посмотрите на решения, которые используют протокол UIAppearance для элементов управления, которые не предоставляют интерфейсы для настройки. UISlider, однако, их предоставляют, поэтому идите к ним. очень осторожно, если управление в вопросе действительно позволяют детализировать путем предоставления изображений и т.д.

  • Проверьте, если элемент управления в вопросе придерживается протокола UIAppearance

    1. Проверить:

      Это будет мой подход списка приоритетов.

    2. Использование подклассов и, возможно, наиважнейшая drawRect:
    3. Когда выясняется, что контроль в вопросе, как представляется, обрабатывать drawRect: в «странном» пути, подкласс UIView и воссоздать отсутствующую логику самостоятельно.
  • +0

    Очень полезно! :) –

    Смежные вопросы