2014-10-23 4 views
7

Я реализовал контроллер вида, который просто отображает одно изображение и позволяет пользователю зажимать, чтобы увеличить/панорамировать изображение. Он отлично работает на iOS 7, но на iOS 8 кадр представления прокрутки отличается по размеру, и конечным результатом является то, что изображение сильно зашифровано на iPhone и слишком сильно уменьшилось на iPad при работе на iOS 8. Это связано с тем, что ширина рамки прокрутки составляет 600pt, что является ее размером в раскадровке (Universal Storyboard с использованием классов размера). Но у меня есть ограничения автоопределения, которые должны обеспечивать растяжение прокрутки, чтобы заполнить доступное пространство - на iPad должно быть 768pt. Именно так обстоит дело с прошивкой 7, но не IOS 8.Кадр UIScrollView отличается от iOS 8 и iOS 7

Это настройка: В Interface Builder, у меня есть UIViewController, который содержит UIView, содержащее уникальную UIScrollView с autolayout контрсилами задней, ведущей, снизу и сверху пространство надзор. Тогда в viewDidLoad:

UIImage *image = [UIImage imageNamed:@"image"]; 
    self.imageView = [[UIImageView alloc] initWithImage:image]; 
    self.imageView.contentMode = UIViewContentModeScaleAspectFit; 
    self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height); 

    [self.scrollView addSubview:self.imageView]; 
    self.scrollView.contentSize = image.size; 

    #warning Bug here - scroll view frame is 600pt on iOS 8 - should be 768 for iPad 
    NSLog(@"scroll view frame wid: %f", self.scrollView.frame.size.width); 

я обнаружил, если я ставлю тот же NSLog в viewDidAppear ширина фрейма правильно 768pt. Я попытался переместить этот код в viewWillAppear вместо viewDidLoad, но я получаю тот же результат - это 600 в viewWillAppear. Таким образом, просмотр прокрутки должным образом растягивается, чтобы заполнить дисплей, но только после того, как он появится на экране. Мне нужен правильный размер кадра, прежде чем изображение появится на экране, чтобы я мог рассчитать правильные минимальные и максимальные значения масштабирования.

Что я могу сделать, чтобы исправить это и обеспечить его работу для iOS 7 и 8?

+0

Когда вы говорите «600pt, что его размер в раскадровке», вы имеете в виду постоянное ограничение размера, или временный «Заполнитель» самоценность размер? –

+0

@IanMacDonald При использовании универсальной раскадровки размер по умолчанию для сцены равен 600. Так как вид прокрутки растягивается, чтобы заполнить ширину/высоту с помощью автозапуска, по умолчанию также 600, но он должен растягиваться, чтобы заполнить весь размер представления. – Joey

+0

Да, я понимаю, что размер по умолчанию - 600. Мне было любопытно, будет ли ваше представление прокрутки сообщать о его 600 в любом из этих двух полей, о которых я упоминаю, или если это было только в вычисленном поле кадра. Имеет ли вид прокрутки супервизор, который не растягивается? –

ответ

22

Я решил. По какой-то причине viewDidLoad слишком рано в жизненном цикле, чтобы получить отрегулированный кадр прокрутки на iOS 8, но опять же он работает на iOS 7. viewWillAppear тоже слишком рано, а также viewWillLayoutSubviews.

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

+3

Если вы хотите избежать какого-либо визуального дрожания, вы всегда можете скрыть свой прокрутки до тех пор, пока не закроете его в 'viewDidLayoutSubviews'. –

+0

Это действительно помогло изменить размер прокрутки на iOS 7 - спасибо – moonvader

+0

Массивное спасибо.Я просто потратил несколько часов, пытаясь выяснить, почему первое изображение в представлении прокрутки было разным, чем остальные (поскольку они получают размер в более поздний момент времени). – Hobsie

1

Я также много боролся с подобной проблемой. Я решил это сделать с помощью , изменяя ширину contentView внутри прокрутки. В ViewDidLoad я называю этот метод

func setupWidthOfContentView(){ 

    let screen = UIScreen.mainScreen().bounds 
//  println("Width: \(screen.size.width) Height: \(screen.size.height)") 

    var constW = NSLayoutConstraint(item: vwContentView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: screen.size.width) 
    vwContentView.addConstraint(constW) 
} 
Смежные вопросы