Re:

感銘高き名言は「1%のひらめきがなければ99%の努力は無駄である」(トーマス・エジソン)

カテゴリ:開発 > Xcode

まじかよ…。

今日まで気づかないなんて、自ら使ってなかったのバレバレじゃん。

よーし、iOS7対応で申請しちゃうぞ!とか意気込んでUI手直ししてたら、動いてない!


icon_120

かいけぼ!
https://itunes.apple.com/jp/app/id695083171

13


どうやら、ホーム画面に追加したショートカットでフルスクリーンモード起動させると動かないようだった。

<meta name="apple-mobile-web-app-capable" content="yes">

このタグね! 

何が原因か分からず、ほぼネイティブ側のソースを疑ってました。


フルスクリーンモードではない場合、URL欄がコピーできる不都合はあるけれど…動作させることが先決なので仕方ありません。



アプリ内から別のスキーマ呼び出して起動するとか、URLのリンククリックでとかの利用なら何も問題ありませんが、このアプリの特性である data: スキーマで表示させているページをホーム画面に追加させて、そのショートカットによるアプリ起動という方法の場合は iOS7 からだとフルスクリーン起動によるコールはダメなようです。


サーバ側のHTML修正で済みましたが、重ねて 7.0 以上のみに対応したアプリで再申請しました!
 

UIScrollViewDelegate をプロトコル定義する。

 
self
.webView.scrollView.delegate = self; デリゲートに自身を設定する(カスタムクラスとか作ったのであればそれらを設定する  = [[CustomScrollViewController alloc] init] とか)。

  • ドラッグ開始
    scrollViewWillBeginDragging

  • ドラッグ終了
    scrollViewDidEndDragging

  • 止まった!
    scrollViewDidEndDecelerating


scrollTop 位置 self.webView.scrollView.contentOffset.y プロパティで取れる。


そんな感じだった。


あと、
AVAudioPlayer 使ってプレイしてたから音楽聴きながらアプリで遊べないじゃーんってことも発見したので、ふむふむ…うん。



まず? MediaPlayer.framework をリンクする、と。

ヘッダでインポート。

MPMusicPlayerController *mplayer = [MPMusicPlayerController iPodMusicPlayer];


[mplayer 
playbackState] で Stop か Pause 状態だったらプレイさせるようにすればいいですか?


意図したことはできてる気がするから、たぶん、それでイイんですよね、きっと。 



追記:

オーディオセッションを初期化した後チェックしないといけないようだった。

上記のチェックだとアプリ起動時こそクリアできたが…バックグラウンド→曲再生→フォアグラウンドに移行してくると無理だったでござる(´・ω・`)


オーディオセッションプログラミングガイド
https://developer.apple.com/jp/devcenter/ios/library/documentation/AudioSessionProgrammingGuide.pdf

51ページ「アプリケーション起動時にほかのオーディオが再生中かをチェックする」コードでOK!


3.5インチではステータスバーは表示せず、4インチでは表示させつつ、iOS7のフラットデザインでコンテンツにかぶらせないようにするためのメモ。

※iOS7.1から、iPhoneアプリを非RetinaのiPad(iPad miniとか)で動作させるとステータスバーの表示が画面にかぶるようになった。これはどんな設定でも消せない模様…(シミュレータで確認しても挙動は分かるが、RetinaのiPadだとかぶらない。バグとの見解)
消えないのは仕様っぽいけど、消し方が分かる人がいたら教えて下さい。

なお、iOS8.0からは消えるので、7.1で表示されるようになったのはバグっぽい。



iOS6までの4インチではステータスバーの高さ20pxにUIWebViewなどがかぶることはなかった。

けど、、、iOS7から平気ではかぶるからね!w

電波状況や時間、バッテリーがコンテンツにかぶっては邪魔なんです…。

05

とりあえず、アプリケーション起動中の画面ではいずれの場合もステータスバーは表示させないので、「Hide during application launch」にちぇっく。

57

余談だけど、iOS7でステータスバーをnoneにしてるのに消えない!という場合、Info.plistプロパティに「View Controller-based status bar appearance」を追加して「NO」を設定すると消せる。


本題。

Autolayoutで対応させる方法がわからないので、まずはオフる←

12

View as iOS 7.0 and Laterのまま。


UIWebViewをレイアウトする!

1,Yを20ずらす
2,Heightを20引いたぶんの548にする

iOS 6/7 Deltasの項目があるので、

3,ΔYを-20にする
4,ΔHeightを20にする

あと、Autosizingを設定。


17

たぶん、こんな感じだと思う。。。


これだけだと、iOS7&3.5inch(iPad miniも該当するので正確には320x480か)という条件には対応できておらず、、ステータスバーが表示され、さらに20px下がったままである!(´・ω・`)

すべてコードで対応しとくのが手っ取り早そうなのだが…。

ここまで来たことだし、その条件だけ対応させました。

- (BOOL)prefersStatusBarHidden

{

    float version = [[[UIDevice currentDevice] systemVersion] floatValue];

    CGSize size = [[UIScreen mainScreen] bounds].size;

    if (version >= 7.0 && size.height == 480) {

        [self.webView setFrame:CGRectMake(0, 0, size.width, size.height)];

        return YES;

    }

    return NO;

}

3.5inchの実機はiOS6のままなので、iOS7にアップデートしたiPad miniで確認!


非RetinaのiPadにインストールされたiPhoneアプリの表示がx1のみになり、画面いっぱいに表示される仕様になっていますが、スクリーンサイズは {320,480} でした。

おそらくRetinaでも同じはず(と信じたい)。


とりあえずは、OK!

もっと楽な方法があったら知りたい!

memo:
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html 

 

なんかエラーが出てしまう未来のわたくしへ…

Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES'


Xcode 4.6.1
cocos2d-iphone-2.1-rc1

10

Landscape Left, Right がデフォルトのcocos2dアプリなんて作らん!と、Portrait設定にしてビルド実行するとエラーが出てしまう場合があります。

それもこれも、iOS6からの画面の向きを監視するメソッドが変更されているせいで、シミュレータのバージョン6以上を使ってるとなう。


cocos2dプロジェクトを新規作成してAppDelegate.mを見れば一目瞭然の説明が記述されています。


これはiOS6だけ有効で、4/5では無効だからね

supportedInterfaceOrientations

これはiOS4/5だけ有効で、6では無効だからね
shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 



-(NSUInteger)supportedInterfaceOrientations {


    return UIInterfaceOrientationMaskPortrait;


}



上記のようにOrientationsで指定した縦画面をリターンするように修正するか、これまたiOS6からのメソッドshouldAutorotateでNOを返せばsupportedInterfaceOrientationsは呼ばれないので、向きが固定のアプリケーションならこれでいいんじゃないですかね?

// iOS 6+ only

- (BOOL)shouldAutorotate

{

    return NO;

}

Universalにデザイン・コーディングするのはもちろん理想だけど、俺は縦画面がいいw





追加したいときに。
JSONObjectWithData:options:error の意味
http://md.hatenablog.com/entry/2012/03/17/185959 

受け取ったデータを可変長のNSMutableArrayやNSMutableDictionaryで処理したい場合はオプションを指定するといいのね。

NSJSONSerialization は iOS 5 から使えるようになったんだって!

知らなかった。正しくは、知る由もなかった← 

コード書いてないもんネ(´・ω・`)

↑このページのトップヘ