忍者ブログ

[PR]

2024年03月19日
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

iOS6における画面回転への対応方法

2013年04月07日
iOS5や6になって画面の表示前に出されるメッセージ(一般的な言い方をすると関数でしょうか)群にかなり変更があり、昔のプロジェクトのままだとなんだか画面のレイアウトがおかしいぞということになりやすいです。とりあえず自分の経験でこうすれば良いのではないかという対処法について書いてゆきます。

まず、画面を表示させたときにレイアウトに問題がある場合には、その問題のあるパーツを管理するViewControllerのメソッドファイル内で、viewWillAppear:の中で初期化するようにしておくと良いです。現在ない状態なら作っておきましょう。画面の回転状態でレイアウトを変更する必要がある場合には、現在の画面の回転状態を[[UIApplication sharedApplication]statusBarOrientation]で取得します。横向きのそれぞれで別のレイアウトにすることは稀ですから、画面が横向きかどうかをUIInterfaceOrientationIsLandscape()マクロをif文の中に放り込んで、カッコの中に先ほどの[[UIApplication sharedApplication]statusBarOrientation]を入れて画面が横向きかの判定をすれば良いでしょう。回転状態などの判定部分についてまとめると以下のような感じです。

    UIInterfaceOrientation interfaceOrientation=[[UIApplication sharedApplication]statusBarOrientation];
    if (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad) {
        if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) {
            // iPadで画面が横向きのときの初期レイアウトを以下に追加
        } else {
            // iPadで画面が縦向きのときの初期レイアウトを以下に追加
        }
    } else if(UIInterfaceOrientationIsLandscape(interfaceOrientation)){
        // iPhone/iPod touchで画面が横向きのときの初期レイアウトを以下に追加
    } else {
        // iPhone/iPod touchで画面が横向きのときの初期レイアウトを以下に追加
    }

そしてshouldAutorotateToInterfaceOrientation:にはとりあえず向きに応じてYESで回転許可、NOで回転不可を返す部分だけは(iOS6以上では呼び出されることすら無いのですが)一応書いておいて、実際に回転でレイアウトをいじる部分に関してはwillAnimateRotationToInterfaceOrientation:duration:の中でtoInterfaceOrientationを使って仕分けを行って、実際のレイアウト変更を行うという形になります。

これだけやればiOS6以上でレイアウトが崩れる問題は解決出来るでしょう。当然ながらstoryboradやnibファイルで作っているUIパーツについては事前にヘッダ側でIBOutletを含むプロパティを作成して接続済みにしておきましょう。
PR

Tiny3D 3.6公開

2013年03月27日
バージョンアップの予告をした3.6ですが、公開開始となったのでお知らせします。
出力センターなどに持ち込み3Dプリンタで立体物の作成をする場合、どうやらDXFよりもSTLをサポートしている出力センターのほうが多いらしい。ならばSTLの出力も検討してみよう。今回のバージョンアップはそんな思いつきから始めたものでした。実際にそのような需要がどの程度あるのかは分かりませんが、持ち込むために他のソフトで再コンバートしなくてすむのであれば便利かもしれませんね。

バージョンアップ予告

2013年03月20日
Tiny3Dの次期バージョンを開発中です。前回のバージョンアップはとりあえずiOS6で画面が乱れず表示できるようにというのが主要な目的になっていたのですが、今回は機能の追加も行います。追加予定の機能は、STL出力のサポート、iTunesのファイル共有機能を使ってのファイルのインポート、エクスポートを行う機能になります。

オブジェクトファイルをSTL形式、DXF形式、独自形式(中身はxml)の3つで出力でき、DXF形式と独自形式についてはインポートも出来るというのが3.6での追加機能となる予定です。iTuneを経由してパソコン側にデータを吸い出したり、逆に取り込んだりが出来るようになります。STLの取り込みは現状ではサポートしませんが、次のバージョンで内部形式への変換ルールを考えて実現出来れば良いななどと思っています。全部三角形エレメントへの変換になるのでデータ量によっては重くなりそうですが。

デバックのときだけコンソールに出力する(for Apple LLVM compiler)

2013年01月31日
以前に『デバックのときだけコンソールに出力する』という記事を書きました。その記事を書いたときはXcodeの標準コンパイラがGCCでしたが、今はコンパイラがApple LLVM compilerに変わっています。現状でもこの方法が使えるのか気になったので少し調べてみましたが、結論から言うと何も細かい設定をせずメソッドファイルに以下を追加するだけで使えます。

#ifdef DEBUG

#define NSLog_for_DEBUG NSLog

#else

#define NSLog_for_DEBUG //

#endif


理由はプロジェクトのBuild SettingsタブにあるPreprocessingセクションにあるPreprosessor Macrosの項目で、もとからDEBUG=1という設定がされているためです。そのため何もせずにメソッドに上記を追加しておいて、NSLogをNSLog_for_DEBUGに置換すれば、その出力に関してはデバックの時だけログ出力するようになります。以前のコンパイラの頃に使っていたプロジェクトファイルを変換した場合でもこの設定になると思われますので、その場合も特に問題なく使えると思います。

ストーリーボードとは

2012年10月10日
久々の更新です。最近のXcodeで使える機能としてストーリーボードというものがあります。今回はそれについて書いてゆきたいと思います。

これまでの状態では、画面のデザインをInterface Builderで作って、画面の移動などを行うのは全てコードを書いて行っていました。多くの場合は現在の画面から他の画面へ移る際には、現在の画面のNavigationControllerに対してpushViewController:animated:を送るという具合です。

 

    [self.navigationController pushViewController:controller animated:YES];

 
これで今の画面が左へとスクロールし、新しい画面へと移動させていました。ストーリーボードではこれらの動きをInterface Builder側で見える形にして扱う事ができます。例えばあるTableViewControllerのセルをタップして、次のTableViewControllerにスクロールする場合には、Interface Builder側では以下のような操作をします。
 
  1. Interface Builder側で移動元のセルを選択状態にしておきます。
  2. Controlキーを押しつつ、移動先のTableViewControllerまでマウスカーソルをクリックしたままでドラッグし、クリックを終了します。
  3. マウスカーソルの右下にメニューが出るので、Selection Segueの項目のpushを選びます。
  4. ViewController間が矢印で接続されるので、矢印中央のマークをクリックし、Attributes inspectorを表示します。
  5. Identifierに任意の名前をつけます。StyleがPushになっているのを確認します。

実際に画面の移動が行われる時には、移動元のViewControllerのメソッドファイル内にあるprepareForSegue:sender:が呼ばれます。そこで移動先のViewControllerに対して必要な情報(タップされたセルの示すデータオブジェクトなど)を渡します。下はその一例で、選ばれたセルの行番号(0以上のNSInteger型変数)を渡しています。移動先のViewControllerはUIStroryboardSegueのdestinationViewControllerで取得出来ます。画面内にボタンを配置して、そのボタンを押したらセルをタップした時とは別の画面(設定画面など)に遷移させる、といったような拡張が容易にできるように、先ほど上で設定したidentifierの名前で条件分岐させるようにしていますが、拡張の予定が無いならif文で分岐させる必要はありません。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{

    if ([[segue identifier] isEqualToString:@"pushToSelectQuest"]) {

        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

        BDSelectQuestViewController *controller =

        (BDSelectQuestViewController *)[segue destinationViewController];

        [controller setSelectedAreaIndex:indexPath.row];

    }

}

なお、ストーリーボードを使いたい場合には、新規プロジェクトを作成する時にUse Storyboardsにチェックを入れてください。これでnibファイル(拡張子はxibでしたが)の替わりにstoryboadファイルが作成されます。

iOS6発表

2012年06月12日
例年通りのイベントでiOS6が発表されました。サポートされるのはiPhone 3GS以降、第4世代iPod touth、iPad 2以降ということで、第3世代iPod touthと初代iPadはOS更新がストップすることになるようです。これまでハードウェア的には問題ないんじゃないかと言われていた第3世代iPadで、Siriが解禁になっています。

開発者にとってはアップル製アプリとの連携がらみでいろいろ変更がありそうですね。現在のところ新ハードの情報は明らかになっていませんが、9月頃には少なくともiPod touchとiPhoneについては何か発表がありそうな気がします。

iOS5.1.1提供開始はいいけれど

2012年05月08日
iOS5.1.1が提供開始になっているのですが、開発者はまだ手を出さない方がよいかもしれません。
というのも、Xcode 4.3.2の最新ビルド4E2002において、非サポートデバイス扱いになってしまうからです。
Xcode側のアップデートが提供されるまで、iOS5.1.1にした実機では動作テストができなくなります。
まあ、バージョンダウンさせればよいのかもしれませんが、それにも時間がかかります。
もう少し様子をみてからバージョンアップした方がよさそうです。

2012年5月8日13:25追記
バージョンアップした本体を一度接続解除、再度接続し直したところ非サポートデバイス扱いではなくなりました。接続したままの単独バージョンアップではデバック用の設定等をしてくれないだけみたいです。そのためバージョンアップしても特に問題はなさそうです。

Xcodeの変更点

2012年04月29日
ご無沙汰してるあいだにXcodeも随分と変化していました。最近のXcodeで変更になっている主な部分は、

  • ストーリーボードの導入
  • ARC(Automatic Reference Counting)の導入

といったところでしょうか。
以前にInterface BuilderがXcodeと一体になった事はブログで取り上げたと思いますが、ストーリーボードはさらに一体化を推し進め、画面(シーン)間の関係もUI設計の側で扱えるようになっています。また、ARCの導入をすると自分でretainとreleaseを書かなくても良くなり(実際のところ書いては駄目になる)、多くのクラスでreleaseが廃止されています。しばらくはドキュメントを見ながらの格闘になりそうです。
 | HOME | 次のページ »