頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


iPhone X対応でSafeArea相当のviewを置いてみる

storyboardを使っていない古いアプリのiPhone X対応で苦労しているわけだが、、、

iPhone Xの画面の高さが667って出てしまう謎
↑ここでiPhone X対応でディスプレイのサイズをコードで取得したもののやっぱりコードで対応するのは面倒。せっかく強引にstoryboardを突っ込んだので利用してみることにした。

すでにあるsafe area

↑storyboardでデフォのview controllerを見るとすでにsafe areaってのが設定されてるのでこれを利用してみる。けど、このsafeAreaと同じサイズのviewはないので自作する。

constraintを設定

↑UIViewをドラッグ&ドロップで追加して、constraintを設定。幅、高さ、あとは上下左右がsafeAreaと隙間なしって奴の計6個。

outletを設定

↑このstoryboardのview controllerに対応するViewControllerクラス内で使うため準備しといて、、、

outlet接続

↑storyboard側からViewControllerクラスに参照を教えてやる(Referencing Outletsを指定)。

これでコード側から”安全な”UIViewオブジェクトを参照できる。


- (void)viewDidLoad {
[super viewDidLoad];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 40)];
label.text = @"TopLeft";
//[self.view addSubview:label];
[safeView addSubview:label];
}

↑こんな感じでUILabelオブジェクトを画面左上に表示するのにself.viewではなくsafeViewに追加する。

iPhone 7 (修正前)

↑iPhone 7でself.viewにaddSubview: した場合。

iPhone 7 (修正後)

↑iPhone 7でsafeViewにaddSubview: した場合。いいね!

iPhone X (修正前)

↑iPhone Xでself.viewにaddSubview: した場合。

iPhone X (修正後)

↑iPhone XでsafeViewにaddSubview: した場合。いいやん!

とまあこんな感じで上下のことは気にせずにレイアウト可能になる。

今までself.viewにaddSubview:してたりself.viewのheightとか取ってたけど、self.view→safeViewと変更するだけで、コードの修正がだいぶ楽になるはずだあ!とやってるんだが、、、


現時点での問題点

(1)self.view.backgroundの色をセットしないと上下が白くなる
self.viewにsafeViewを乗せてるせいだと思うが、iPhone Xだとsafe area外が上下にあるが、このカラーが白いまま。これが不自然に見えるのが嫌だとself.view.backgroundの色をセットする必要がある。

(2)キーボードは容赦なく画面下端から出て来る
safe area内に表示すりゃOKと思っていたけど、よく考えたらキーボードは画面下の端から出て来る。safe area内にしてよって訳にもいかない。

また問題出てきたら追加するわ。


iPhone Xの画面の高さが667って出てしまう謎

相変わらず古いアプリのiOS 11対応(というかiPhone X レイアウト対応)してるんだけど、どういうわけか画面のサイズがうまく取得できなかった。

ios - Detect if the device is iPhone X - Stack Overflow
ios - Detect iPhone X with a macro - Stack Overflow
↑基本ここいらのコードを参考にして

int height = (int)[[UIScreen mainScreen] bounds].size.height;

って値をチェックしてみたんだけど、シミュレータがiPhone Xなのにどうやってもなぜか667って値になる。その値って4.7インチのんやん?

おっかしいなあ〜、やってられんなあ〜ってやさぐれてたら、そう言えばLaunchScreen設定してないなあ。その辺りか?と思って適当にシミュレータのスクショ撮って、その画像をLaunchScreenの画像としてを設定してみた。

Launch Imageの設定

↑ここな。最初見た時には右ペインのiOS 8.0 and Laterってところにどちらもチェック入ってなかったわ。

この画像を設定したらちゃんとheightが812になったわ。

そう言えば同じこと昔あったよなあ。画面が3.5インチ→4インチになった頃だったかな?


最初のstoryboardを後から追加する

古いコードをメンテしているんだけど、iPhone X対応もあるのでstoryboard / Auto Layoutを導入しようとしたらえらくハマったのでそのあたりをメモ。

当然古いコードはstoryboardを使っていない。アプリ起動時に一番最初に表示されるviewを扱うview controllerをstoryboardで指定したい。

(1) プロジェクトにview controllerクラスファイルとstoryboardのファイルを追加する。ここではMainViewControllerクラス、Main.storyboardとした。

追加したファイル

え?Objective-Cですよ、当然(いや、そんな姿勢だから今苦しんでるんだろう!)。

(2) main.m、AppDelegateを書き換える
適当なとこからコピペするだけでOK。

(3) storyboardファイルの変更
Main.storyboardはデフォルトだとView Controllerがないので画面に追加する。

view controllerを追加

↑画面右下のここからドラッグで。

クラス指定

↑このstoryboardがどのクラスファイルと紐づいてるかを指定するのでここでMainViewControllerを指定。選択すればスペルミスしない。

Is Initial View Controllerにチェック

↑さらにこのview controllerが最初だ、ってことで Is Initial View Controller にチェックを入れる。

矢印が表示されているところ

↑すると viewの左側に矢印が表示される。

(4) info.plist
プロパティリストに最初のstoryboardのファイルを指定するところがあるので記述する。

プロパティリスト

↑Main storyboard file base nameってのを選んで Main と入力。

確かこれでオッケーのはず!!と思ってビルドするも全然動かない。MainViewControllerクラスまで処理が来てない、、、?
ここでハマったんだけど、結局のところ、、、

(5) Deployment Infoで指定する
TargetのとこでGeneral / Deployment Info ってとこにある Main Interface ってところにもMainって指定する必要がある、というかこちらを書けば(4)には書かなくてよかった。チックショー。

Deployment Infoで指定

↑ここね。
とりあえずこれで無事storyboardが動くようになった。



memo
Xcode 9.0



Pythonのsqlite3でデータを削除する

Python3のsqlite3でデータを削除しようとしたんだ。少し調べると
DELETE FROM tableName WHERE condition
といったサンプルを見つけることができて、実際試すと削除もできたんだけど、俺がやりたかったのが tableNameを文字列として直で入れるんじゃなくて変数として入れたかったんだ。

cursor.execute("INSERT INTO %s VALUES (?,?,?)"%targetTableName, (targetDate ,price ,volume))

↑保存の時には%sってのを使うから同じようにやるんだろうな、、、と思ったんだけどどういうわけかうまく動かない。試行錯誤してようやく動いたのがこんなの。

cursor.execute(“DELETE FROM %s WHERE date =?”%targetTableName, ( targetDate, ))

そりゃそうなんじゃないの?って感じだけど、、、ここにたどり着くのに異様に時間がかかったんだ。それは targetTableName を定義していなかったから、という何とも本質からずれてた情けない話なんだけど、Pythonのエラーメッセージはそんなこと教えてくれず単にいつもと同じ例外を投げてくるだけなのでなかなか気付かなかった。とまたPythonに対する愚痴が出る前におしまい。


ヨーグルト生産第5弾、R-1複製100回成功

ヨーグルト生産第4弾、LG21の結果
↑まあこの続き、というか途中経過報告。
ヨーグルトメーカーでR-1を複製してきたんだけど、ついに今回100代目が無事完成!というところまでやってきた。パチパチパチ〜

100代目R-1

↑よくわからないけど記念撮影。

メモを確認すると昨年の9/29に最初の複製(=1代目)を作り始めてる。ほぼ1年かけて連続100回複製に成功した、ってのはなんかすごくない?最初の頃は液状にさせてしまったこともあったのに。

若干取説と作り方が違うんだけど俺のやり方を紹介すると、、、
牛乳(1リットル)は事前に温めたりせず、冷蔵庫から出したままでOK。
新しい牛乳から50cc抜いて、そこにヨーグルトを50g分入れる。
注ぎ口をぎゅっと握って何回か振って混ぜる。
13時間ヨーグルトーメーカーで温めるだけ。
これで夏も冬も失敗なくヨーグルトができたんだから楽なもんだよな。

それにしても、100回も複製したヨーグルトは本当にR-1と同じ成分で同じ効果が期待できるんだろうかね?牛乳もいろんな種類を使ってきたわけだし。探偵ナイトスクープで調べてもらいたいよ。



↑使ってるのはこれ。コスパ最高、ホント。




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad