2 Stimmen

UIScrollView scrollt vertikal durch Berührung und horizontal programmatisch

Ich habe auf Stackoverflow nachgesehen, aber keine Antwort gefunden, die meine Frage genau beantwortet. Wenn ich etwas übersehen habe, verweisen Sie mich bitte auf die richtige Frage.

Hier ist mein Szenario.

Ursprünglich hatte ich einen Fall, in dem die vertikale Fenstergröße festgelegt war, so dass es für mich ein Leichtes war, das Scrollen vollständig einzuschränken, indem ich dies einfach tat.

CGRect scrollContainer = CGRectMake(0, 0, 320, 440);
self.baseView = [[UIScrollView alloc] initWithFrame:scrollContainer];
self.baseView.contentSize = CGSizeMake(6400, 440);
self.baseView.bounces = NO;
self.baseView.pagingEnabled = NO;
self.baseView.scrollEnabled = NO;

Basierend auf der Bewegung des Telefons konnte ich dann programmatisch scrollen.

CGPoint scrollOffset = CGPointMake(x*20, 0);
[self.baseView setContentOffset:scrollOffset];

In meiner neuen Anforderung erhöht sich der vertikale Inhalt drastisch, so dass ich die contentSize wie folgt haben würde

self.baseView.contentSize = CGSizeMake(6400, 4400);

Ich möchte immer noch programmatisch horizontal blättern, aber dem Benutzer die Möglichkeit geben, durch Berührung NUR vertikal zu blättern. Ich nehme also an, ich müsste scrollEnabled = YES sagen. Aber dies lässt den Benutzer in beide Richtungen blättern.

Muss ich Berührungsereignisse erfassen und sie überschreiben? Wie würde ich erkennen, ob es sich um einen horizontalen oder vertikalen Bildlauf handelt? Was passiert, wenn es sich um einen diagonalen Scrollvorgang handelt?

Ich bin ein bisschen ratlos an dieser Stelle, so dass jeder Beitrag würde sehr geschätzt werden.

4voto

jgriego Punkte 1256

Sie können dies wahrscheinlich durch Verschachtelung von zwei UIScrollViews .

Die innere Bildlaufansicht würde contentSize des tatsächlichen Inhalts und seine tatsächlichen Abmessungen wären die Breite des Bildschirms und die gleiche Höhe wie contentSize mit deaktiviertem Bildlauf.

Die äußere Bildlaufansicht hätte ihre contentSize den Abmessungen der äußeren Bildlaufansicht entsprechen und die tatsächlichen Abmessungen den Bildschirmabmessungen bei aktiviertem Bildlauf entsprechen.

Auf diese Weise kann der Benutzer in der äußeren Ansicht nach oben und unten blättern, während Sie den horizontalen Versatz in der inneren Ansicht programmatisch steuern.

Es ist zwar etwas kompliziert, aber wenigstens muss man keine Unterklassen bilden :D

(Funktioniert auch nur mit iOS 3.0+) aber das scheint kein Problem zu sein)

[Siehe "Scroll View Programming Guide for iOS", Abschnitt "Verschachtelte Scroll-Ansichten"]

4voto

Chaitanya Gupta Punkte 3995

Sie können eine UISwipeGestureRecognizer um eine Reihe von Berührungsereignissen als vertikales oder horizontales Streichen zu erkennen.

// ensure that automatic scrolling is not enabled
scrollView.scrollEnabled = NO;

UISwipeGestureRecognizer *swipeRecognizer = [[UISwipeGestureRecognizer alloc] 
                                           initWithTarget:self 
                                           action:@selector(handleGesture:)];
swipeRecognizer.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown;
[scrollView addGestureRecognizer:swipeRecognizer];
[swipeRecognizer release];

In Ihrem handleGesture: Methode können Sie nun die scrollOffset angemessen. Lesen Sie mehr über UIGestureRecognizer für weitere Einzelheiten.

3voto

fzwo Punkte 9772

Ich denke auch, dass zwei scrollViews hier die Lösung sind. Wenn Sie sie nicht verschachteln möchten, verknüpfen Sie ihre Daten im Controller:

Es gibt eine scrollView, die Ihren Inhalt enthält und bei der die Benutzerinteraktion deaktiviert ist, nennen wir sie contentScrollView und eine unsichtbare scrollView der gleichen Größe darüber, interactionScrollView . Implementieren Sie im Delegate-Controller für beide

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView == interactionScrollView)
    {
        CGPoint offset = CGPointMake(yourProgrammaticallySetHorizontalOffset,interactionScrollView.contentOffset.y);
        [contentScrollView setContentOffset:offset];
    }
}

Sie können das Zoomen auch auf diese Weise verknüpfen.

1voto

fzwo Punkte 9772

Eine andere Möglichkeit, die Sie wahrscheinlich nicht wirklich brauchen, sind horizontale Blättern wollen Sie nur den Versatz des Inhalts festlegen:

Setzen Sie Ihre contentView ganz normal in eine scrollView, aber setzen Sie die contentSize der scrollView als CGPointMake(scrollView.size.width,content.size.height) . Das bedeutet, dass die scrollView niemals horizontal scrollen wird.

Jetzt können Sie mit Ihrem Code den Inhalt horizontal verschieben: content.frame = CGRectOffset(content.frame, yourPreferredOffset, 0) .

Ich habe das nicht getestet, aber ich denke, es wird funktionieren und braucht nur einen scrollView. Sie könnten auch setzen, dass Frame ändern Zeug in eine Animation, um es wie ein Scroll (was es ist) anstelle einer plötzlichen Änderung des Inhalts aussehen zu lassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X