FRMSKI開発ブログ

プログラミング、UI / UX、仕事、読書のことなど、日々の記録を綴ります

SceneKitで謎のスケールバグ

SceneKitでscnファイルで設定していたSCNNodeのScale値が大きくなるバグについて。

意味不明のバグだったのですが、数時間の調査の結果原因が判明しました。

Nodeの方向をカメラに向くように設定していたSCNBillboardConstraintを使わないようにすることで解決しました。

SceneKit側のバグのようなので報告しておきました。原因わかり次第追記します。

MacでTuri Create実行環境セットアップ手順

Turi Createとは

Appleが公開しているMachine Learningのライブラリです。

github.com

実行環境セットアップ手順

①Anacondaのインストール

下記のサイトよりアナコンダインストーラーをダウンロードし、インストールします。

www.anaconda.com

②Anaconda Navigatorを起動

f:id:frmski:20190128010511p:plain:w400

③左メニューのEnviromentsで仮想環境を作成

CreateボタンでCreate new environmentできます。Pythonのバージョンは3.6でCreateします。

④仮想環境ボタンからターミナルをOpen

作成した仮想環境のボタンを選択肢Open Terminalボタンを選択

⑤JupyterNotebookのインストール

$ conda install jupyter

⑥Turi Createのインストール

$ pip install -U turicreate

以上がセットアップ手順です。
ジュピターノートブックを実行環境で起動するには、

$ jupyter notebook

で起動できます。

【Xcode 10.2 betaのSwift 5リリースノート】Swift言語のアップデート一覧

Swift Language

  • @dynamicCallable属性を使用すると、単純な構文を使用して関数を呼び出すのと同じ名前の型を呼び出すことができる。
@dynamicCallable struct ToyCallable {
    func dynamicallyCall(withArguments: [Int]) {}
    func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, Int>) {}
}

let x = ToyCallable()

x(1, 2, 3)
// Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])`

x(label: 1, 2)
// Desugars to `x.dynamicallyCall(withKeywordArguments: ["label": 1, "": 2])`
  • キーパスが入力値全体を参照するWritableKeyPathをサポート。
let id = \Int.self
var x = 2
print(x[keyPath: id]) // Prints "2"
x[keyPath: id] = 3
print(x[keyPath: id]) // Prints "3"
  • Swift 5より前のバージョンでは、さまざまな引数を取る列挙型のケースを書くことができたが、代わりに、列挙型の場合を変更して配列を取得し、明示的に配列を渡す。
enum X {
    case foo(bar: [Int]) 
} 

func baz() -> X {
    return .foo(bar: [0, 1, 2, 3]) 
} 
  • Optional型の式を使用すると、ネストされたオプションを返すのではなく、結果のオプションがフラットになります。

  • UInt64(0xffff_ffff_ffff_ffff)のような式は、以前はデフォルトの整数リテラル型のIntをオーバーフローしていましたが、現在は有効です。

  • 文字列補間により、パフォーマンス、明瞭さ、および効率が向上しました。

  • Swift 4.2とSwift 5の間で#ifを使用してコードを条件付きにすることができます。次に例を示します。

#if compiler(<5)
extension MyType: _ExpressibleByStringInterpolation { /*...*/ }
#else
extension MyType: ExpressibleByStringInterpolation { /*...*/ }
#endif 

SceneKitで複製したテキストの内容を共有しないようにする

SceneKitでテキストやマテリアルを複製した後、個別に編集したい場合の解決策です。 Attributesインスペクタ下部のUnshareボタンを押下することで個別に編集できるようになります。

f:id:frmski:20190125023159p:plain

【SceneKit】SCNノードをカメラの方へ向かせる

SCNノードのベクトルを常時カメラの方へ向かせるにはSCNBillboardConstraintを使います。
下記のソースでノードのconstraintsに指定してあげます。

let billboard = SCNBillboardConstraint()
billboard.freeAxes = SCNBillboardAxis.Y //Y座標のみ追従させる
node.constraints = [billboard]

freeAxesは固定したい軸を指定する時に追記します。

【iOSデザインガイドライン和訳】起動画面(ローンチスクリーン)の常識

起動画面

 アプリが起動するとすぐに起動画面が表示されます。起動画面はすぐにアプリの最初の画面に置き換えられ、アプリが速く応答性の高い印象を与えます。起動画面は芸術表現の機会ではありません。これは、すぐに起動し、すぐに使用できるように、アプリの認識を向上させることのみを目的としています。すべてのアプリは起動画面を提供する必要があります。

 デバイスの画面サイズが異なるため、起動画面のサイズも異なります。これに対応するには、起動画面をXcodeのストーリーボードとして、またはアプリがサポートしているデバイス用の静止画像のセットとして提供できます。ストーリーボードは柔軟で適応性があるため、Xcodeストーリーボードを使用することをお勧めします。 1つのストーリーボードを使用して、すべての起動画面を管理できます。適応インターフェースの実装については、「自動レイアウトガイド」を参照してください。

  • アプリの最初の画面とほぼ同じ起動画面をデザインします
     アプリの起動が完了したときに異なるように見える要素を含めると、起動画面とアプリの最初の画面の間で不快なフラッシュが発生する可能性があります。

  • 起動画面にテキストを含めないでください
     起動画面は静的なため、表示されているテキストはローカライズされません。

  • ダウンプレイを開始
     人々はアプリを頻繁に切り替える可能性が高いので、アプリの起動に注意を払わない起動画面を設計します。

  • 宣伝しないでください
     起動画面はブランディングの機会ではありません。スプラッシュスクリーンや「バージョン情報」ウィンドウのようなエントリーエクスペリエンスをデザインしないでください。ロゴやその他のブランディング要素は、アプリの最初の画面の静的な部分以外は含めないでください。

  • 静的起動画面
     起動画面にはXcodeのストーリーボードを使用することをお勧めしますが、必要に応じて一連の静止画像を提供できます。デバイスごとに異なるサイズの静止画を作成し、ステータスバー領域を必ず含めてください。

f:id:frmski:20181213113758p:plain:w500

【iOSデザインガイドライン和訳】覚えておくと助かるシステムアイコン一覧

システムアイコン

 iOSシステムには、さまざまなユースケースで共通のタスクやコンテンツの種類を表すビルトインのアイコンが用意されています。

 これらのビルトインアイコンは、人に親しまれているので、できるだけ多く使用することをお勧めします。

  • 意図したとおりにシステムアイコンを使用してください
     すべてのシステム提供のイメージには、特定のよく知られている意味があります。ユーザーの混乱を避けるために、それぞれのイメージをその意味と推奨される使用法に従って使用することが不可欠です。

  • アイコンの代替テキストラベルを提供する
     代わりのテキストラベルは画面上には表示されませんが、VoiceOverは画面上に表示されているものを音声で表現できるため、視覚障害のある方にとってナビゲーションが容易になります。

  • あなたのニーズに合ったシステムアイコンが見つからない場合は、カスタムアイコンを設計してください  システム提供のイメージを誤用するよりも自分自身を設計する方が良いです。カスタムアイコンを参照してください。

ナビゲーションバーとツールバーのアイコン

 ナビゲーションバーとツールバーには、次のアイコンを使用します。開発者ガイダンスについては、UIBarButtonSystemItemを参照してください。

TIP
 アイコンの代わりにテキストを使用して、ナビゲーションバーまたはツールバー内の項目を表すことができます。たとえば、カレンダーはツールバーの「今日」、「カレンダー」、および「受信トレイ」を使用します。固定スペース要素を使用して、ナビゲーションとツールバーアイコンの間にパディングを提供することもできます。

f:id:frmski:20181213114744p:plain:w500 f:id:frmski:20181213114759p:plain:w500

タブバーのアイコン

 タブバーには次のアイコンを使用します。開発者向けのガイダンスについては、UITabBarSystemItemを参照してください。

f:id:frmski:20181213115121p:plain:w500

ホーム画面クイックアクションアイコン

 ホーム画面のクイックアクションメニューでは、次のアイコンを使用します。開発者ガイダンスについては、UIApplicationShortcutIconTypeを参照してください。

f:id:frmski:20181213115308p:plain:w500 f:id:frmski:20181213115248p:plain:w500 f:id:frmski:20181213115323p:plain:w500