UIScrollViewでスワイプによる上下スクロールを禁止する or 左右スクロールを禁止する
UIScrollViewを絶対に斜めにスクロールさせない方法 | iPhoneアプリ開発まっしぐら★
上記サイト様で斜めスクロールの禁止方法はできるのですが、縦横の禁止はできません。
なにがしたいのかというと、iPhone4の解像度は960x640なわけですが、
960x1280の画像を用意してきた場合、縦方向のスクロールをしたところで特になにがあるわけでもないので
できればスクロールさせたくないわけです。
上記サイト様のコードをほんの少しいじるだけですが、忘備録として記録しておこうと思います。
.h側
{
kILScrollViewDirectionNone = 0,
kILScrollViewDirectionHorizontal = 1,
kILScrollViewDirectionVertical = 2,
} ILScrollViewDirection;
@property (nonatomic, assign) ILScrollViewDirection direction;
@property (nonatomic, assign) CGPoint beganPoint;
.m側
@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];
}
ですので、「.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」として追加します。
2,「addView」のメソッドを記述する「addViewController.h(.m)」をClassesに追加します。
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];
}
}
File's Ownerを右クリックしても「GoToAddView」が見つからない場合は、Identityタブの「Class Identity」が「FirstViewController」になっているか確認してください。
6,「addView.xib」をダブルクリックして Interface Builder を起動します。
File's Ownerを選択し、 Identity タブで「addViewController」クラスを選択します。
さらに、File's Owner を右クリックして、「view」の項目を「View」にドラッグ&ドロップします。
(6.5, addViewと分かりやすいように、このようにラベルを配置してみました。)
7,最後に、FirstViewController.m へAddViewController.hをインポートすれば完成です。
8,ビルドして実行してみましょう。
これでナビゲーションバーを活用した画面遷移のページが、タブバーの構造の中に出来ました。
タブバーとナビゲーションバー
タブバーとナビゲーションバーとを組み合わせた構成は、iPodアプリをはじめ、多くに採用されていますが、残念ながらXcodeのテンプレートに用意されていません。
仕方ないので今回はこれを自作してみます。
1つ目の画面はナビゲーションバー付きのView-basedな画面、
2つ目はナビゲーションバー付きのTabel-View Controller のような画面を配置してみようと思います。
1,Tab Bar Applicationで新規プロジェクト作成(今回はプロジェクト名を「sample」にしました。)
2,「Classes」右クリックから「追加」→「新規ファイル…」で
iOS -> Cocoa Touch Class -> UIViewController subclass を選択。
オプションの「UITableViewController subclass」にチェックを入れて「次へ」。
(ファイル名は自由ですが、サンプルでは「secondViewController.m(.h)」にしています。)
3,「グループとファイル」内、「Resources」にある「MainWindow.xib」をダブルクリック。
Interface Builderが起動します。
4,「Tab Bar Controller」下にある、「Selected First View Controller(First)」と「View Controller(Second)」を削除します。
5,「Library」ウインドウから「Navigation Controller」を選択し、先ほど削除したところを埋め合わせるようにドラッグ&ドロップ。2回行います。
6,5で配置した「Navigation Controller(Item)」下にある「View Controller(Root View Controller)」へ「Library」ウインドウから「Table View Controller」をドラッグ&ドロップ。
7,「First View Controller(Root View Controller)」を選択し、「Inspector」ウインドウの「Attributes」から「NIB Name」を「FirstView」に選択。
8,そのまま「Identity」からも「Class」を「FirstViewController」に選択。
9,次は「Table View Controller(Item)」を選択し、「Identify」から「Class」を「secondViewController」に選択。
これで画面は完成しましたが、このままではテーブルビューのセクション数、行数が指定されていないため、ビルドエラーが出てしまいます。
次は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プログラミングトピックス - Tab Bar ApplicationにNavigation Barを設定
■追記
secondViewControllerの接続先の.xibファイルが作れないという問題点が。
secondView.xibのIdentifyから選択するとエラーが出るようで…
TableViewだからメソッドで書けばいいんですが、xibファイルとの接続方法がわかる方がいればご一報をお願いします。


