iPhone アプリで、通知センターにアクセスできるステータス バーにジェスチャがあることを確認しました。アプリでその種のトランジションを実装するにはどうすればよいですか? これはスワイプ ジェスチャ レコグナイザで行われていると思いますが、上から下へのスワイプ ジェスチャを含めるにはどうすればよいですか (通知センターを完全なトランジションにドラッグする方法)。これを行うのに役立つサンプルコードまたは何かがありますか? 事前にタック
3 に答える
簡単にできるはずです。プルダウンをトリガーしたい ( ) があるとしますUIView
。mainView
- サブビュー (
pulldownView
) を mainView の上部の可視領域の外側に配置します。 touchesBegan
onを実装しmainView
て、タッチが上位 30 ピクセル (またはポイント) にあるかどうかを確認します。touchesMoved
移動方向が下で表示されていない場合はチェックする場所を実装し、そうであれば下をメインビューの表示領域にpulldownView
ドラッグするか、移動方向が上で表示されているかどうかを確認し、表示されている場合は表示領域から上に押し出します。pulldownView
pulldownView
touchesEnd
がどちらの方向に移動したかを確認して、ドラッグまたはプッシュの移動を終了する場所を実装しますpulldownView
。
編集:
ここにいくつかのサンプルコードがあります。テストされておらず、タイプミスが含まれている可能性があり、コンパイルされない可能性がありますが、必要な本質的な部分が含まれている必要があります。
//... inside mainView impl:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = (UITouch *)[touches anyObject];
start = [touch locationInView:self.superview].y;
if(start > 30 && pulldownView.center.y < 0)//touch was not in upper area of view AND pulldownView not visible
{
start = -1; //start is a CGFloat member of this view
}
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
if(start < 0)
{
return;
}
UITouch *touch = (UITouch *)[touches anyObject];
CGFloat now = [touch locationInView:self.superview].y;
CGFloat diff = now - start;
directionUp = diff < 0;//directionUp is a BOOL member of this view
float nuCenterY = pulldownView.center.y + diff;
pulldownView.center = CGPointMake(pulldownView.center.x, nuCenterY);
start = now;
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
if (directionUp)
{
//animate pulldownView out of visibel area
[UIView animateWithDuration:.3 animations:^{pulldownView.center = CGPointMake(pulldownView.center.x, -roundf(pulldownView.bounds.size.height/2.));}];
}
else if(start>=0)
{
//animate pulldownView with top to mainviews top
[UIView animateWithDuration:.3 animations:^{pulldownView.center = CGPointMake(pulldownView.center.x, roundf(pulldownView.bounds.size.height/2.));}];
}
}
UISwipeGestureRecognizer を実装して、アプリでスワイプ ジェスチャを処理し、検出するスワイプの方向を UISwipeGestureRecognizerDirectionDown として指定できます。
ここにApple のサンプルがあります。一見の価値があるWWDC10 セッションもいくつかあります。そのページの「ジェスチャー認識機能を使用したタッチイベント処理の簡素化」と「高度なジェスチャー認識」をお勧めします。
UIView
フルサイズのサブクラスを使用するだけで、この問題を解決しましたUIScrollView
。UIView
ユーザーが「ドラッグ可能」ではないポイントに触れた場合、タッチイベントをその下にあるビューに渡します。
@implementation MyCustomUIView
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
// Check whether we are on the overlay
if
(
point.y < 460.0f
// Maybe some more restrictions here
)
{
// Block the event, pass to parent
return NO;
}
// Everything okay
return YES;
}
@end
このコードは、UIScrollView
460px未満のタッチにのみ応答します。たとえば、高さが800ピクセルの場合UIScrollView
、460ピクセルから800ピクセルまでタッチできます。開閉して使用するのに十分です。したがって、フルサイズUIScrollView
の場合は、下にあるビューに「触れる」ことができる間、それを上にドラッグして開くことができます。この方法の利点は、すべてのアニメーションがデフォルトの動作を中継し、自分で実装する必要がないことです。