2012-09-27 11 views
20

Ich versuche, sehr einfach Element mit neuen iOS 6 SDK mit Auto-Layout zu machen. Ich habe ein ImageView und es in ScrollView einbetten. (alles mit Interface Builder erstellt). Die .png-Datei ist festgelegt und der ImageView-Modus ist auf "Oben links" eingestellt.Embed ImageView in ScrollView mit Auto Layout auf iOS 6

Umsetzung:

#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 

Wenn ich die app ausführen, wird das Bild nicht gescrollt. Wenn das Auto-Layout ausgeschaltet ist (mit Federbeinen und Federn), arbeite ich mit Scrollen. Ich denke, das Problem ist mit Einschränkungen. Könnte mir bitte jemand helfen?

Antwort

52

Ich habe gerade das gleiche Problem in einem Tutorial gefunden, das ich aktualisiert habe. Ich versuchte programmatisch Einschränkungen zu löschen, zu fluchen und meinen Kopf gegen die Wand zu schlagen - kein Glück.

Vor ungefähr 5 Minuten versuchte ich jedoch etwas, das ein anderes Problem behoben hatte, dem ich begegnete, und, ta da! UIScrollView funktioniert wieder! Die Lösung bestand darin, den alten Code zu bewegen, die die UIScrollView Content Eigenschaft in eine Implementierung von viewDidAppear setzt, anstatt viewDidLoad:

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

Ich hoffe, das hilft jemand anderes einige der Kopfschmerzen zu begegnen, die mit Auto-Layout erschienen sind.

+0

Das funktioniert, danke! Wirklich seltsame Apple haben keine Informationen in iOS 6 Docs. Wahrscheinlich liegt das Problem daran, dass Constraints erst später gesetzt werden, wenn -viewDidLoad aufgerufen wird (tho, wie es vom Storyboard kommt, sollte es auf wayFeomNib gesetzt werden, früher als viewDidLoad genannt, so weit ich weiß). – Vitaly

+2

Es gibt ein weiteres Problem beim Zoomen der Bildansicht innerhalb der Bildlaufansicht. – Vitaly

+0

Mein Gott, das war so nervig. So viel Zeit verschwendet! Sobald es von viewDidLoad zu ViewDidAppear verschoben wurde, funktionierte es einwandfrei. Danke John! – Andy

27

Autolayout kann auf den ersten sehr verwirrend sein. Sie möchten die contentSize der scrollview nicht irgendwo setzen. Bei einem reinen Auto-Layout-Ansatz legt der Scrollview seine eigene Inhaltsgröße fest. Siehe den Abschnitt über automatisches Layout und UIScrollView im iOS 6 release notes:

Die Einschränkungen für die Subviews der Scroll-Ansicht in einer Größe führen müssen zu füllen, die dann als Inhalt Größe der Scroll Ansicht interpretiert wird. (Dies sollte nicht mit der intrinsicContentSize Methode für Auto-Layout verwendet verwechselt werden.)

Beachten Sie, dass dies bedeutet, dass die Einschränkungen für die Subviews der Scroll explizite Breiten und Höhen einstellen müssen und nicht Breiten verwenden, die auf variieren Aspekte der Scrollansicht. Der zweite Fehler hier ist, dass Sie den Rahmen des UIImageView auf die Größe des Bildes setzen. Bei Auto-Layout ist dies auch nicht nötig. Die UIImageView hat tatsächlich eine intrinsicContentSize, die die Größe des zugrunde liegenden Bildes ist. (Um dies zu ändern Sie Einschränkungen für Breite und Höhe mit hohen Priorität festgelegt sollen) Das bedeutet, dass mit Auto-Layout ein Bild in einem Scrollview zu platzieren und haben scrollen sie den richtigen Code sollte die folgende sein:

** nothing at all!!! ** 

Aber theres noch etwas, das Sie aufpassen müssen aus für die Sie dazu führen könnten, um ein Bild zu haben, die nicht blättern, und der Hinweis erscheint, ist in dem aforelinked Release Notes:

Beachten Sie, dass Sie ein Subview der Scroll-Ansicht machen erscheinen float (nicht blättern) über den anderen Bildlauf Inhalt durch Erstellen von Einschränkungen zwischen der Ansicht und eine Ansicht außerhalb des Teilbaums der Bildlaufansicht, z. B. der Superview der Bildlaufansicht.

, d.h.Wenn Sie Constraints im Interface Builder setzen und die Bildansicht auf eine Ansicht oberhalb der Scrollansicht in der Hierarchie beschränken, wirkt sich dies darauf aus, wie die Ansicht zu scrollen scheint. Wütend!

Happy Coding ...

+0

Danke. Ihre Anmerkungen zum Einstellen der Bildansicht auf eine hohe Priorität Breite/Höhe haben mir geholfen – bean

+0

Hey @jackslash fragte sich, ob Sie wissen, wie Sie eine Abhängigkeit zwischen der Ansicht und der Superansicht der Bildlaufansicht erstellen können (als Beispiel). Ich habe es schon eine Weile versucht und kann nicht sehen, wie es geht. – Ants

+0

@Ants Das klingt nach einer ganz neuen Frage für mich! Wenn Sie einen hier verlinken, sehe ich es. – jackslash

Verwandte Themen