2010-11-08 12 views
18

Ich benutze UIScrollView und ein Bild darin, um ein Bild pro Seite zu pagen. Ich habe ein Problem beim Drehen der iPhoneUIScrollView Scrollen beim Drehen auf dem iPhone/iPad deaktivieren

Wenn ich das iPhone rotieren dann ScrollViewDidScroll (Scroll-View-Delegate-Methode) anruft. Aus diesem Grund ist mein Paging gestört und die Seitennummer ändert sich.

Was ist die Lösung?

+0

gleiche Problem haben. .., hast du es geschafft, das Problem zu lösen? – negersiu

+1

@ Maciulis..Was genau war ich zu dieser Zeit getan ... aber ich überprüfe den Code .. und ich verwende nicht die Methode scrollViewDidScroll und ScrollViewDidEndDecelerating verwenden .. und verwenden Sie eine globale Variable für die aktuelle Seitenzahl .. hoffe, dies wird helfen Sie mir oder sagen Sie mir genau, was Sie wollen –

Antwort

13

Ich fand ein seltsames undokumentiertes Verhalten beim Drehen einer seitenweise UIScrollView.

Wenn der Scrollview auf der letzten Seite positioniert ist und der Benutzer die Ausrichtung ändert, scrollt das Betriebssystem die UIScrollView ein paar Pixel zurück, um den Unterschied zwischen Höhe und Breite auszugleichen.

Grundsätzlich erhielt ich die folgenden Anrufe für jede Seite.

willRotateToInterfaceOrientation:duration 
willAnimateRotationToInterfaceOrientation:duration: 
didRotateFromInterfaceOrientation: 

Und für die letzte Seite:

willRotateToInterfaceOrientation:duration 
scrollViewDidScroll: 
willAnimateRotationToInterfaceOrientation:duration: 
didRotateFromInterfaceOrientation: 

das auch mit meinen Seiten vermasselt. Das Problem ist, dass in willRotate haben die Grenzen nicht durch das OS noch aktualisiert worden ist, und in willAnimate haben Sie die neuen Grenzen und können die neue Größe berechnen, aber es ist zu spät ...

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

    CGSize tempSize = [self.pagingScrollView contentSize]; 
    NSUInteger padding = abs(pagingScrollView.frame.size.width - pagingScrollView.frame.size.height); 
    tempSize.width += padding; 
    [self.pagingScrollView setContentSize:tempSize]; 
    [...] 
} 
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration{ 
    CGSize newSize = ... // Compute new content size based on new orientation 
    [self.pagingScrollView setContentSize:newSize]; 
} 

Dies ist nur ein Workaround, aber ich habe unzählige Stunden mit diesem Thema verbracht und konnte keine elegante Lösung finden.

22

Raphaël's answer ist eine ausgezeichnete Beschreibung des Problems und eine ordentliche Lösung. Ich hatte genau das gleiche Problem und endete mit einem scrollingLocked Flag, das ich auf JA (gesperrt) vor dem Start der Rotation und NO (entsperrt), wenn es endet. Vielleicht etwas weniger hacky als vorübergehend die contentSize ändern:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation 
           duration:(NSTimeInterval)duration 
{ 
    self.photoViewer.scrollingLocked = YES; 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromOrientation 
{ 
    self.photoViewer.scrollingLocked = NO; 
} 

- (void)scrollViewDidScroll:(UIScrollView*)scrollView 
{ 
    if (self.scrollingLocked) 
    { 
     return; 
    } 
    /* do normal scrollViewDidScroll: stuff */ 
} 
+0

+1 für eine korrekte + klarere Antwort. –

+0

welche komponente ist der photoViewer? - weil es keine Schriftrolle ist, noch eine Ansicht –

+2

@matheszabi, er verwendet eine BOOL-Ivar zu verfolgen. Alternativ können Sie auch die eingebaute 'scrollEnabled'-Eigenschaft des' UIScrollView' verwenden. Übrigens löst dies aus irgendeinem Grund "scrollViewDidScroll" aus, wenn es auf dem letzten Bild ist. – Steven

0

Meine Aufgabe ist es, Scrollen der Landschaft zu ermöglichen. Das Design ist für Portait. Ich kam auf eine Idee, um eine ScrollView zu Komponenten hinzuzufügen, oder in "In Scroll-Ansicht einbetten" in Interface Builder. Ich habe erwartet, dass es funktioniert, aber nein. Ich benutze Xcode 4.4, iOS 5.1, (Office-Projekt brauchen Unterstützung für 4.2 zu), aber das Problem ist das gleiche.

In Stack Overflow Frage iPhone SDK: UIScrollView does not scroll gibt es eine Reihe, die ein Problem lösen.

Andere Versuch ist in Stack-Überlauf Frage iOS - UIScrollView is not working (it doesn't scroll at all - the image stays fixed), und das hat mir geholfen, mit anderen kombiniert, so ist hier mein Portait-to-scrollbaren Landschaft Code:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromOrientation 
{ 
    if(UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])){ 
     scrollView.contentSize = portaitScrollSize; 
    } 
    else{//statusbar is Landscape 
     scrollView.contentSize = landscapeScrollSize; 
    }  
} 

Die Scroll in gebundener zu einem iVar Ansicht im Interface Builder. portaitScrollSize und landscapeScrollSize sind private Variablen. Sie werden initialisiert und ändern sich nicht. In my.h Datei:

IBOutlet UIScrollView *scrollView; 

In my.m Datei:

CGSize portaitScrollSize, landscapeScrollSize; 

...

portaitScrollSize = CGSizeMake(320,440); 
landscapeScrollSize = CGSizeMake(480,480); 

Ich hoffe, dass es jemand helfen wird, eine rotierende + Scroll-Funktion, um ein Portait Entwurf hinzuzufügen .

Vergessen Sie nicht, portait + Landschaft auf der Top-Komponente zu ermöglichen: Antwort des

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return TRUE; 
} 
0

Neben Raphaël Mor. Wenn Sie von Hochformat auf Querformat umschalten, werden die Inhaltsgröße und die Seitenstruktur abgebremst. Deshalb, um die aktuelle Seite Struktur beizubehalten nur Größe Breite zusätzliche Inhalte hinzufügen:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 
    [self.scrollView setContentSize:CGSizeMake(self.scrollView.contentSize.width + 400, self.scrollView.contentSize.height)]; 
} 

Und stellen Sie sicher stellen Sie die Content und Offset wieder nach der Ausrichtung geändert:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    [self.scrollView setContentSize:CGSizeMake(self.scrollView.bounds.size.width *3, self.scrollView.bounds.size.height)]; 
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.bounds.size.width * self.pageControl.currentPage, 0) animated:NO]; 

} 
Verwandte Themen