0

ピンチ ジェスチャ レコグナイザを使用して、画像のあるボタンのズームを処理しています。を使用してイメージを確立しました

[self.button setImage:image forState:UIControlStateNormal];
[self.button setImage:image forState:UIControlStateHighlighted];

私のピンチ ジェスチャ レコグナイザー ハンドラーでは、frame.size を変更してボタンをスケーリングしています。

self.button.frame = [self makeButtonFrame];

ここで、makeButtonFrame は現在のスケールを使用します (ピンチ ジェスチャ レコグナイザー ハンドラーによって調整されます)。

- (CGRect) makeButtonFrame {
    CGRect frame = CGRectMake (STROKE_WIDTH + DISTANCE_FROM_STROKE, 
                               STROKE_WIDTH + DISTANCE_FROM_STROKE, 
                               self.scale * self.defaultWidth, 
                               self.scale * self.defaultHeight);
    return frame;
}

この手法では、特定のポイントを超えてボタン イメージを拡大縮小できないことがわかりました。そして、その縮尺は特定の画像によって異なるようです (2 倍!)。目盛は3~4くらいのようです。

現在、ピンチ ジェスチャ レコグナイザーでは、スケールを控えめに 3 倍に制限しています。

ただし、最大スケールを決定するためのより分析的な手段が必要です。私が試した一連の画像に基づいて推定するだけではありません。

4

1 に答える 1

1

確かなことは言えませんが、この「制限」は実際には画像のサイズであると思われます。image( ではなく)ボタンを設定するbackgroundImageと、画像がフレームよりも大きい場合、画像が縮小されます。画像が小さい場合は、単純にフレームの中央に配置されます (ただし、タッチに反応する領域はフレームによって制御されます)。あなたが見ているのは、ボタンに配置したときに画像が縮小され、元のサイズに達するまで拡大され、その時点でそれ以上拡大されないことだと思います. これには 2 つの解決策があります。

1: backgroundImageimage プロパティの代わりに を使用します。

[self.button setBackgroundImage:image forState:UIControlStateNormal];

背景画像は、その大きさや画像の歪みに関係なく、常にフレーム全体に拡大されます。

2:transformプロパティを使用してスケーリングします。これは次のように行われます。

self.button.transform = CGAffineTransformMakeScale(scaleAmountX, scaleAmountY);

これには、フレームをまったく調整する必要がないという利点があります。変換マトリックスを使用したスケーリングは、コーナーからではなく中心から行うため、位置オフセットについても調整する必要はありません。また、拡大された領域内でのタッチにも応答する必要があります。

于 2013-07-02T02:28:12.843 に答える