2014-09-15 4 views
4

Я долгое время пытался решить проблему с моим UIScrollView. В принципе, это простой масштабируемый UIScrollView, который отображает UIImageView.UIScrollView уменьшить масштаб (IOS 8 GM)

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

Фактически воспроизводится в примере от Apple по адресу: PhotoScroller Уменьшить изображение максимально, и вы увидите проблему.

Я отследил его до дополнительного вызова layoutSubviews, сделанного в iOS 8 (iOS 7 работает отлично).

Неужели кто-нибудь столкнулся с этой проблемой, и если да, то нашел решение?

ответ

3

Я смог исправить это, позвонив [self. layoutSubviews] в моем методе scrollViewDidZoom. Это своего рода хак, но, похоже, он решил мою проблему. Это может помочь:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView{ 
    [self layoutSubviews]; 
} 

Override layoutSubviews до центра Содержимое

- (void)layoutSubviews 
{ 
[super layoutSubviews]; 

// center the image as it becomes smaller than the size of the screen 
CGSize boundsSize = super.bounds.size; 
CGRect frameToCenter = imageView.frame; 

// center horizontally 
if (frameToCenter.size.width < boundsSize.width){ 
    frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width)/2; 
} 
else { 
    frameToCenter.origin.x = 0; 
} 
// center vertically 
if (frameToCenter.size.height < boundsSize.height){ 
    frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height)/2; 
} 
else { 
    frameToCenter.origin.y = 0; 
} 
imageView.frame = frameToCenter; 
} 
+1

Хороший улов, у меня была та же самая проблема сама. Однако вы не должны напрямую ссылаться на layoutSubviews. Документация говорит: «Вы не должны вызывать этот метод напрямую. Если вы хотите принудительно изменить макет, вызовите метод setNeedsLayout вместо этого, чтобы сделать это до следующего обновления чертежа. Если вы хотите немедленно обновить макет своих представлений, вызовите метод layoutIfNeeded ". Я добавил центрирующий код к отдельному методу и вызываю его вместо метода scrollViewDidZoom – zath

4

Исправление от @Jonah решил аналогичную проблему для меня, но это очень важно, чтобы не называть layoutSubviews напрямую.

Вы можете достичь аналогичного эффекта и безопасного со следующим кодом:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    [self setNeedsLayout]; // triggers a layout update during the next update cycle 
    [self layoutIfNeeded]; // lays out the subviews immediately 
} 

UIView документы знакомства Apple, для получения дополнительной информации: https://developer.apple.com/library/IOs/documentation/UIKit/Reference/UIView_Class/index.html#//apple_ref/occ/instm/UIView/layoutSubviews

Смежные вопросы