Изменение размера UIView из drawRect ()

У меня есть UIView, и я рисую его содержимое из drawRect(), но мне иногда нужно изменять размер представления в зависимости от некоторых вычислений, которые выполняются во время рисования:

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

Вот как я меняю размер формы drawRect()

 CGRect limits = self.frame ;
 limits.size.width = 400;
 self.frame = limits;

Кажется, что контекст не знает об изменении размера и рисует, используя старые размеры. Я уже пробовал [self setNeedsDisplay] после изменения размера, но метод рисования больше не вызывается.


person dimirc    schedule 07.07.2012    source источник


Ответы (2)


Расчеты следует выполнять заранее, а не во время рисования, только из соображений производительности (хотя ранние расчеты также позволили бы избежать этой проблемы).

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

person Kevin Grant    schedule 07.07.2012

Для всех, кто борется с этим.

По-видимому, [self setNeedsDisplay] не будет иметь никакого эффекта при вызове из drawRect: (или любого метода, вызываемого из drawRect :). Почему-то просто пропускает звонок.

Чтобы все произошло, используйте вместо этого

[self performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:0];

Это будет вызываться сразу, когда основная очередь снова освободится; просто убедитесь, что вы используете какое-то условие для вызова needsDisplay внутри drawRect - иначе вы зациклитесь.

person Dannie P    schedule 04.02.2013