Osadzanie ImageView w widoku przewijania z automatycznym układem na iOS 6

Próbuję zrobić bardzo prosty element z nowym iOS 6 SDK z automatycznym układem. Mam ImageView i osadzam go w widoku przewijania. (wszystko budować z Interface Builder). The .plik png jest ustawiony, a tryb imageView jest ustawiony na "lewy górny róg".

Realizacja:

#import "ImaginariumViewController.h"

@interface ImaginariumViewController ()
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end

@implementation ImaginariumViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.scrollView.contentSize = self.imageView.image.size;
    self.imageView.frame =
    CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
}

@end

Po uruchomieniu aplikacji obraz nie jest przewijany. Robiąc to samo z wyłączonym układem automatycznym( z rozpórkami i sprężynami), mam działające przewijanie. Chyba problem tkwi w ograniczeniach. Czy ktoś mógłby mi pomóc, proszę?

Author: Vitaly, 2012-09-27

2 answers

Właśnie natknąłem się na ten sam problem w samouczku, który aktualizowałem. Próbowałem programowo usuwać ograniczenia, przeklinać i walić głową w ścianę-bez powodzenia.

Około 5 minut temu próbowałem jednak czegoś, co naprawiło inny problem, który napotkałem, i, TA da! UIScrollView znowu działa! Rozwiązaniem było przeniesienie starego kodu, który ustawia właściwość uiscrollview contentSize do implementacji viewDidAppear, a nie viewDidLoad:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.theScroller.contentSize=CGSizeMake(200.0,2000.0);
}

Mam nadzieję, że to pomoże komuś innemu napotkać niektóre bóle głowy, które pojawiły się z układem Auto.

 52
Author: John E. Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-29 12:41:38

Autolayout może być bardzo mylące na początku. W rzeczywistości nie chcesz ustawiać rozmiaru zawartości widoku przewijania w dowolnym miejscu. Z czystym podejściem autolayout widok przewijania ustawia własny rozmiar zawartości. Zobacz sekcję autolayout i UIScrollView w iOS 6 release notes :

Ograniczenia w podwidywaniach widoku przewijania muszą skutkować rozmiar do wypełnienia, który jest następnie interpretowany jako rozmiar zawartości widok przewijania. (Nie należy tego mylić z metoda intrinsicContentSize używana do automatycznego układu.)

Należy zauważyć, że oznacza to, że ograniczenia dotyczące podwidań widoku przewijania muszą ustawiać jawne szerokości i wysokości, a nie używać szerokości, które różnią się w zależności od aspektów widoku przewijania.

Drugi błąd polega na tym, że ustawiasz ramkę UIImageView Na Rozmiar obrazu. W przypadku autolayout jest to również niepotrzebne. UIImageView w rzeczywistości ma intrinsicContentSize, który jest rozmiarem bazowego obrazu. (Aby to zmienić należy ustawić ograniczenia dla szerokości i wysokości z wysokim priorytetem) oznacza to, że przy automatycznym układzie, aby umieścić obraz w widoku przewijania i mieć go przewijać, poprawny kod powinien być następujący:

** nothing at all!!! **

Ale nadal jest coś, na co musisz uważać, co może spowodować, że obraz nie będzie się przewijał, a podpowiedź znajduje się we wspomnianych uwagach do wydania:

Zauważ, że możesz sprawić, że widok podrzędny widoku przewijania będzie wyświetlany jako float (nie przewijać) nad drugim przewijaniem treści poprzez tworzenie ograniczeń pomiędzy widokiem A widokiem poza podzbiorem widoku przewijania, np. widok przewijania jest superview.

Tzn. jeśli ustawisz ograniczenia w kreatorze interfejsów i ograniczysz widok obrazu do widoku powyżej widoku przewijania w hierarchii, wpłynie to na sposób przewijania widoku. Mad!

Szczęśliwego Kodowania...
 27
Author: jackslash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-13 22:32:26