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