2014-10-23 17 views
7

Zaimplementowałem kontroler widoku, który po prostu wyświetla pojedynczy obraz i pozwala użytkownikowi uszczypnąć, aby powiększyć/przesunąć obraz. Działa świetnie na iOS 7, ale w systemie iOS 8 ramka widoku przewijania ma inny rozmiar, a wynikiem końcowym jest zbyt duże powiększenie obrazu na iPhonie i zbytnie pomniejszanie na iPadzie podczas pracy w systemie iOS 8. Wynika to z tego, że Szerokość ramki przewijania wynosi 600pt, co jest jej wielkością w serii ujęć (Universal Storyboard przy użyciu klas wielkości). Mam jednak ograniczenia związane z autouzupełnianiem, które mają zapewnić rozciąganie widoku przewijania w celu wypełnienia dostępnej przestrzeni - powinno to być 768 punktów na iPadzie. Tak jest w przypadku iOS 7, ale nie iOS 8.Ramka UIScrollView ma inny rozmiar w systemie iOS 8 i iOS 7

Jest to konfiguracja: interfejs Builder, mam UIViewController zawierający UIView który zawiera UIScrollView z contraints autoLayout spływu, prowadząc, dolny i górny przestrzeń do superview. Następnie w 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); 

odkryłem jeśli mogę umieścić ten sam NSLog w viewDidAppear szerokość ramy jest prawidłowo 768pt. Próbowałem przenieść ten kod do viewWillAppear zamiast viewDidLoad, ale otrzymałem taki sam wynik - jest to również 600 w viewWillAppear. Widok przewijania jest odpowiednio rozciągnięty, aby wypełnić ekran, ale dopiero po jego wyświetleniu na ekranie. Potrzebuję prawidłowego rozmiaru klatki, zanim obraz pojawi się na ekranie, dzięki czemu mogę obliczyć prawidłowe wartości maksymalnego i maksymalnego powiększenia.

Co mogę zrobić, aby to naprawić i upewnić się, że działa na iOS 7 i 8?

+0

Kiedy mówisz „600pt, który jest jego wielkość w serii ujęć”, to dotyczy rozmiarze stałym ograniczeniem lub tymczasowy „zastępczy” wartość rzeczywista wielkość? –

+0

@IanMacDonald Podczas korzystania z uniwersalnego storyboardu domyślnym rozmiarem sceny jest 600. Ponieważ widok przewijania rozciąga się, aby wypełnić szerokość/wysokość za pomocą autolayout, domyślnie jest równy 600, ale powinien rozciągać się, aby wypełnić cały rozmiar widoku. – Joey

+0

Tak, rozumiem, że domyślny rozmiar to 600. Byłem ciekawy, czy twój widok przewijania zgłasza swoje 600 w jednym z tych dwóch pól, o których wspomniałem, lub czy był to tylko w polu obliczonej ramki. Czy widok przewijania ma widok superrozciągający? –

Odpowiedz

22

Rozwiązałem to. Z jakiegoś powodu, viewDidLoad jest zbyt wcześnie w cyklu życia, aby uzyskać dostosowaną ramkę widoku przewijania na iOS 8, ale znowu działa na iOS 7. viewWillAppear również jest za wcześnie, a także viewWillLayoutSubviews.

Aby rozwiązać problem, właśnie przeniosłem kod, w którym potrzebuję użyć rozmiaru ramki widoku przewijania do viewDidLayoutSubviews, który ostatecznie uzyska prawidłowy rozmiar, który będzie, gdy się pojawi.

+3

Jeśli chcesz uniknąć jakiegokolwiek jittera wizualnego, zawsze możesz ustawić przeglądarkę jako ukrytą, dopóki nie zmienisz jej w 'viewDidLayoutSubviews'. –

+0

to naprawdę pomogło zmienić rozmiar przewijania na iOS 7 - dziękuję – moonvader

+0

Ogromne dzięki.Spędziłem kilka godzin próbując dowiedzieć się, dlaczego pierwszy obraz w widoku przewijania ma inne rozmiary niż pozostałe (ponieważ są one później sortowane w późniejszym czasie). – Hobsie

1

Bardzo borykałem się również z podobnym problemem. Rozwiązałem go programowo, zmieniając szerokość contentView wewnątrz okna przewijania przez . W ViewDidLoad zgłoszę metoda ta

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) 
} 
Powiązane problemy