Я не могу помочь вам с падением, кроме как попросить вас проверить и убедиться, что вы случайно не выпускаете автоматически представление или слой где-то в вашем коде. Я видел, как симулятор обрабатывает время авто-выпусков иначе, чем на устройстве (чаще всего, когда задействованы потоки).
Масштабирование представления - проблема с UIScrollView
, с которой я столкнулся. Во время события масштабирования пинч UIScrollView
возьмет вид, указанный вами в методе делегата viewForZoomingInScrollView:
, и применит к нему преобразование. Это преобразование обеспечивает плавное масштабирование вида без необходимости перерисовывать его каждый кадр. В конце операции масштабирования будет вызван ваш метод делегата scrollViewDidEndZooming:withView:atScale:
, который даст вам возможность более качественно отобразить ваше представление с новым масштабным коэффициентом. Как правило, рекомендуется изменить преобразование в представлении на CGAffineTransformIdentity
, а затем вручную перерисовать его в новой шкале размеров.
Однако это вызывает проблему, поскольку UIScrollView
, по-видимому, не контролирует преобразование представления содержимого, поэтому при следующей операции масштабирования он устанавливает преобразование представления содержимого в соответствии с каким бы ни был общий масштабный коэффициент. Так как вы вручную перерисовали свое представление в соответствии с последним масштабным коэффициентом, оно составляет масштабирование, которое вы видите.
В качестве обходного пути я использую подкласс UIView для своего представления содержимого со следующими определенными методами:
- (void)setTransformWithoutScaling:(CGAffineTransform)newTransform;
{
[super setTransform:newTransform];
}
- (void)setTransform:(CGAffineTransform)newValue;
{
[super setTransform:CGAffineTransformScale(newValue, 1.0f / previousScale, 1.0f / previousScale)];
}
где previousScale - переменная экземпляра с плавающей точкой представления. Затем я реализую метод делегирования масштабирования следующим образом:
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale;
{
[contentView setTransformWithoutScaling:CGAffineTransformIdentity];
// Code to manually redraw view at new scale here
contentView.previousScale = scale;
scrollView.contentSize = contentView.frame.size;
}
При этом преобразования, отправляемые в представление содержимого, корректируются в зависимости от масштаба, в котором представление было в последний раз перерисовано. Когда масштабирование по пинчу завершено, преобразование сбрасывается до масштаба 1,0, минуя настройку в обычном методе setTransform:
. Похоже, это обеспечивает правильное поведение при масштабировании, позволяя рисовать четкое изображение при завершении масштабирования.
ОБНОВЛЕНИЕ (23.07.2010): iPhone OS 3.2 и выше изменили поведение прокрутки в отношении масштабирования. Теперь UIScrollView
будет учитывать преобразование идентичности, которое вы применяете к представлению контента, и предоставит относительный масштабный коэффициент только в -scrollViewDidEndZooming:withView:atScale:
. Поэтому приведенный выше код для подкласса UIView
необходим только для устройств, работающих под управлением версий iPhone OS старше 3.2.