Frage

Ich habe eine Tabellenansicht, in der ich einen Bildlauf durchführen möchte, wenn ich eine Zelle auswähle, sie „herausspringe“ und in der Tabellenansicht verschiebe.Die Tabellenansicht scrollt problemlos und das lange Drücken zum Auswählen einer Zelle funktioniert, aber ich kann in der Tabellenansicht nicht scrollen, wenn ich eine Zelle ausgewählt habe.

Ich habe weitergelesen UIGestureRecognizerDelegate aber ich bin mir nicht sicher, ob das einen Unterschied macht.Ich nenne diese Methode auch

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

Hier ist ein Teil meines Codes:

- (IBAction)longPressGestureRecognized:(id)sender {

UILongPressGestureRecognizer *longPress = (UILongPressGestureRecognizer *)sender;
UIGestureRecognizerState state = longPress.state;
//longPress.delegate = self;

CGPoint location = [longPress locationInView:self.personTableView];
NSIndexPath *indexPath = [self.personTableView indexPathForRowAtPoint:location];

static UIView       *snapshot = nil;        ///< A snapshot of the row user is moving.
static NSIndexPath  *sourceIndexPath = nil; ///< Initial index path, where gesture begins.

switch (state) {
    case UIGestureRecognizerStateBegan: {
        if (indexPath) {
            sourceIndexPath = indexPath;

            UITableViewCell *cell = [self.personTableView cellForRowAtIndexPath:indexPath];
            // capture the color of the cell before blacking out
            savedTextColor = cell.detailTextLabel.textColor;

            // Take a snapshot of the selected row using helper method.
            snapshot = [self customSnapshotFromView:cell];

            // Add the snapshot as subview, centered at cell's center...
            __block CGPoint center = cell.center;
            snapshot.center = center;
            snapshot.alpha = 0.0;
            [self.personTableView addSubview:snapshot];
            [UIView animateWithDuration:0.25 animations:^{

                // Offset for gesture location.
                center.y = location.y;
                snapshot.center = center;
                snapshot.transform = CGAffineTransformMakeScale(1.05, 1.05);
                snapshot.alpha = 0.98;

                // Black out.
                cell.detailTextLabel.alpha = 0;
                cell.textLabel.alpha = 0;
            } completion:nil];
        }
        break;
    }
    case UIGestureRecognizerStateChanged: {
        CGPoint center = snapshot.center;
        center.y = location.y;
        snapshot.center = center;

        // Is destination valid and is it different from source?
        if (indexPath && ![indexPath isEqual:sourceIndexPath]) {

            // ... update data source.
            [dataSingelton saveUpdatedPersonList:(int)indexPath.row sourceIndex:(int)sourceIndexPath.row];
            //[[dataSingelton mutableDataArray] exchangeObjectAtIndex:indexPath.row withObjectAtIndex:sourceIndexPath.row];

            // ... move the rows.
            [self.personTableView moveRowAtIndexPath:sourceIndexPath toIndexPath:indexPath];

            // ... and update source so it is in sync with UI changes.
            sourceIndexPath = indexPath;
        }
        break;
    }

    default: {
        // Clean up.
        UITableViewCell *cell = [self.personTableView cellForRowAtIndexPath:sourceIndexPath];
        [UIView animateWithDuration:0.25 animations:^{
            snapshot.center = cell.center;
            snapshot.transform = CGAffineTransformIdentity;
            snapshot.alpha = 0.1;
            cell.detailTextLabel.alpha = 1;
            cell.textLabel.alpha = 1;
        } completion:^(BOOL finished) {
            [snapshot removeFromSuperview];
            snapshot = nil;
            cell.hidden = NO;
        }];
        sourceIndexPath = nil;
        break;
    }
}

}

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}



- (UIView *)customSnapshotFromView:(UIView *)inputView {

    UIView *snapshot = [inputView snapshotViewAfterScreenUpdates:YES];
    snapshot.alpha = 0.1;
    snapshot.layer.masksToBounds = NO;
    snapshot.layer.cornerRadius = 0.0;
    snapshot.layer.shadowOffset = CGSizeMake(-5.0, 0.0);
    snapshot.layer.shadowRadius = 5.0;
    snapshot.layer.shadowOpacity = 0.4;
    return snapshot;
}

Wenn ich den Delegaten wie folgt auf „Selbst“ setze:

longPress.delegate = self;

Die fähige Ansicht scrollt, aber dann bewegt sich meine ausgewählte Zelle nicht.Was fehlt mir, damit das funktioniert?

* Aktualisiert *Nachdem ich noch etwas gelesen/recherchiert habe, denke ich, dass meine Geste mit langem Drücken auch das Scrollen meiner Tabellenansicht bewältigen muss, damit ich den gewünschten Effekt erreiche (den Bildlaufeffekt auf der TableView in Apples Wetter-App).Der Standard-Bildlauf beginnt sofort mit dem Scrollen der gesamten Tabelle, während die Tabelle nur dann scrollen muss, wenn sich die lange gedrückte Zelle oben oder unten in meiner TableView befindet.Habe ich recht, wenn ich so denke?Ich habe versucht, ein Beispiel zum Aufschlüsseln und Studieren zu finden, hatte aber kein Glück, so etwas zu finden.

** Aktualisiert **Ich versuche also herauszufinden, wie der Scroll-Up-Timer ausgelöst wird, wenn der Benutzer eine Zelle nach oben zieht.Das Problem, das ich gerade habe, besteht darin, herauszufinden, wann sich diese Zelle ganz oben befindet, wenn sie ganz oben in der Tabellenansicht ist. Das ist einfach. Ich könnte so etwas verwenden tableViewHight + 100, aber dieser Code funktioniert nicht, wenn die Tabellenansicht nach unten gescrollt wird.Folgendes habe ich bisher:

NSLog(@"This is table view hight %.2f", tableViewHight);

            NSLog(@"This is content offset %f",  (personTableView.contentOffset.y));

            NSLog(@"Should be 100 place holder %.2f", (tableViewHight - tableViewHight) + personTableView.contentOffset.y + 100);

            NSLog(@"location y %f", location.y);



            // gets called repeatedly
            // Step 1: check to see if we need to start scrolling
            if (location.y < tableViewHight - tableViewHight + 100) {
                // ** top **
                // Step 2: make sure the current y postoin isn't greater then the previous y postion
                if (location. y <= originalLocation.y) {
                   // NSLog(@"This is the offset y %f", self.personTableView.contentOffset.y);

                        // Step 4: check to see if we have a timer and if not create one
                        [self startTimer];


                }
                else{
                    //Step 3: they started to scroll up so end the timer
                    [self endTimer];
                }
            }
            else if(location.y > tableViewHight - 100)
            {
                // ** bottom **
                // Step 2: make sure the current y postoin isn't less then the previous y postion
                if (location. y >= originalLocation.y) {

                        NSLog(@"its less then 0");
                        if (!timer) {
                            // Step 4: check to see if we have a timer and if not create one
                            [self startTimer];
                        }


                }
                else{
                     //Step 3: they started to scroll up so end the timer
                    [self endTimer];
                }
            }
            else{
                // ** middle **
                // Step 2: check to see if we have a timer and if so destory it
                [self endTimer];
            }

Grundsätzlich möchte ich diese if-Anweisung auslösen, wenn die Zelle weniger als 100 Pixel von der Höhe der scrollbaren Tabellenansicht entfernt ist.

War es hilfreich?

Lösung

Von dem UILongPressGestureRecognizer Sie können den Strom erhalten y Position der Berührung.Daraus können Sie berechnen, wie nah an der Unter- oder Oberkante des UITableViewdie Berührung ist.Wenn Sie feststellen, dass es nah genug ist, um mit dem Scrollen zu beginnen, starten Sie eine Wiederholung NSTimer das erhöht oder verringert den contentOffset Ihres UITableView um 1 Pixel, Scrollen Ihrer Tabelle.Ändern Sie die Scrollgeschwindigkeit, indem Sie ändern timeInterval des Timers.

Wenn das UILongPressGestureRecognizer endet, oder wenn die y Bewegt sich die Position der Berührung außerhalb der Bildlaufzone, dann deaktivieren Sie Ihren Timer, wodurch das Bildlauf gestoppt wird.

Wenn Sie abenteuerlustig sind, können Sie die Scrollgeschwindigkeit auch dynamisch erhöhen, wenn sich der Benutzer dem Rand des Bildes nähert UITableView durch Änderung der timeInterval wenn der Benutzer seine Berührung nach oben oder unten bewegt, da diese Art von Funktionalität im Allgemeinen so funktioniert.

Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top