2009-09-18 4 views
54

Ich habe UIScrollView vor, und benutze es jetzt, und hatte noch nie ein Problem. Ich füge es jetzt zu einer alten App hinzu, und während es wie erwartet funktioniert (ich kann mir den Inhalt ansehen, mit dem Finger herumrollen, alle Grenzen und Größen sind richtig eingestellt, so dass kein leerer Platz im Inhalt ist, etc .), Ich kann einfach nicht scrollToRectVisible arbeiten. Ich habe sogar den Anruf vereinfacht, so dass er lediglich auf die 0,0-Position bewegt:UIScrollView funktioniert wie erwartet, aber scrollRectToVisible: tut nichts

[scrollView scrollRectToVisible:CGRectMake(0, 0, 10, 10) animated:YES]; 

oder es 0200 verschieben:

[scrollView scrollRectToVisible:CGRectMake(0, 200, 10, 10) animated:YES]; 

Ich machte sogar eine schnelle App dies zu testen und ich kann bekomme scrollRectToVisible um dort zu arbeiten, wie ich es erwarte. Aber in meiner alten App kann ich scheinbar nichts machen.

Ich kann die ScrollView mit setContentOffset: scrollen, aber das ist nicht was ich will.

Diese scrollView und ihr Inhalt werden in der NIB von IB definiert und mit einem IBOutlet verwendet. Der einzige Code, den ich in meiner app bin mit dem Scroll zu handhaben ist

[scrollView setContentSize:CGSizeMake(scrollView.contentSize.width, imageView.frame.size.height)]; 

(I in vertikalen Scrollen nur daran interessiert bin nicht horizontal).

Hat jemand auf ein Problem wie folgt gestoßen?

Ich habe die scrollView Attribute in beiden Apps verglichen und sie sind identisch.

NACHTRAG:

Mein scrollViews Rahmen: 0,000000 0,000000 480,000000 179,000000

Mein scrollViews content ist: 0,000000 324,000000

Es wirkt immer noch wie die rect ich blättern möchte, ist bereits sichtbar und kein Scrollen ist erforderlich. Nicht sicher, ob das passiert. Das ist nur das Nötigste. Scheint, wie eine solche einfache Sache zu lösen ...

NACHTRAG # 2:

Dies ist, wie ich ohne scrollRectToVisible tun mache:

CGPoint point = myRect.origin; 
if (![clefScrollView pointInside:point withEvent:nil]) { 
    point.x = 0; 
    if (point.y > clefScrollView.contentSize.height - clefScrollView.bounds.size.height) 
     point.y = clefScrollView.contentSize.height - clefScrollView.bounds.size.height; 
    [clefScrollView setContentOffset:point animated: YES]; 
} 

Alles andere über dieses Scrollview funktioniert wie erwartet, aber scrollRectToVisible. WARUM?!? Irgendwelche wilden Vermutungen?

Antwort

99

Über einen Monat später, und ich habe es endlich herausgefunden. Während die obige Alternative gut funktionierte, hat sie mich gestört und ich musste es endlich herausfinden. Stellt sich heraus, dass es ein dummer Fehler war.

Hier ist der alte Code in meinem viewDidLoad, wo ich die Scrollview ein:

[clefScrollView setContentSize:CGSizeMake(clefScrollView.contentSize.width, clefView.frame.size.height)]; 

Der Wert einer Scroll Höhe oder Breite sein kann, nicht 0!Ich denke, das ging an mir vorbei, weil ich annahm, dass ScrollView-Größen mit einer gültigen Größe beginnen und mir die Tatsache fehlte, dass eine Dimension null war!

Dies funktioniert:

[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)]; 

Hope this jemand da draußen hilft. Ich habe definitiv viel zu viel Zeit damit verbracht, das zu debuggen.

+0

Danke! Ich habe auch etwas davon bekommen (ich stellte Höhe aber nicht Breite ein). –

+3

Dies ist nicht ganz richtig - c.f. Orions Antwort unten (ich hatte eine Breite/Höhe ungleich null, es ist nicht '0', die das Problem verursacht ...) – Adam

+0

Ich habe dies in ähnlicher Weise getan, aber scrollRectToVisible funktioniert immer noch nicht. Es funktioniert im Simulator aber nicht auf dem Gerät. Bitte helfen Sie. –

43

Ja, ich hatte keinen Erfolg mit scrollRectToVisible:animated:, aber setContentOffset:animated: funktioniert immer für mich. Aus Neugier, warum möchten Sie nicht setContentOffset:animated: verwenden? Es scheint die richtige Lösung zu sein.

+3

Leider scrollt setContentOffset zum Punkt, unabhängig davon, ob er bereits sichtbar ist oder nicht. Ich könnte die zusätzliche Arbeit tun, um festzustellen, ob der Punkt sichtbar ist oder nicht, aber ich bin immer noch neugierig, warum scrollRectToVisible nicht funktioniert, wenn ich sehe, dass es in meinem eigenen Sample und anderen Samples im Netz funktioniert. Ich muss etwas falsch machen, aber mit nur drei oder vier Zeilen Code für das ScrollView kann ich nicht sehen was ?! – mahboudz

0

Die oben vorgeschlagene Lösung kann immer noch einen Fehler anzeigen, wenn Sie den Rahmen für "clefScrollView" nicht festgelegt haben.

Wenn die obige Lösung verwendet wird und immer noch das gleiche Problem vorliegt, stellen Sie sicher, dass Sie Ihren scollView (in diesem Fall clefScrollView) Frame initialisiert haben, bevor Sie die Inhaltsansicht einstellen.



    clefScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,450)]; 

    [clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)]; 



1

ich hatte es so und es hat nicht funktioniert

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, someKnownValue); 

ich gerade wurde die Höhe des contentSize zu ändern, so dass ich nicht glaube, dass würde mir kein Problem, aber es tat ...

hatte es zu dieser

scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue); 

erweist sich zu ändern scrollView.contentSize.width ist nicht necessari Setzen Sie den Wert auf einen gültigen Wert. Geben Sie ihm einen bestimmten Wert ein.

5

Sie können überprüfen, ob die Eigenschaft delaysContentTouches des scrollView auf NO gesetzt ist.

Wenn Sie die Methode scrollRectToVisible oder setContentOffset über eine Berührung in einer Unteransicht Ihres scrollView aufrufen, könnte Ihr scrollView Dinge durch Verzögerung von Berührungen halten.

Stellen Sie also sicher, dass Sie in Ihrem scrollView Folgendes festlegen.

Sie werden höchstwahrscheinlich die scrollView mit und ohne Animation auf YES verschieben können.

0

Ein wenig zu spät zum Spiel, aber ich hatte das gleiche Problem. Obwohl ich die Inhaltsgröße meiner Scrollview absolut richtig eingestellt hatte - sogar übermäßig für den Wert der Höhe. Auch nach umfangreichen Kontrollen zur Überprüfung der Rahmen und Inhaltsgrößen - funktionierte immer noch nicht. Ich musste die Höhe der "Grenzen" anpassen, dann hat alles super geklappt.

0

Ich hatte die gleichen Symptome wie dieses Problem..der scrollRectToVisible funktionierte nicht wie vorgesehen. Mein Problem war, dass die Scrollview auf dem Storyboard ein mehrdeutiges Constraint-Problem hatte. Sobald das behoben war, funktionierte der Anruf einwandfrei. Es ist etwas anderes zu überprüfen, wenn der Aufruf scrollRectToVisible nicht wie vorgesehen funktioniert.