компоненты пользовательского интерфейса iPhone - PullRequest
2 голосов
/ 03 марта 2011

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 03 марта 2011

Я думаю, что простым и регулярным решением является создание подкласса 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.Однако, если вам нужно больше, вы должны начать изучать графику в реальном времени.

0 голосов
/ 03 марта 2011

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

...