Domanda

aveva precedentemente implementato intercettazioni per ingrandire e ora abbiamo deciso di utilizzare le icone invece che si ingrandire il centro di che cosa è attualmente visualizzato, e ci piacerebbe riutilizzare il codice che abbiamo avuto per il nostro rubinetto per diminuire dal vogliamo che lo stesso effetto, ma ora non sappiamo cosa da passare al punto centrale.

Stiamo usando il

(CGRect) zoomRectForScale: (float) withCenter scala: (CGPoint) Centro

metodo che ha usato per accettare un cgpoint centro dalla riconoscitore gesto che abbiamo usato per tap zoom; tuttavia, dal momento che non è più stiamo usando il sistema di riconoscimento gesto che stiamo andando ad avere per capire cosa cgpoint a passarlo. Inoltre, questo metodo ha funzionato per lo zoom del rubinetto in modo da non penso che questo è dove stiamo avendo il problema.

Abbiamo provato a fare questo

    centerPoint = [scrollView contentOffset];
    centerPoint.x += [scrollView frame].size.width / 2;
    centerPoint.y += [scrollView frame].size.height / 2;
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:centerPoint];

Che dovrebbe calcolare l'attuale centro e poi passarlo a zoomRectForScale, ma non funziona (si ingrandisce a destra del centro).

Credo che il problema probabilmente ha qualcosa a che fare con il fatto che stiamo passando al centro dell'immagine prima di applicare lo zoom, e forse dovremmo essere il superamento di un centro di scala. Qualcuno ha qualche esperienza con questo, o ha qualche idea su come dovremmo calcolare il centro?

È stato utile?

Soluzione

Abbiamo ottenuto lavorando e ho pensato che avrei posto quello che abbiamo finito per fare

 /**
 Function for the scrollview to be able to zoom out
 **/

-(IBAction)zoomOut {

    float newScale = [scrollView zoomScale] / ZOOM_STEP;
    [self handleZoomWith:newScale andZoomType: FALSE];
}

/**
 Function for the scrollview to be able to zoom in
 **/

-(IBAction)zoomIn {

    float newScale = [scrollView zoomScale] * ZOOM_STEP;
    [self handleZoomWith:newScale andZoomType: TRUE];
}

-(void)handleZoomWith: (float) newScale andZoomType:(BOOL) isZoomIn {

    CGPoint newOrigin = [zoomHandler getNewOriginFromViewLocation: [scrollView contentOffset] 
                                                         viewSize: scrSize andZoomType: isZoomIn];
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:newOrigin];
    [scrollView zoomToRect:zoomRect animated:YES];
}

e poi in una classe zoomHandler abbiamo avuto questa

-(CGPoint) getNewOriginFromViewLocation: (CGPoint) oldOrigin 
                               viewSize: (CGPoint) viewSize
                            andZoomType:(BOOL) isZoomIn {

    /* calculate original center (add the half of the width/height of the screen) */ 
    float oldCenterX = oldOrigin.x + (viewSize.x / 2);
    float oldCenterY = oldOrigin.y + (viewSize.y / 2);

    /* calculate the new center */
    CGPoint newCenter;
    if(isZoomIn) {
        newCenter = CGPointMake(oldCenterX * zoomLevel, oldCenterY * zoomLevel);
    } else {
        newCenter = CGPointMake(oldCenterX / zoomLevel, oldCenterY / zoomLevel);
    }

    /* calculate the new origin (deduct the half of the width/height of the screen) */
    float newOriginX = newCenter.x - (viewSize.x / 2);
    float newOriginY = newCenter.y - (viewSize.y / 2);

    return CGPointMake(newOriginX, newOriginY);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top