UIScrollViewを垂直方向にのみ拡大するには?

グラフ上に軸を表現するために使用しているUIScrollViewがあります。ユーザーが通常のピンチ動作を使用して軸をズームインできるようにしたいが、水平方向ではなく垂直方向にのみスケールすることができる。

私の質問はこちらに似ていますが、私はそこに提案された解決策を試しました(サブビューのSetTransformメソッドをオーバーライドして一方向のスケーリングを無視するようにしました)。垂直方向ではなく水平方向にスケーリングを制限するときは完全に機能します。私が垂直に実装しようとすると、最初のピンチアクションはうまくいきますが、それ以降のピンチは効果を出す前にズームスケールを1にリセットしているようです。

誰もがこの動作を引き起こしている可能性があることを知っていますか?

MonoTouchを使用していますが、Objective-Cを使用した回答は問題ありません。

4
UIScrollViewを悪用する代わりに、ピンチジェスチャ認識機能をビューに追加し、スケーリング変換を使用して自分自身をズームする必要があります。ゾーミングが完了したら、ビューを更新します(グラフであればそれを再レンダリングする必要があります)、UIScrollViewのコンテンツサイズを変更して、ドンしています。
追加された 著者 Krumelur,
@Krumelurこれは UIScrollView の悪用ではないと思います。私はスクロールビューがこれを行う正しい方法だと思います。勢いの物理学、そして UIScrollView のすべてのものは、自分自身を転がすのは間違いですが、それをやる方法はわかりません。おそらくWWDCのセッションビデオを見ているかもしれません。
追加された 著者 Abhi Beckert,
また、いくつかのコードを投稿してください。なぜなら、問題はあなたが物事をまとめる方法にあるかもしれないからです
追加された 著者 QED,

4 答え

あなたが試しているもののサンプルコードを提供するともっと役に立ちますが、試してみるべきいくつかの行を与えています。実際にはコンテンツサイズの幅をiPhoneの画面サイズと同じ「320」にする必要があります。

scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 45,320,480)];   
scrollView.contentSize = CGSizeMake(320,1000);
scrollView.showsVerticalScrollIndicator = YES;

MonoTouchのバージョンは次のとおりです。

scrollView = new UIScrollView (new RectangleF (0, 45, 320, 480)) {
    ContentSize = new SizeF (320, 1000),
    ShowVerticalScrollIndicator = true
};

それが役に立てば幸い.. :) はい、それが役に立ったら答えを受け入れることを忘れないでください:D

2
追加された
それがあなたのために働いているかどうかを確認してください...
追加された 著者 mAc,
ちょっと!!!あなたの質問に関して私がした混乱のために非常に残念ですが、私はあなたがすでにこの作業を行っているかもしれないと思いますが、このリンクをチェックしないと - > stackoverflow.com/questions/1423119/… 、それはあなたを助けるかもしれません。
追加された 著者 mAc,
これはズームではなくスクロールに関するものです。私が後にしたのは、挟まれたときにスケールを垂直方向に変更したが、参照した他の質問と同様に同じスケールを水平に保ったスクロールビューでした。
追加された 著者 rankAmateur,

私はこの質問がかなり前に投稿されたことを知っていますが、ここではこの問題に取り組んでいる人のための答えです。

私はrankAmateurにリンクした質問を見ました。あなたのニーズに合ったソリューションを修正する簡単な方法は、CGAffineTransformの "a"プロパティをsetTransform:メソッドの "d"プロパティに置き換えることです。

- (void)setTransform:(CGAffineTransform)newValue;
{
 CGAffineTransform constrainedTransform = CGAffineTransformIdentity;
//constrainedTransform.a = newValue.a;
 constrainedTransform.d = newValue.d;
 [super setTransform:constrainedTransform];
}

私はCGAffineTransormにあまり精通していませんが、これは私のために働きました。ドキュメンテーションをブラウズした後、 "a"プロパティはビューのx軸に対応し、 "d"プロパティはビューのy軸に対応しています。

編集

だから、本当に問題が何であるかを理解した後、私はこれをさらに掘り下げてしまいましたが、私はちょっと困っていますが、rankAmateurが上で述べたのと同じ振る舞いを経験したことで、CGAffineTransformが完全にうまく動作することは信じられないほど珍しいようですズームは水平方向にのみ拘束されますが、垂直方向にのみ拘束されている場合はズームスケールされません。

私が提供できる唯一の仮説は、Core GraphicsとUIKitのデフォルトの異なる座標系とは何かがあるかもしれないということです。これらの座標系では、x軸は同じように機能し、y軸は逆に機能するからです。おそらく、これは前述のsetTransformのオーバーライドで混乱を招くかもしれません。

2
追加された
うわー..同じことに苦しんだ後、この質問は過去2週間を指しています。私は本当にこの質問に本当に答えなかったことに気付きました。申し訳ありませんrankAmateur。質問を正しく理解した人は、これに対する解決策を見つけましたか、あるいは望みの結果を得るための別の方法を見つけましたか?
追加された 著者 starryVere,

この回答は、starryVere(thumbs up!)の回答に大きく依存しています。

これはSwiftのStarryVereのコードです。ズームされたUIViewサブクラスにあります:

var initialScale: CGFloat = 1.0
override var transform: CGAffineTransform {
    set{
        //print("1 transform... \(newValue), frame=\(self.frame), bounds=\(self.bounds)")
        var constrainedTransform = CGAffineTransformIdentity
        constrainedTransform.d = self.initialScale * newValue.d//vertical zoom
        //constrainedTransform.a = newValue.a//horizontal zoom
        super.transform = constrainedTransform
        //print("2 transform... \(constrainedTransform), frame=\(self.frame), bounds=\(self.bounds)")
    }
    get{
        return super.transform
    }
}

コメントアウトされたプリントは、変換中に境界線やフレームがどうなるかを理解するのに非常に役立ちます。

今スケール問題に:

含まれているUIScrollViewDelegateのscrollViewDidEndZoomingメソッドは、パラメータスケールを持ちます。私のテストによると、このパラメータスケールには、CGAffineTransformIdentityを使用して1.0に設定した水平の倍率であるzoomedView.transform.aという値が含まれています。スケールは常に1.0です。

修正は簡単です:

func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
    let myScale = zoomView.transform.d

}

水平ズームの場合にスケールを使用するようにmyScaleを使用します。

0
追加された

同じ問題で苦労した後、私は回避策を考え出すことができました。 このコードをsetTransformメソッドに使用します。

<div class="snippet" data-lang="js" data-hide="false"> <div class="snippet-code">

-(void)setTransform:(CGAffineTransform)transform
{
    CGAffineTransform constrainedTransform = CGAffineTransformIdentity;
    constrainedTransform.d = self.initialScale * transform.d;
    constrainedTransform.d = (constrainedTransform.d < MINIMUM_ZOOM_SCALE) ? MINIMUM_ZOOM_SCALE : constrainedTransform.d;
    
    [super setTransform:constrainedTransform];
}
                                                                          
</div> </div>

scrollViewWillBeginZoomingデリゲートメソッド内からinitialScaleプロパティを設定します。

0
追加された