highlight.xcode

2016年5月19日木曜日

UITableView 上部の隙間を消す



「UITableView」を使用した際に、テーブル上部に出来る隙間がどうしても消せなくて、悩んだ時のメモ。

「UITableView」はデフォルトでスクロール可能になっているのだが、「UITableView」の設定でスクロールをオフにしても、テーブル上部にスクロール用のマージンと思われる隙間が残ってしまい、これを消すってだけでかなり悩んだ。

答えはここに在った。
「View Controller」にも設定が在るとよ!
こんなん解る訳無い…。
軽く怒りを覚えたわ…。

「View Controller」の「Attributes inspector」->「View Controller」->「Layout」の「Adjust Scroll View Insets」をオフにすれば良いとのこと。



いくら初心者とはいえ、ちょっとした事で引っ掛かりまくりで、作業の進みがすこぶる悪い…。
イライラするわー

Auto Layout 時の Navigation Bar の取り扱い



ストリーボードで画面遷移を構成する際に「Navigation Controller」を使用するのだが、この時に画面に自動的に追加される「Navigation Bar」が「Auto Layout」で上手く取り扱えなくて困った時のメモ。

「Navigation Bar」が画面上で一番上に位置するオブジェクトになるので、それより下に位置するオブジェクトの位置制約には、「Navigation Bar」からの相対位置を指定するのが自然だと思う。

ところが、この「Navigation Bar」が手動で画面に追加したものの場合は問題無いのだが、「Navigation Controller」により自動的に追加されたものの場合、「Auto Layout」上では無視されてしまい、相対位置指定に使用出来ないのだ。

結論を言うと、「View Controller」の「Attributes inspector」->「Simulated Metrics」->「Top Bar」を「Opaque Navigation Bar」に、「Bottom Bar」を「None」に設定する事で、「Top Layout Guide」の位置が「Navigation Bar」の下になってくれるので、この位置からの相対位置を制約に設定する事が出来る。



「Opaque」は「不透明化」といった意味らしい…。 Apple 歴なんて 2ヶ月にも達していないのだが、Mac とか Xcode のメッセージや、プロパティ名、プロパティ値の内容や単語って、つくづく解りにくいというか、直感的でないというか…。これも「Displaing Navigation Bar」とかで良いじゃんよ…。

2016年5月17日火曜日

Xcode の Unexpected code bundle エラー



Xcode をアップデート後、起動してみたら以下の様なメッセージが出た。



「予期せぬコードバンドル」といった意味だが、言葉の意味が解っても、何のエラーかよく解らないという、いつものパターン…。 多分、Apple 謹製ではないプラグインが警告を受けているのだと思う…。

とりあえず「Load Bundles」としておいた。

Xcode のアップデートでハマる



Xcode のアップデート通知が来たので、アップデートしようとしたが「待機中」の表示のまま進まない…。

検索したら、出るわ出るわ…。もはやアルアル系の話題といえる程、アップデートでハマったという記事が溢れていた…。

参考になったのはここ。
Xcode をアンインストールする、という乱暴なものだが、たしかにこれで問題は解決し、インストールが進みだした。

しかい、サイズが「3.8GB」、時間には「2時間30分」と表示される…。
やっぱ、夜間にやった方が良かったな…。

2016年4月29日金曜日

Xcode のサイズの単位



Xcode のストーリーボードで画面を作っていて、ふと気になった。

オブジェクトを貼った「View」を「Scroll View」へと貼り付けるとスクロールする様になる。 だが、縦スクロールだけでいいのに、横スクロールもしてしまう。 「Scroll View」の設定で出来そうなものだが、実は出来ない。 「Scroll View」へと貼り付けたオブジェクトが「Scroll View」より大きい場合に、勝手にスクロールする様になるのだ。 なので、縦スクロールのみに限定したい場合は「Scroll View」へ載せるオブジェクトの横幅を、「Scroll View」の横幅より小さくしなくてはいけない。また、縦スクロールさせるには表示エリアより縦に長い「Scroll View」が必要なのだが、その為には「View Controller」のサイズを縦長に変え、縦に長い「Scroll View」全体を表示しなければ、その上にオブジェクトを配置する事すらできない。

で、「View Controller」のサイズを変えようとしたのだが、どういうサイズが良いのか悩んでしまった。とりあえず、「iPhone 5s」に合わせてみようと思い Wikipedia で画面サイズを調べたら「640 × 1136」ピクセルだったので、横幅を「640」にした所、明らかに「iPhone 5s」の横幅より大きい。

ここでまた悩む。
そもそも Xcode でサイズの指定に使っている単位は「ピクセル」ではない?
そう考えて、調べてみた所「ポイント」という単位なんだそうな。

結局、「iPhone 4」以降の「Retina」ディスプレイを搭載した機種の場合は「1 ポイント = 2ピクセル」。 「Retina」ディスプレイ搭載以前の機種の場合は「1 ポイント = 1ピクセル」となるんだそうだ。

という訳で、「iPhone 5s」を想定した画面の横幅は「320ポイント = 640ピクセル」が正解だった。

念の為書いておくと、もちろん画面サイズに依存したデザインはタブーだと思います。
あくまで Xcode で作業する上での「View Controller」のサイズの話です。

2016年4月28日木曜日

Swift のエラー NSUnknownKeyException 再び



以前にも書いたが、また「NSUnknownKeyException」というエラーが発生した。

前回は、コードを直接編集してしまった為に、ストーリーボードとコードとの整合性が崩れてしまった訳だが、今回は普通にストーリーボードを編集しただけで発生。
これって Xcode のバグなんじゃ…。

とりあえず、ストーリーボードのソースを直接編集して対応した。

「Main.storyboard」のコンテキストメニューから、「Open As」->「Source Code」でストーリーボードのソースを表示。 「command + f」で疑わしいオブジェクト名をソースの中から検索。<connections> の <outlet> に余分なのが居たので削除。

これでこのエラーは消えた。

ストーリボードに戻るには、同じくコンテキストメニューから、「Open As」->「Interface Builder - Storyboard」をクリックすれば OK。

ストーリボードの編集画面って「Interface Builder」って言うのね…。

2016年4月27日水曜日

Vine Server(OSXvnc)



以前書いた「VNC で option キーが送れない」問題は、その後も解決出来ていない。2ch やアップルサポートコミュニティにも質問してみたが、回答 0件…。ウェブ上の情報も概ね解決には至っていない…。

そんな中、「OS X の画面共有は止めて、Vine Server という VNC サーバーを使うと良い」という様な情報が在ったので、試しに使ってみた所、少なくともモディファイヤキーに関してはマトモに動作してくれた。
パッケージは testplant.com からダウンロード出来る。

ただし、例によってキーボードレイアウトが US になってしまうという問題が残った。
一応、内部的に US-Keylayout から JP-Keylayout への変換をしていてくれているので、ほとんどのキーは問題無く打てるのだが、一部のキーがおかしかった。

入力したキー 入力される文字
ˆ 6
' "
= +
@ 2
` ˜
: ;

色々検索しているうちに日本語キーボードパッチなるモノも見つかったが、いかんせんバージョンが解らないわ、古いわで役に立たなかった…。

結局、自力で改造してみる事にした。
「Source Forge: Vine Server (OSXvnc)」->「web-based CVS repository viewer」->「Download GNU tarball」からソースがダウンロード出来る。
バージョンは「4.01」。
ライセンスは「GPLv2」。

早速、ダウンロードして、解凍して「OSXvnc.xcodeproj」を Xcode で開いて、ビルドしてみた。
環境は「OS X El Capitan 10.11.4」上の「Xcode 7.3」。

やはり古いソースなので最新の環境とは設定が合わないらしく「Update to recommended settings」と質問されたので、とりあえずお薦め設定にしてビルドしてみた。

一応ビルドには成功したものの、警告23個…。
早速、Windows 側から VNC で接続してみたが、「メッセージの長さが合わないよ。続ける?」みたいなメッセージが永遠と表示され、まともに使えなかった…。

結局、時間はかかったものの、この問題は解決出来た。
Vine Server(OSXvnc) の最終バージョン(4.01)は 32bit バイナリなのに、ビルド環境が 64bit なせいで、前述のお薦め設定により「Build Settings」->「Architectures」が「Standard Architectures (64-bit intel)(x86_64)」になってしまっていた。
これを「Universal (32/64-bit intel)(x86_64, i386) - S(ARCHS_STANDARD_32_64_BIT)」に変更してビルドし直した所、使えるバイナリが出来た。

さて、本番はここからなのだが…。

警告のほとんどは、キャストや型書式に関するものだったので、適当に修正した。
残る 3つは「'xxx' is deprecated: first deprecated in OS X 99.9」といったもの。
これは「'xxx' は OS X バージョン 99.9 で廃止されますよ。」という警告なので放っておくしかない…。
最適な移行方法も、警告抑制の仕方も解らないしなぁ…。

結局、「XCodeでのwarning抑制方法」を参考に、警告抑制した。

後はおかしいキーを直すだけ…。

キーイベントの処理を探す為、ソースの中を「keyboard」等で検索し、あちこち眺めてみた所、「VNCServer.m」の「handleKeyboard」がそれらしいと解った。

多分、この関数の引数が入力キーで、この関数の中から呼ばれている「sendKeyEvent」関数への引数が出力キーっぽいので、「NSLog」を仕掛けて観察。その結果と、US-Keylayout での入力方法を突き合わせて、入力と出力のズレを整理した。

入力キー 入力コード 出力文字(誤) 出力コード(誤) 出力文字(正) 出力コード(正) 結果
ˆ 0x5E 6 0x16 ˆ(6 + shift) 0X16 + shift shift が不足
' 0x27 + shift " 0x27 + shift ' 0x27 shift が余分
= 0x3D + shift + 0x18 + shift = 0x18 shift が余分
@ 0x40 2 0x13 @(2 + shift) 0x13 + shift shift が不足
` 0x60 + shift ˜ 0x32 + shift ` 0x32 shift が余分
: 0x3A ; 0x29 :(; + shift) 20x29 + shift shift が不足

結果としては「shift」が余分か、足りないか、という事だった。

こういうのはテーブルがちょっとズレてるだけとか、簡単に治りそうなもんんだけどなぁ…。
キーの定義は「kbdptr.h」に在ったが、キーとモディファイヤキーの組み合わせをどう定義しているか解らなかった…。

結局、「sendKeyEvent」関数を呼び出す直前に、「sendKeyEvent」関数への引数へ対し「shift」を足したり、引いたりする処理をぶち込んじゃった…。

次に、マウスホイールでのスクロールが異常に遅かったので、「handleMouseButtons」関数でマウスホイールの移動距離を格納している「mouseWheelDistance」変数を 4倍する処理も入れた。

あとは、クリップボードが異常な挙動をする問題も在ったのだが、これは VNC クライアント側でクリップボードの共有を止めれば問題無くなった。クリップボード共有出来た方が便利なんだけど、仕方がない…。

残るは、ログイン、ログアウト関連が対応出来てない臭いけど…。
当分これで様子を見てみようと思う。

オープンソース万歳!!!!!