サブビューとしていくつかのビューを追加し、UILongPressGestureRecognizer (これは、UI 要素に指を置いたことを認識するための正しいジェスチャーですか??) と UIPanGestureRecognizer を処理して、画面内のビューを移動します (アイデアを得るには、前の質問を参照してください)。私が構築しているものの -> SO )
指を置いたときにアニメーションを追加し(フリップ、小さなズームのように)、ビューを移動して他のビューを再配置し、最後に配置してビューを並べ替えたいと思います。
私の最初の問題は、ビューを長押しするとジェスチャが認識されるが、このジェスチャが終了していない間はビューを画面に移動して再配置できないことです。どうすればこれを解決できますか?UI要素(UIMyView)を長押しすると、このイベントのアニメーションが実行され、指を離さずに、PanGestureがすでに機能しているように動き始めます。
UIView サブクラスを作成し、目的の UIGestureRecognizers を追加しました。
NSNotificationCenter を使用して、ジェスチャーが発生したことを MainViewController に通知して、ビューのレイアウトを変更できるようにしました (これは正しいアプローチですか、または、イベントを次のレスポンダーにプッシュするなど、このジェスチャーが別の方法で発生したことをスーパービュー コントローラーにプッシュできます)。 ?
drawTextInRect メソッドを使用して文字をビューのサイズに描画します。そのため、その中のビューのレイアウトを変更することはできません。
MainViewController で、特定のビューの NSNotification オブザーバー セレクターで setNeedsDisplay を呼び出しますが、必要に応じてビューが変更されたがまだ表示されていないように、ドラッグ中に空の白いビューが表示されるだけで機能しません。スレッドの一時停止の原因またはなにか。
PanGesture が終了すると、MainViewController に再度通知し、setNeedsDisplay を再度呼び出しますが、設定した (そして設定されている) 背景色以外は機能し、ドラッグ中に表示されるはずの以前の状態のままですが、キャラクターは再び正しく描画されます。
心が糸を引く!?
[編集] いくつかのコード サンプル:
// Inside the UIMyView
-(void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"MyViewNotification" object:self];
// Here I will put my animations, not yet proceed with them
// Code for lastLocation
isViewTouched = YES;
[self setNeedsDisplay];
}
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
// code for moving the View with finger
}
-(void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
isViewTouched = NO;
[self setNeedsDisplay];
}
-(void) drawLayout
{
UILabel* labelToDraw = [[UILabel alloc] init];
labelToDraw.text = @"1";
labelToDraw.font = [self getFont];
labelToDraw.textcolor = [UIColor blackColor];
self.backgroundColor = [UIColor whiteColor];
[labelToDraw drawTextInRect:self.bounds];
}
// The same method with other color values and text exist for another layout.
// Called inside of drawRect:(CGRect)rect when calling setNeedsDisplay as I know and it is
-(void) drawRect:(CGRect)rect
{
if (isViewTouched) [self drawLayout];
else [self drawLayoutMoving];
}
//Superview Controller notified
-(void) handleMyViewNotification:(NSNotification*)notification
{
myViewMoving = [notification object];
[self performSelectorInbackground:@selector(manageArrayOfMyViews) withObject:nil];
}
-(void) manageArrayOfMyViews
{
// animate and reorder the array of views not touched
}
私はObjective-Cが初めてなので、ここで何かが欠けています。私のアプローチが一般的に正しいかどうかを知りたいです。
ありがとうございました。