0

Ich habe eine UIScrollView, die viele Ansichten enthalten kann. Um ein gutes Scrollen zu ermöglichen (ohne die Inhalte außerhalb der Ansicht beim Scrollen gehen), auf meinem Main.sotryboard, ich habe auf meinem UIScrollView geklickt und dann im Attribut-Inspektoren habe ich die Clip Subviews Eigenschaft erlaubt:Wie programmgesteuert die clipsToBounds-Eigenschaft zu schließen, wenn ein GestureRecognizer beginnt?

The 3rd property is: Clip Subviews

Mein Problem: alle Ansichten, die in meinem UIScrollViews sind ziehbar (da sie alle einen UIPanGestureRecognizer haben Also, wenn ich versuche, sie zu ziehen außerhalb meines UIScrollView, verschwinden sie nur in der Tat sind sie gerade hinter gehen.. jede andere Ansicht

Um Ihnen ein Beispiel zu geben, habe ich andere Komponenten, die den Fall einer Ansicht aus dem Präzedenzfall UIScrollView ermöglichen. Wenn ich mit dem Drag'n'Drop beginne, verschwindet es und taucht wieder in der zweiten Komponente auf, auf die ich die Ansicht fallen gelassen habe.

Was ich versucht habe: Ich habe eine besondere UIPanGestureRecognizer für te drag'n'drop einer Aussicht von diesem UIScrollView kommen. Also, ich habe eigentlich das (die offensichtlich nicht funktioniert, sonst wäre ich nicht hier):

//Here recognizer is the `UIPanGestureRecognizer` 
//selectpostit is the name of the view I want to drag 
if(recognizer.state == UIGestureRecognizerStateBegan){ 
    selectpostit.clipsToBounds = NO; 
} 

Irgendwelche Ideen auf, wie ich das verbessern? Vielen Dank im Voraus.

+0

clipsToBounds auf NO Einstellung sollte für die Eltern erfolgen Aussicht. Scrollen Sie in Ihrem Fall. –

+1

Anstatt die 'clipsToBounds' in der Ansicht, die Sie ziehen möchten, zu ändern, ändern Sie sie in der' scrollView'. Eine weitere Option, die beim Ziehen von Ansichten funktioniert, ist das Erstellen und Steuern eines Bildsnapshot der Ansicht und das Ausblenden der ursprünglichen Ansicht. Wenn Sie mit dem Ziehen fertig sind, positionieren Sie wo nötig – Cjay

+0

Oh, das sieht wirklich gut aus! Vielen Dank. Aber jetzt, wenn ich viel Sicht in meinem Scrollview habe, erscheinen sie, während ich ziehe (ich habe das Umgekehrte gemacht, wenn das Ziehen beendet ist, also clipToBounds = yes if (recognizer.state == UIGestureRecognizerStateEnded). Haben Sie? eine Lösung für das? @ Surya Subenthiran – Kokodelo

Antwort

1

Sie könnten versuchen, scrollView.clipsToBounds bei jedem Start der Geste auf NO zurückzusetzen, aber das würde zu Nebeneffekten führen, wenn während des Ziehens anderer Inhalt außerhalb der Bildlaufansicht sichtbar wird.

Ich würde empfehlen, einen Schnappschuss der ziehbaren Ansicht zu erstellen, wenn das Verschieben beginnt, es auf dem übergeordneten Element der Bildlaufansicht platzieren und verschieben. Ein solcher Ansatz sollte Ihr Problem lösen. Hier

ist der Code:

- (void)onPanGesture:(UIPanGestureRecognizer*)panRecognizer 
{ 
    if(panRecognizer.state == UIGestureRecognizerStateBegan) 
    { 
     //when gesture recognizer starts, making snapshot of the draggableView and hiding it 
     //will move shapshot that's placed on the parent of the scroll view 
     //that helps to prevent cutting by the scroll view bounds 
     self.draggableViewSnapshot = [self.draggableView snapshotViewAfterScreenUpdates: NO]; 
     self.draggableView.hidden = YES; 
     [self.scrollView.superview addSubview: self.draggableViewSnapshot]; 
    } 

    //your code that updates position of the draggable view 

    //updating snapshot center, by converting coordinates from draggable view 
    CGPoint snapshotCenter = [self.draggableView.superview convertPoint:self.draggableView.center toView: self.scrollView.superview]; 
    self.draggableViewSnapshot.center = snapshotCenter; 

    if(panRecognizer.state == UIGestureRecognizerStateEnded || 
     panRecognizer.state == UIGestureRecognizerStateCancelled || 
     panRecognizer.state == UIGestureRecognizerStateFailed) 
    { 
     //when gesture is over, cleaning up the snapshot 
     //and showing draggable view back 
     [self.draggableViewSnapshot removeFromSuperview]; 
     self.draggableViewSnapshot = nil; 
     self.draggableView.hidden = NO; 
    } 
} 
+0

Wie mache ich einen Schnappschuss von meinem scrollView?Btw diese Antwort sieht wirklich nett aus – Kokodelo

+0

Sie müssen keinen Snapshot der Bildlaufansicht erstellen, Snapshot wird für jedes ziehbare Element erstellt, sobald es verschoben wird –

1

ich Sie in diesem Artikel durch ray Wenderlich aussehen empfehlen Moving Table View Cells with a Long Press Gesture

Es wird erklärt, wie Snapshots erstellen

+0

Vielen Dank, ich werde es mir ansehen, aber Sie sollten diese Antwort als Kommentar erhalten Nein? Das ist nicht mein anfängliches Problem. – Kokodelo

Verwandte Themen