Пользовательские компоненты пользовательского интерфейса iPhone

Я очень новичок в разработке iPhone.

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

Я хочу, чтобы этот объект можно было перемещать с помощью акселерометра или пальца пользователя. Я также хочу сделать его больше или меньше.

Я думал создать собственный компонент пользовательского интерфейса, который наследует UIView.

Я не знаю, нарисую ли я форму с помощью Quartz 2D, она будет вести себя как компонент пользовательского интерфейса.

Могу ли я сделать это? У вас есть лучшее решение?


person VansFannel    schedule 03.03.2011    source источник


Ответы (2)


Я думаю, что простым и регулярным решением является создание подкласса UIView. Только то, что ты собираешься делать.

Концептуально UIView заключается в том, чтобы сохранить визуальный контент, рисуя их. (с Quartz в большинстве случаев!) Если визуальное содержание изменилось? UIView просто перерисовывает их. Когда вы что-то меняете, UIView перерисовывает все заново. (Конечно, это концептуальное описание, реальное сильно отличается из-за сильной оптимизации)

Однако важным моментом является то, что вам нужно сделать для этого, просто переопределить метод. Потому что UIKit делает большинство важных оптимизаций вместо вас.

UIView отрисовывает свой визуальный контент методом - (void)drawRect:(CGRect)rect. И вы можете переопределить этот метод, чтобы рисовать свои фигуры. Если вы рисуете что-то этим методом, фигура будет нарисована на прозрачном виде.

Если вы манипулируете представлением (масштабированием, перемещением, поворотом...), UIKit может запросить представление для перерисовки своей графики. И вид запомнит способ рисования вашей формы. Это очень обычная техника. Большинство пользовательской графики и анимации, созданных с помощью этого метода. Все, что вам нужно сделать, это просто написать код рисования в методе - (void)drawRect:(CGRect)rect.

Есть хорошие руководства по этой концепции в справочной документации:

И позаботьтесь о том, чтобы вам приходилось рисовать с помощью CGContextRef, полученного путем вызова метода UIGraphicsGetCurrentContext ( void ); вместо того, чтобы создавать свой собственный. Контекст означает фактический экран устройства. Если вы создадите свой собственный контекст, ни один из них не сможет предложить фактический экран устройства.

Например:

@interface MyView : UIView
@end

@implementation MyView
- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    // Do your drawing here with the `context`.
    // And don't release it because the it is not yours, just borrowed from `UIKit`.
}
@end

Возможно, вам понадобится своего рода оптимизация в любой форме. UIKit выполняет базовую оптимизацию, но не все. Потому что графическая оптимизация имеет много компромиссов между памятью и обработкой. Вы можете получить некоторую оптимизацию от CALayer и shouldRasterize. Однако, если вам нужно больше, вы должны начать изучать графику в реальном времени.

person eonil    schedule 03.03.2011
comment
@occulus Вау! Я очень ценю! Всегда приветствуется исправление моих неправильных грамматик :) - person eonil; 03.03.2011
comment
@occulus: Отличный источник грамматики! - person VansFannel; 03.03.2011

Конечно, можно нарисовать собственный вид, как описывает Эонил. Однако рассматривали ли вы просто использование UIImageView?

person Jim    schedule 03.03.2011