webentwicklung-frage-antwort-db.com.de

(Skalieren) Zoomen Sie an einer Stelle in eine UIView

Etwas, das ich über Transformationen nicht verstehe. Ich möchte vergrößern, um die obere rechte Ecke einer UIView (die Hauptansicht) auszudrücken. Ich benutze CGAffineTransformScale und habe versucht, sowohl den center/anchorPoint als auch CGAffineTransformMakeTranslation ohne Erfolg zu setzen.

Ich kann nicht herausfinden, wie die Übersetzung richtig eingestellt wird, damit dieser Punkt vergrößert wird.

CGAffineTransform tr = CGAffineTransformScale(self.view.transform, 2, 2);

[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
            self.view.transform = tr;
            self.view.center = CGPointMake(480,0);

} completion:^(BOOL finished) {}];
20
akaru

Sie legen die Mitte der Ansicht in der oberen rechten Ecke fest. Das heißt, Sie zoomen irgendwo links unten in der Mitte heran.

Versuche dies

CGAffineTransform tr = CGAffineTransformScale(self.view.transform, 2, 2);
CGFloat h = self.view.frame.size.height;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
    self.view.transform = tr;
    self.view.center = CGPointMake(0,h);
} completion:^(BOOL finished) {}];

Dadurch wird die Mitte der vergrößerten Ansicht auf die linke untere Ecke eingestellt, und die obere rechte Ecke wird fixiert und vergrößert.

Dieser Code hat nicht die fest codierte Höhe, die etwas portabler ist (auf einem iPad des iPhone 5).

Sie müssen zuerst h speichern, bevor Sie die Eigenschaft transform festlegen, da Sie sich danach nicht mehr auf den Wert von frame verlassen sollten.

edit

Verwenden Sie Folgendes, damit es für jede s Skala funktioniert:

CGFloat s = 3;
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
    self.view.transform = tr;
    self.view.center = CGPointMake(w-w*s/2,h*s/2);
} completion:^(BOOL finished) {}];

Damit es unten links funktioniert, verwenden Sie Folgendes:

CGFloat s = 3;
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
    self.view.transform = tr;
    self.view.center = CGPointMake(w*s/2,h-h*s/2);
} completion:^(BOOL finished) {}];

Verwenden Sie diese Option, damit es unten rechts funktioniert:

CGFloat s = 3;
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
    self.view.transform = tr;
    self.view.center = CGPointMake(w-w*s/2,h-h*s/2);
} completion:^(BOOL finished) {}];

Siehe auch: Skalieren (Zoomen) einer UIView auf einen bestimmten CGPoint

34
mvds

Falls sich noch jemand dafür interessiert, hier ist die Swift 3.0-Lösung, zu der ich die Möglichkeit hinzugefügt habe, sie korrekt auszublenden.

(Ich weiß, dass zwei Aufzählungen fehlen, aber der Code ist immer noch lesbar und ich denke, Sie werden das Konzept erhalten.)

func animateZoom(direction: ZoomDirection, type: ZoomType, duration: Double = 0.3, scale: CGFloat = 1.4) {
    var cx, cy: CGFloat
    var tr: CGAffineTransform = CGAffineTransform.identity

    if (type == .IN) { tr = self.transform.scaledBy(x: scale, y: scale) }

    let h: CGFloat = self.frame.size.height;
    let w: CGFloat = self.frame.size.width;

    if (type == .IN) {
        switch direction {
        case .LEFT_DOWN:
            cx = w*scale/2
            cy = h-h*scale/2
            break
        case .LEFT_UP:
            cx = w*scale/2
            cy = h*scale/2
            break
        case .RIGHT_UP:
            cx = w-w*scale/2
            cy = h*scale/2
            break
        case .RIGHT_DOWN:
            cx = w-w*scale/2
            cy = h-h*scale/2
            break
        }
    } else {
        cx = w/scale/2
        cy = h/scale/2
    }

    UIView.animate(withDuration: duration, delay: 0, options: [.curveEaseInOut], animations: {
        self.transform = tr
        self.center = CGPoint(x: cx, y: cy)
    }, completion: { finish in })
}
1
Nighthawk