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