限られた地域のカスタム マップがあり、ユーザーの位置を正しく表示するように設定しています。マップは、UIScrollView 内の 1600 ピクセルの正方形の画像です。
ユーザーの現在の位置を示す十字線の画像があります。これは、zoomScale 1.0 で目的のサイズです。scrollView をつまんでズームすると、十字線がそれに合わせて拡大縮小されます。サブビューを画面上で同じサイズのままにしたいと思います。
これに関する情報を見つけることができませんでした。これについて最善の方法は何でしょうか?
答えを助けるために私があなたに提供できるものがあれば、私に知らせてください.
どうもありがとう!
編集 -
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
これをさらに調べたところ、マーカーの現在の中心とサイズを取得して調整するために使用しようとした UIScrollViewDelegate メソッドがありますが、これはズームの最後でのみスケーリングされます。ユーザーがズームしている間、マーカーを同じサイズのままにしたいと思います。
編集2-
Cake は以下に素晴らしい回答を提供してくれましたが、私が想像していた方法でこれを実装することはできませんでした。
アルファを 0 に設定して、UIImageView をプレースホルダーとして使用しています。このプレースホルダーは、マップに対して相対的に移動し、ユーザーの位置を示します。これは期待どおりに動作します。残念ながら、これはマップのサブビューであるため、マップに合わせてサイズが変更されます (そのため、所定の位置に留まります)。
以下のCakeの回答を参考にして、非スケーリングの十字線画像を作成し、それを兄弟サブビューとしてスクロールビューに追加しました。Cake がそれらを指摘した後、十字線の新しいフレームを取得するための数学は非常に簡単でした。
CGPoint ULPC = userLocationPlaceholder.center;
float zs = scrollView.zoomScale;
CGRect newFrame = CGRectMake(((ULPC.x * zs) - scrollView.contentOffset.x) - 20, ((ULPC.y * zs) - scrollView.contentOffset.y) - 20, 40, 40);
画像の幅が 40 ポイントの場合。これはセンターに完全に一致します。
私が今抱えている問題は、十字線の画像をプレースホルダーにロックしたままにできないことです。
私は自己呼び出しアニメーションを次のように使用してみました:
-(void)animeUserLocationAttachment
{
[UIView animateWithDuration:0.05
delay:0
options:(UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionCurveLinear )
animations:^{
userLocationDotContainer.frame = newFrame;
} completion:^(BOOL finished){
// Call self
[self animateUserLocationAttachment];
}];
}
スクロール/ズームを開始するとすぐに、これによりアニメーションがロックされ、スクロール/ズームを解除するまで十字線が所定の位置に留まり、位置が正しく更新されます。
これを回避する方法、または適用できる代替方法はありますか?
どうもありがとう
編集3 -
問題の90%をカバーしているため、Cakeの回答を再承認しました。彼の答えに加えて、ScrollViewDelegate メソッドを実装scrollViewWillBeginDragging:
しscrollViewWillBeginDecelerating:
、マップに対する十字線の現在のサイズに合わせてプレースホルダーをスケーリングし、プレースホルダー (マップ イメージのサブビュー) を表示し、十字線イメージを非表示にします。デリゲート メソッドscrollviewWillBeginZooming:withView:
は、マップに合わせてスケーリングされるため、プレースホルダーを表示しません。Cake が推奨するように、この問題について新しい質問を作成します。
対応するメソッド ( scrollViewDidEndZooming:withView:atScale:
、scrollViewDidEndDragging:willDecelerate:
および -scrollViewDidEndDecelerating:`) はすべてプレースホルダーを非表示にし、十字線を再表示します。