web-dev-qa-db-ja.com

(スケール)あるポイントでUIViewを拡大します

変換について私が理解していないこと。 UIView(メインビュー)の右上隅を拡大して言いたいです。私はCGAffineTransformScaleを使用し、center/anchorPointとCGAffineTransformMakeTranslationの両方を無効に設定しようとしました。

この点にズームインするように翻訳を適切に設定する方法がわかりません。

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

ビューの中心を右上隅に設定しています。つまり、中央の左下のどこかにズームインしているということです。

これを試して

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) {}];

これにより、拡大表示の中心が左下隅に設定され、右上隅が固定された状態で効果的にズームインされます。

このコードには高さがハードコードされていないため、(iPhone 5のiPadに)少し移植性があります。

hプロパティを設定する前に、まずtransformを保存する必要があります。これは、その後、frameの値に依存するべきではないためです。

編集

任意のスケールsで機能させるには、次を使用します。

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) {}];

左下で機能させるには、次を使用します。

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) {}];

右下で機能させるには、次を使用します。

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) {}];

関連項目: IViewを特定のCGPointにスケーリング(ズーム)する方法

34
mvds

誰かがまだ興味を持っている場合のために、ここにSwift 3.0ソリューションがあり、これに正しくフェードアウトする可能性を追加しました。

(2つの列挙型が欠落していることは知っていますが、コードはまだ読み取り可能であり、概念を理解できると思います)

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 })
}
2
Nighthawk