iPhoneのある日常
Amebaでブログを始めよう!

UIScrollViewでスワイプによる上下スクロールを禁止する or 左右スクロールを禁止する

UIScrollViewでスワイプによる上下スクロールを禁止する or 左右スクロールを禁止する

UIScrollViewを絶対に斜めにスクロールさせない方法 | iPhoneアプリ開発まっしぐら★



上記サイト様で斜めスクロールの禁止方法はできるのですが、縦横の禁止はできません。

なにがしたいのかというと、iPhone4の解像度は960x640なわけですが、

960x1280の画像を用意してきた場合、縦方向のスクロールをしたところで特になにがあるわけでもないので

できればスクロールさせたくないわけです。

上記サイト様のコードをほんの少しいじるだけですが、忘備録として記録しておこうと思います。



.h側
typedef enum
{
kILScrollViewDirectionNone = 0,
kILScrollViewDirectionHorizontal = 1,
kILScrollViewDirectionVertical = 2,
} ILScrollViewDirection;

@property (nonatomic, assign) ILScrollViewDirection direction;
@property (nonatomic, assign) CGPoint beganPoint;

        .m側
@synthesize direction = direction_;
@synthesize beganPoint = beganPoint_;

// スクロール管理の初期化
- (void)scrollViewWillBeginDragging:(UIScrollView*)scrollView {
self.direction = kILScrollViewDirectionNone;
// スクロールしはじめのoffset管理
self.beganPoint = [scrollView contentOffset];
}

// スクロール位置の矯正
- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
CGPoint currentPoint = [scrollView contentOffset];
if ( kILScrollViewDirectionNone == self.direction ) {
// スクロール方向の決定
if ( !CGPointEqualToPoint( currentPoint, self.beganPoint ) ) {
CGFloat moveHorizontal = ABS( currentPoint.x - self.beganPoint.x );
CGFloat moveVertical = ABS( currentPoint.y - self.beganPoint.y );
if ( moveHorizontal < moveVertical ) {
NSLog( @"direction = Vertical" );
self.direction = kILScrollViewDirectionVertical;
} else {
NSLog( @"direction = Horizontal" );
self.direction = kILScrollViewDirectionHorizontal;
}
}
}

currentPoint.y = self.beganPoint.y;
[scrollView setContentOffset:currentPoint];

}
ぶっちゃけ最後の if~else if の部分を外して、強制的に縦固定させただけです。
ですので、「.y」の部分を「.x」に変更することで左右スクロールをさせないことも可能です。

また、本家様の[if~else if]部分を書き換えることで、横方向にスワイプされた時はスクロール・縦方向にスクロールされた時は表示の更新、といった機能を実装することが可能となります。

(↑試してないので、うまく行かない場合は申し訳ありませんm(_ _)m)



また一歩前進。

ナビゲーションバーの活用・画面遷移

前回の記事:タブバーとナビゲーションバー でこれらを組み合わせた画面を作成しました。

現在は
画面1:view-based application(navigation bar付き)
画面2:tab bar application
となっています。

今回はせっかく画面1にnavigation barが付いていますので、「ボタンを押してページ移動・ナビゲーションバーから戻る」機能を実装してみようと思います。




1,まずはFirstView.xibにボタンを追加します。
  次にFirstViewからの遷移先画面をResoursesに「addView.xib」として追加します。

iPhoneのある日常-110415_01addView


iPhoneのある日常-110415_02addView



2,「addView」のメソッドを記述する「addViewController.h(.m)」をClassesに追加します。


iPhoneのある日常-110415_03addView




3,「FirstViewController.h」にメソッドを記述します。


- (IBAction) GoToAddView : (id) sender;



4,「FirstViewController.m」にメソッドを記述します。

// ボタンが押されるとページ繊維

- (IBAction)GoToAddView:(id)sender {


   UIViewController* targetController=[[addViewController alloc]

initWithNibName@"FirstView" bundle:[NSBundle mainBundle]];


   if (targetController != nil) {


[[self navigationController] pushViewController:targetController animated:YES];

[targetController release];

}

}

5,「FirstView.xib」をダブルクリックでInterface Builderを起動し、1で配置したボタンに「GoToAddView:」を接続します。
File's Ownerを右クリックしても「GoToAddView」が見つからない場合は、Identityタブの「Class Identity」が「FirstViewController」になっているか確認してください。



iPhoneのある日常-110415_04addView




6,「addView.xib」をダブルクリックして Interface Builder を起動します。
  File's Ownerを選択し、 Identity タブで「addViewController」クラスを選択します。
  さらに、File's Owner を右クリックして、「view」の項目を「View」にドラッグ&ドロップします。


iPhoneのある日常-110415_05addView




(6.5, addViewと分かりやすいように、このようにラベルを配置してみました。)


iPhoneのある日常-110415_06addView



7,最後に、FirstViewController.m へAddViewController.hをインポートすれば完成です。

#impport "addViewController.h"


8,ビルドして実行してみましょう。


iPhoneのある日常-110415_07addView


iPhoneのある日常-110415_08addView






これでナビゲーションバーを活用した画面遷移のページが、タブバーの構造の中に出来ました。

タブバーとナビゲーションバー

Navigation-based Application と Tab Bar Applicationを組み合わせる方法。

タブバーとナビゲーションバーとを組み合わせた構成は、iPodアプリをはじめ、多くに採用されていますが、残念ながらXcodeのテンプレートに用意されていません。
仕方ないので今回はこれを自作してみます。

1つ目の画面はナビゲーションバー付きのView-basedな画面、
2つ目はナビゲーションバー付きのTabel-View Controller のような画面を配置してみようと思います。




1,Tab Bar Applicationで新規プロジェクト作成(今回はプロジェクト名を「sample」にしました。)


iPhoneのある日常-110410_tab+navi001




2,「Classes」右クリックから「追加」→「新規ファイル…」で
iOS -> Cocoa Touch Class -> UIViewController subclass を選択。
オプションの「UITableViewController subclass」にチェックを入れて「次へ」。
(ファイル名は自由ですが、サンプルでは「secondViewController.m(.h)」にしています。)


iPhoneのある日常-110410_tab+navi002


iPhoneのある日常-110410_tab+navi003


3,「グループとファイル」内、「Resources」にある「MainWindow.xib」をダブルクリック。
Interface Builderが起動します。


iPhoneのある日常-110410_tab+navi004


4,「Tab Bar Controller」下にある、「Selected First View Controller(First)」と「View Controller(Second)」を削除します。


iPhoneのある日常-110410_tab+navi005


iPhoneのある日常-110410_tab+navi006



5,「Library」ウインドウから「Navigation Controller」を選択し、先ほど削除したところを埋め合わせるようにドラッグ&ドロップ。2回行います。


iPhoneのある日常-110410_tab+navi007


iPhoneのある日常-110410_tab+navi008


6,5で配置した「Navigation Controller(Item)」下にある「View Controller(Root View Controller)」へ「Library」ウインドウから「Table View Controller」をドラッグ&ドロップ。


iPhoneのある日常-110410_tab+navi009


iPhoneのある日常-110410_tab+navi010


7,「First View Controller(Root View Controller)」を選択し、「Inspector」ウインドウの「Attributes」から「NIB Name」を「FirstView」に選択。


iPhoneのある日常-110410_tab+navi010


8,そのまま「Identity」からも「Class」を「FirstViewController」に選択。


iPhoneのある日常-110410_tab+navi012


9,次は「Table View Controller(Item)」を選択し、「Identify」から「Class」を「secondViewController」に選択。


iPhoneのある日常-110410_tab+navi013


これで画面は完成しましたが、このままではテーブルビューのセクション数、行数が指定されていないため、ビルドエラーが出てしまいます。
次はXcodeに戻り、「secondViewController.m」を編集していきます。


// セクション数を設定する

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {


 // セクション数を返す

return 2;

}


// 各セクションの行数を設定する

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

 

 // 各セクションの行数を返す

NSInteger rows = 0;

switch (section) {

  case 0:

rows = 2;

   break;

  case 1:

rows = 3;

   break;

  default:

   break;

}

 

 return rows;

}


// 各セクションのヘッダタイトルを設定する

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

 

 NSString *title = nil;

 

 // 各セクションのヘッダタイトルを返す

 switch (section) {

  case 0:

   title = @"セクション1";

   break;

  case 1:

   title = @"セクション2";

   break;

  default:

   break;

 }

 

 return title;

}




上記2つは既存メソッドに追記、一番下のtableView: titleForHeaderInSection: は新規に書いていきます。
今回はセクション数2,行数はそれぞれ2行・3行で作成しました。

編集できたら「ビルドと実行」を選択してください。
画像のように(ラベルは編集していますが)シミュレータが起動すれば成功です。


iPhoneのある日常-110410_tab+navi014



iPhoneのある日常-110410_tab+navi015




スペシャルサンクス:
iPhoneプログラミングトピックス - Tab Bar ApplicationにNavigation Barを設定



■追記

secondViewControllerの接続先の.xibファイルが作れないという問題点が。
secondView.xibのIdentifyから選択するとエラーが出るようで…

TableViewだからメソッドで書けばいいんですが、xibファイルとの接続方法がわかる方がいればご一報をお願いします。