スライドナビゲーションパネルを作成する方法(2)
252185 ワード
次に、スライドアウトナビゲーションパネルを作成する方法(1)
MainViewControllerでmファイルで、次のimport文をファイルの上部に追加します.
次に、次の定数定義を追加します.
次に@interfaceに次のプロパティを追加すると、right viewとその現在のステータスが容易に取得されます.
次にgetRightViewメソッドを見つけ、既存のコードを削除し、次のコードを追加します.
上のコードはgetLeftViewをコピーしたものですが、クラスと属性が異なるだけです.上のコードに何か疑問があれば、前の説明を振り返ってみてください.
以前と同様に、xibファイルに関連するIBActionとIBOutletが接続されています.次はCenterViewControllerです.xibファイルの断面図で、puppiesボタンの接続関係が表示されます.
上図に示すように、kittiesボタンと同様に、puppiesボタンが接続されているIBOutletはrightButton、IBActionはbtnMovePanelLeft:.このボタンはcenter panelのスライドを制御して右側のpanelを表示します.
次にパネルを動かしましょう.
CenterControllerを開きます.mファイルをbtnMovePanelLeft:に次のコードを追加します.
同様に,上記のコードはbtnMovePanelRight:メソッドの実装と何の違いもない.delegateの呼び出し方法はほとんど同じであることがわかります.
以前にmovePanelToOriginalPostionメソッドが実装されていたため、残りのタスクはmovePanelLeftメソッドを追加し、resetMainViewを修正してright panelを処理するだけでよい.
MainViewControllerを開きます.mファイルをmovePanelLeft:メソッドに次のコードを追加します.
上のコードはmovePanelRightメソッドの基本と同じで、ここではあまり説明しません.
次にresetMainViewメソッドを見つけ、既存のコンテンツを次のコードで置き換えます.
上のコードで唯一変更されたのは、if文コードブロック:if(_rightPanelViewControl!=nil)を追加したことです.この文はright panel viewが存在するかどうかを判断します.これは前にleft panel viewをチェックしたのと同じです.そして、_right PanelView Controlは同じ処理をします!
プログラムをコンパイルして実行し、puppiesボタンをクリックすると、次の画面が表示されます.
よさそうですね.
次のセクションでは、ジェスチャー機能を追加する方法について説明します.
プログラムにジェスチャーを追加する処理は非常に簡単で、複雑すぎると思わないで、簡単に実現できます!
やはりMainViewControllerです.mファイルでsetupViewメソッドを見つけ、メソッドの末尾に次のコードを追加します.
次に、MainViewControllerをUIGestureRecognizerDelegateプロトコルに従う必要があります.UIGestureRecognizerDelegateをファイル上部の@interfaceに追加します.追加したコードは次のとおりです.
最後にsetupGesturesメソッドを見つけ、次のコードブロックを追加します.
上記のコードは、UIpanGestureRecognizerを定義し、movePanel:メソッドを割り当て、ジェスチャーが検出されると呼び出されます.(後でmovePanel:メソッドを実装する必要があります.)
次に、panRecognizerを設定します.タッチの最大数と最小数を1に設定し、delegateも設定します.最後に、作成したばかりのpanRecognizerを_に追加します.centerViewController.viewで.
注意:UIGestureRecognizerクラスの詳細については、アップルの公式ドキュメントを参照してください.
次に、もう一つのことをするとジェスチャーでスライドできます.
ジェスチャーが認識されるとmovePanel:メソッドが呼び出されます.だから、本文の最後の任務はこの方法を実現することです.
movePanel:メソッドはshowPanelとpreVelocityの2つのプロパティに使用されます.MainViewControllerでmファイルの@interfaceにこの2つのプロパティを追加します.
movePanel:を見つけて、次のコードを追加します(たくさんありますよ!):
上のコードの注視はすでに機能に対して良い解釈をした.以下に、理解すべき重要な情報を示します.
UIGestureRecognizerStateBegan,UIGestureRecognizerStateEnded,UIGestureRecognizerStateChangedの3つの状態を処理する必要があります.
translationInView:指定したviewの座標系にある位置のpointを返し、そのpointをtranslatedPoint変数に割り当てます.この変数はviewの位置を設定するために使用されます.
velocityInView:ジェスチャーの移動速度を1秒ごとに返します.この変数は方向の変化を決定するのに役立つ.
center,left,right viewを移動し,上記の3つの状態と組み合わせてジェスチャーの位置と速度/方向を決定することができる.
たとえば、ジェスチャーの方向が右の場合、left panelが表示されます.方向が左の場合、right panelが表示されます.コードと関連するコメントを表示することで、各ステータスに何が起こっているかがわかります.
プログラムを再コンパイルして実行します.センターパネルを左または右にスライドさせ、センターパネルの下にあるパネルを表示できるようになりました.
もしあなたが完全に本稿で紹介した方法に従って操作すれば、おめでとうございます.あなたはもうスライド式ナビゲーションパネルの忍者になりました.
本文があなたに役に立つことを望みます!ここでは、本明細書で説明した完全なサンプルエンジニアリング:completed project fileです.
DIYではなく定義済みのライブラリが好きなら、SWRevealViewControllerを見てください.ここの開発者の紹介を見ると、簡単に使えます.
本文の転載:http://beyondvincent.com/category/ios/raywenderlich/
今右側に
MainViewControllerでmファイルで、次のimport文をファイルの上部に追加します.
- #import "RightPanelViewController.h"
次に、次の定数定義を追加します.
- #define RIGHT_PANEL_TAG 3
次に@interfaceに次のプロパティを追加すると、right viewとその現在のステータスが容易に取得されます.
- @property (nonatomic, strong) RightPanelViewController *rightPanelViewController;
- @property (nonatomic, assign) BOOL showingRightPanel;
次にgetRightViewメソッドを見つけ、既存のコードを削除し、次のコードを追加します.
- // init view if it doesn't already exist
- if (_rightPanelViewController == nil)
- {
- // this is where you define the view for the right panel
- self.rightPanelViewController = [[RightPanelViewController alloc] initWithNibName:@"RightPanelViewController" bundle:nil];
- self.rightPanelViewController.view.tag = RIGHT_PANEL_TAG;
- self.rightPanelViewController.delegate = _centerViewController;
-
- [self.view addSubview:self.rightPanelViewController.view];
-
- [self addChildViewController:self.rightPanelViewController];
- [_rightPanelViewController didMoveToParentViewController:self];
-
- _rightPanelViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
- }
-
- self.showingRightPanel = YES;
-
- // set up view shadows
- [self showCenterViewWithShadow:YES withOffset:2];
-
- UIView *view = self.rightPanelViewController.view;
- return view;
上のコードはgetLeftViewをコピーしたものですが、クラスと属性が異なるだけです.上のコードに何か疑問があれば、前の説明を振り返ってみてください.
以前と同様に、xibファイルに関連するIBActionとIBOutletが接続されています.次はCenterViewControllerです.xibファイルの断面図で、puppiesボタンの接続関係が表示されます.
上図に示すように、kittiesボタンと同様に、puppiesボタンが接続されているIBOutletはrightButton、IBActionはbtnMovePanelLeft:.このボタンはcenter panelのスライドを制御して右側のpanelを表示します.
次にパネルを動かしましょう.
CenterControllerを開きます.mファイルをbtnMovePanelLeft:に次のコードを追加します.
- UIButton *button = sender;
- switch (button.tag) {
- case 0: {
- [_delegate movePanelToOriginalPosition];
- break;
- }
-
- case 1: {
- [_delegate movePanelLeft];
- break;
- }
-
- default:
- break;
- }
同様に,上記のコードはbtnMovePanelRight:メソッドの実装と何の違いもない.delegateの呼び出し方法はほとんど同じであることがわかります.
以前にmovePanelToOriginalPostionメソッドが実装されていたため、残りのタスクはmovePanelLeftメソッドを追加し、resetMainViewを修正してright panelを処理するだけでよい.
右側を表示
MainViewControllerを開きます.mファイルをmovePanelLeft:メソッドに次のコードを追加します.
- UIView *childView = [self getRightView];
- [self.view sendSubviewToBack:childView];
-
- [UIView animateWithDuration:SLIDE_TIMING delay:0 options:UIViewAnimationOptionBeginFromCurrentState
- animations:^{
- _centerViewController.view.frame = CGRectMake(-self.view.frame.size.width + PANEL_WIDTH, 0, self.view.frame.size.width, self.view.frame.size.height);
- }
- completion:^(BOOL finished) {
- if (finished) {
-
- _centerViewController.rightButton.tag = 0;
- }
- }];
上のコードはmovePanelRightメソッドの基本と同じで、ここではあまり説明しません.
次にresetMainViewメソッドを見つけ、既存のコンテンツを次のコードで置き換えます.
- // remove left and right views, and reset variables, if needed
- if (_leftPanelViewController != nil)
- {
- [self.leftPanelViewController.view removeFromSuperview];
- self.leftPanelViewController = nil;
-
- _centerViewController.leftButton.tag = 1;
- self.showingLeftPanel = NO;
- }
-
- if (_rightPanelViewController != nil)
- {
- [self.rightPanelViewController.view removeFromSuperview];
- self.rightPanelViewController = nil;
-
- _centerViewController.rightButton.tag = 1;
- self.showingRightPanel = NO;
- }
-
- // remove view shadows
- [self showCenterViewWithShadow:NO withOffset:0];
上のコードで唯一変更されたのは、if文コードブロック:if(_rightPanelViewControl!=nil)を追加したことです.この文はright panel viewが存在するかどうかを判断します.これは前にleft panel viewをチェックしたのと同じです.そして、_right PanelView Controlは同じ処理をします!
プログラムをコンパイルして実行し、puppiesボタンをクリックすると、次の画面が表示されます.
よさそうですね.
次のセクションでは、ジェスチャー機能を追加する方法について説明します.
指を動かして
プログラムにジェスチャーを追加する処理は非常に簡単で、複雑すぎると思わないで、簡単に実現できます!
やはりMainViewControllerです.mファイルでsetupViewメソッドを見つけ、メソッドの末尾に次のコードを追加します.
- [self setupGestures];
次に、MainViewControllerをUIGestureRecognizerDelegateプロトコルに従う必要があります.UIGestureRecognizerDelegateをファイル上部の@interfaceに追加します.追加したコードは次のとおりです.
- @interface MainViewController ()<UIGestureRecognizerDelegate, CenterViewControllerDelegate>
最後にsetupGesturesメソッドを見つけ、次のコードブロックを追加します.
- UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(movePanel:)];
- [panRecognizer setMinimumNumberOfTouches:1];
- [panRecognizer setMaximumNumberOfTouches:1];
- [panRecognizer setDelegate:self];
-
- [_centerViewController.view addGestureRecognizer:panRecognizer];
上記のコードは、UIpanGestureRecognizerを定義し、movePanel:メソッドを割り当て、ジェスチャーが検出されると呼び出されます.(後でmovePanel:メソッドを実装する必要があります.)
次に、panRecognizerを設定します.タッチの最大数と最小数を1に設定し、delegateも設定します.最後に、作成したばかりのpanRecognizerを_に追加します.centerViewController.viewで.
注意:UIGestureRecognizerクラスの詳細については、アップルの公式ドキュメントを参照してください.
次に、もう一つのことをするとジェスチャーでスライドできます.
今すぐビューを移動しましょう
ジェスチャーが認識されるとmovePanel:メソッドが呼び出されます.だから、本文の最後の任務はこの方法を実現することです.
movePanel:メソッドはshowPanelとpreVelocityの2つのプロパティに使用されます.MainViewControllerでmファイルの@interfaceにこの2つのプロパティを追加します.
- @property (nonatomic, assign) BOOL showPanel;
- @property (nonatomic, assign) CGPoint preVelocity;
movePanel:を見つけて、次のコードを追加します(たくさんありますよ!):
- [[[(UITapGestureRecognizer*)sender view] layer] removeAllAnimations];
-
- CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view];
- CGPoint velocity = [(UIPanGestureRecognizer*)sender velocityInView:[sender view]];
-
- if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) {
- UIView *childView = nil;
-
- if(velocity.x > 0) {
- if (!_showingRightPanel) {
- childView = [self getLeftView];
- }
- } else {
- if (!_showingLeftPanel) {
- childView = [self getRightView];
- }
-
- }
- // Make sure the view you're working with is front and center.
- [self.view sendSubviewToBack:childView];
- [[sender view] bringSubviewToFront:[(UIPanGestureRecognizer*)sender view]];
- }
-
- if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {
-
- if(velocity.x > 0) {
- // NSLog(@"gesture went right");
- } else {
- // NSLog(@"gesture went left");
- }
-
- if (!_showPanel) {
- [self movePanelToOriginalPosition];
- } else {
- if (_showingLeftPanel) {
- [self movePanelRight];
- } else if (_showingRightPanel) {
- [self movePanelLeft];
- }
- }
- }
-
- if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateChanged) {
- if(velocity.x > 0) {
- // NSLog(@"gesture went right");
- } else {
- // NSLog(@"gesture went left");
- }
-
- // Are you more than halfway? If so, show the panel when done dragging by setting this value to YES (1).
- _showPanel = abs([sender view].center.x - _centerViewController.view.frame.size.width/2) > _centerViewController.view.frame.size.width/2;
-
- // Allow dragging only in x-coordinates by only updating the x-coordinate with translation position.
- [sender view].center = CGPointMake([sender view].center.x + translatedPoint.x, [sender view].center.y);
- [(UIPanGestureRecognizer*)sender setTranslation:CGPointMake(0,0) inView:self.view];
-
- // If you needed to check for a change in direction, you could use this code to do so.
- if(velocity.x*_preVelocity.x + velocity.y*_preVelocity.y > 0) {
- // NSLog(@"same direction");
- } else {
- // NSLog(@"opposite direction");
- }
-
- _preVelocity = velocity;
- }
上のコードの注視はすでに機能に対して良い解釈をした.以下に、理解すべき重要な情報を示します.
UIGestureRecognizerStateBegan,UIGestureRecognizerStateEnded,UIGestureRecognizerStateChangedの3つの状態を処理する必要があります.
translationInView:指定したviewの座標系にある位置のpointを返し、そのpointをtranslatedPoint変数に割り当てます.この変数はviewの位置を設定するために使用されます.
velocityInView:ジェスチャーの移動速度を1秒ごとに返します.この変数は方向の変化を決定するのに役立つ.
center,left,right viewを移動し,上記の3つの状態と組み合わせてジェスチャーの位置と速度/方向を決定することができる.
たとえば、ジェスチャーの方向が右の場合、left panelが表示されます.方向が左の場合、right panelが表示されます.コードと関連するコメントを表示することで、各ステータスに何が起こっているかがわかります.
プログラムを再コンパイルして実行します.センターパネルを左または右にスライドさせ、センターパネルの下にあるパネルを表示できるようになりました.
どこへ行くか
もしあなたが完全に本稿で紹介した方法に従って操作すれば、おめでとうございます.あなたはもうスライド式ナビゲーションパネルの忍者になりました.
本文があなたに役に立つことを望みます!ここでは、本明細書で説明した完全なサンプルエンジニアリング:completed project fileです.
DIYではなく定義済みのライブラリが好きなら、SWRevealViewControllerを見てください.ここの開発者の紹介を見ると、簡単に使えます.
本文の転載:http://beyondvincent.com/category/ios/raywenderlich/