20210623のiOSに関する記事は5件です。

MRTKをiOSで動かす方法

iOSでMRTK動いた!#MRTK #iOS pic.twitter.com/micHL1zp6y— 原口昂弥 (@k_haraguchi55) June 23, 2021 参考 開発環境 Unity 2019.4.11f1 iPhone 12 Pro MacBook Air Windows 10 Mixed Reality ToolKit v2.5.3 Xcode やり方 プロジェクトの作成 GitHubからMRTKのUnityPackageをダウンロード UnityHubから新しいプロジェクトを作成 Window > Package Manager から下記パッケージをインポート AR Foundation v2.1.8 ARKit XR Plugin v2.1.9 File > Build Settings プラットフォームをiOSに切り替え Edit > Project Settings > TextMeshProをインポート カメラ設定の変更 HandInteraction Examples シーンを開く Hierarchy > MixedRealityToolkit のインスペクターからProfileを変更 DefaultHoloLens2ConfigurationProfileをClone CameraタブからDefaultHoloLens2CameraProfileをClone Camera Settings providers > Add Camera Settings provider をクリック New data provider1 > Type を UnityAR > UnityARCameraSettingsに変更 プロジェクト設定を変更 Mixed Reality Toolkit > Utilities > UnityAR > Update Scripting Defines をクリック Mixed Reality Toolkit > Utilities > Configle Unity Project > Applyをクリック Edit > Project Settings > Player > iOS > Other Settings > Strip Engine Code のチェックを外す ビルド&デプロイ Unity File > BuildSettings > iOSでビルド Xcode ビルドしたフォルダ内のUnity-iPhone.xcodeprojをXcodeで開く Unity-iPhoneを選択しプロジェクトの設定を表示 General > Deployment Info で iOS11.0を選択 Signing & Capabilities > Signing Teamを選択 デバイスを選択 ▶をクリックしてデプロイ ※ MapFilePerser.sh: Permission deniedが発生した時の対処法 ターミナルを開く 下記コマンドを実行 chmod 777 MapFilePerser.sh
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift5でgetterとsetter(計算型プロパティ)についてまとめた

はじめに こんにちは@kaneko77です。 getterとsetterについてたまにわかりずらいなと思ってしまう時があった為 調べ直したものをまとめたいと思います。 getterとsetterについて この二つを説明するにあたって計算型プロパティという物を説明する必要があります。 計算型プロパティとは 値の参照と更新の機能を手続きで構成するプロパティになります。 そして計算型プロパティにはget節とset節というものがありそちらが今回のgetterとsetterになるということです。 get節がgetterでset節がsetterです。 計算型プロパティは、値の更新と参照ができるパターンと参照だけできるパターンがの2種類があるということも知って置いてください。 結局のところ、参照した結果の値を計算するのがget節で、指定された値を使ってプロパティを表す値を更新する部分がset節になるということです。 上記のまとめ get節: 参照した結果の値を計算する set節: 指定された値を使ってプロパティを表す値を更新する getter: どういう風に値を取得するのか setter: 値を代入した場合の動き get節のみの定義でもできる 説明 基本 以下が計算型プロパティのゲッタとセッタを基本の形でコードを現した物になります。。 var プロパティ名: 型 { get{ .... } set(仮引数){ .... } } 仮引数の省略 仮引数は省略可能でその場合は値の取得はnewValueという変数が使えます。 var プロパティ名: 型 { get{ .... } set{ return newValue } } returnの省略 関数と同じなのでreturnは省略できます。 var プロパティ名: 型 { get{ .... } set{ newValue } } setの省略 プロパティの値を参照するときだけの場合はsetが必要ない為、省略できます。 var プロパティ名: 型 { get{ .... } } getのみの場合さらに省略することができます。 以下もゲッタを使ってるのと同じです。 get自体を省略できます。 var プロパティ名: 型 { .... } 具体的な利用シーン それでは書き方として色んな書き方や概念がわかってきたと思うので続いて じゃー具体的にどういう時に使われるのかというお話になります。 以下がよく使われる例 税込み価格・税抜き価格取得したい時 入力文字を全部大文字にしたい時 etc.. それでは上記二つを例としてコードで書いてみます。 税込み価格・税抜き価格取得したい時 今は税金10%の時代なので1.10でやります。 var price: Double = 100 var tax: Double { get{ price * 1.10 } set{ price = newValue / 1.10 } } price = 1000 // 税込み価格を取得 print(tax) // 1100.0 tax = 1100 // 税抜き価格を取得 print(price) // 999 入力文字を全部大文字にしたい時 var inputValue = "test" var uppercaseValue: String { get { inputValue } set { inputValue = newValue.uppercased() } } uppercaseValue = "hogehoge" print(uppercaseValue) // HOGEHOGE 終わりに 今回はgetterとsetterについて共有しました。 プロパティのメリットは外部から参照した時に意図しない変更を加えられなくするところだと思います。 getterは対象の値を書き換えたくない時などに使えると思います。 setterは何か付け加えた時、例えば名前の先頭文字に全部mr.とかつけたいなど要は値の加工ですねに使えると思います。 慣れれば割といろんなところに使えると思います。 ここまで読んでいただきありがとうございます。 参考にしたサイト https://qiita.com/nack43/items/5e1d7972ed0b54daeb04 https://www.hfoasi8fje3.work/entry/2018/05/07/002215
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WWDC 2021: What's New in UIKit メモ

Productivity iPad multitasking UIWindowScene.ActivationConfiguration(userActivity: userActivity) で、「新しいウインドウで開く」 コマンドを作成できる。 let newSceneAction = UIWindowScene.ActivationAction({ _ in // Create the user activity that represents the new scene content let userActivity = NSUserActivity(activityType: "com.myapp.detailscene") // Return the activation configuration return UIWindowScene.ActivationConfiguration(userActivity: userActivity) }) Keyboard navigation iPadOS 15 Band Selection = 複数項目をドラッグで一気に選択できる。 Keyboard shortcuts iPadOS 15 UIMenuBuilderを使って、キーボードのショートカットを作成する。 class AppDelegate: UIResponder, UIApplicationDelegate { override func buildMenu(with builder: UIMenuBuilder) { // Use the builder to modify the main menu... } } iPadと、Mac Catalyst の UIFocusSystemが強化 アプリ間のドラッグアンドドロップが、iOS 15でiPhoneも可能に iPad pointer UI refinements Bar背景の変更 UIToolbarとUITabbarで、下までスクロールした時、背景が無しになる 下までスクロールした時の外観は、scrollEdgeAppearanceでカスタマイズできる。 // Custom scrollEdgeAppearance let appearance = UITabBarAppearance() appearance.backgroundEffect = nil appearance.backgroundColor = .blue tabBar.scrollEdgeAppearance = appearance // Specify the content scrollView let scrollView = ... // Content scroll view in your app viewController.setContentScrollView(scrollView, for: .bottom) ヘッダーの変更 UIListContentConfiguration : iOS 14 UIListSeparatorConfiguration : iOS 14.5 半分の高さのシート API enhancements 10:16 UIButtonの拡張 UIButtonConfiguration で外観の変更ができる。 Plain, Gray, Tinted ... Pop-up, Pull-down, Toggle // Configurationを使ってボタン作成 var config = UIButton.Configuration.tinted() config.title = "Add to Cart" config.image = UIImage(systemName: "cart.badge.plus") config.imagePlacement = .trailing config.buttonSize = .large config.cornerStyle = .capsule let button = UIButton(configuration: config) UIContextMenuInteraction で、折りたたみ可能なサブメニューをサポート。APIの追加はないけど、以前は、サブメニューをタップすると置き換えされていたのが、展開されるようになった。 SF Symbols Monochrome, Hierarchical, Palette, Multicolor の色が使えるようようになった (UIKit, SwiftUI, AppKit) UIImageSymbolConfiguration let configuration = UIImage.SymbolConfiguration( hierarchicalColor: UIColor.systemOrange ) let image = UIImage( systemName: "sun.max.circle.fill", withConfiguration: configuration ) .circle, .circle.fill がAPIで利用できる Dynamic Typeのサイズ制限 最小限サイズ、最大サイズの設定ができる。 extension UIView { var minimumContentSizeCategory: UIContentSizeCategory var maximumContentSizeCategory: UIContentSizeCategory } カラー システムカラーが、全てのプラットフォームで統一 UIColor.tintColor を追加。 動的な色。 iOS 14.5で、 UIColorPickerの didSelectコールバックを追加 TextKit2 UISceneの状態を復元 NSUserActivityを使って、状態を復元できる ここのウィンドウ制御関連は、UISceneベースのAPIで対応しているので、古いUIApplicationベースのアプリは、UISceneに移行してね Cell configuration closures UICollectionView, UITableViewのセルのConfigurationの更新をクロージャーで設定できる。 UIButtonにもあるよ。 // New UICollectionViewCell.configurationUpdateHandler closures let cell: UICollectionViewCell = ... cell.configurationUpdateHandler = { cell, state in var content = UIListContentConfiguration.cell().updated(for: state) content.text = "Hello world!" if state.isDisabled { content.textProperties.color = .systemGray } cell.contentConfiguration = content } Data Source差分の改良 既存のセルをすべて破棄することなく、その変更内容に基づいてUIが更新 var snapshot = dataSource.snapshot() snapshot.reconfigureItems(itemIdentifiers) dataSource.apply(snapshot, animatingDifferences: false) Performance 20:17 Cellプリフェッチの改良 iOS 15でビルドすると自動的に有効に CellでImageをロードする場合は、awaitでasyncにしてみてね UIImage.prepareThumbnailで適切な小さな画像にしてね Security and privacy Location Button 現在地の取得を、一度だけ許可できるボタン ペースト時のポップアップ iOS 14から、他アプリからペーストした時に、画面上部に「** pasted from **」というポップアップが出るが、新しく追加された、標準的な貼り付けメニュー項目APIを使えば、表示されない。 Private Click Measurement iOS 14.5 で導入 広告のクリックやタップのプライバシーを保護した測定
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ダークモード対応時に色の命名規則を決めてみた

私はRadiotalkというラジオ配信サービスのアプリ開発インターンをしています。 本記事では、iOSダークモード対応をする際に、Colorの命名規則を決めたことについてご紹介します。 今回決めた命名規則は課題も残っているため、参考程度に目を通していただければと思います。 ダークモードとは何か 公式ドキュメントを基に説明します。 Dark Mode - Visual Design - iOS - Human Interface Guidelines - Apple Developer ダークモードとは、黒を基調とした画面モードのことです。 ユーザーはダークモードに設定することで、システム全体の外観を黒基調の配色に切り替えることができます。 ダークモードに切り替えることで、ユーザがよりコンテンツに集中しやすくなるという利点があります。 従来のRadiotalkの色の規則 Radiotalkで使用する色について Natural colors 現在、Radiotalkで定義されている色(Natural colors)は以下の通りです。 さらに、上記の緑枠で囲まれているBase colorやAccent colorが存在します。 Base color Radiotalkのベース色 例)背景→Navy、テキスト→White Accent color 全体的に少ない使用量で、強調させる色 例)Yellow、Orange、Red Surface color Natural colorsとは別にSurface Colorがあり、以下の意味を持ちます。 数字は白の透明度を表す割合 他のコンポーネントに重ねて使用 階層 Radiotalkでは、色の明度差を階層と呼んでいます。 背景やテキストなどに、階層が存在します。 例を挙げると、背景はRadio_Navyの3つの階層を使用します。 ダークモード対応時に発生しうる課題 従来では、以下のような命名規則でした。 Radiotalk + [ 色の名前 ] RadiotalkNavy RadiotalkOrange RadiotalkYellow RadiotalkNavyWhite このような色の定義でダークモード対応を行った場合、次のことが起こります。 ①②のような色をベースとした命名規則では、以下の課題が発生します。 色の理解がしづらく、名前だけで判断できない 新しく色を追加しづらい ダークモードの色の考慮が必要 解決策 従来の命名規則では、色の名前のみを定義していたため、上記の課題が発生しました。 そこで、色の整理を行い、以下の流れで命名規則の検討を行いました。 これらを踏まえて、以下の命名規則にしました。 [ コンポーネント名 ] + [ 色の名前 ] + Color 背景,ボタンなど各コンポーネントに使用する色として定義 ベースカラーは色の名前を省略 階層が存在する場合、Primary、Secondary、Tertiaryを[ 色の名前 ]の前に追加 [ 汎用名 ] + [ 色の名前 ] + Color AccentやErrorは少ない使用量で、強調させるコンポーネントに使用する色 Surfaceは白の透明度を表す 例)Surface5の場合、白の透明度5% [ 汎用名 ]を追加する理由は、1つの色に対してボタンやCellなどの小エリアといった複数のコンポーネントに使用する場合があるからです。 全てのコンポーネントに名前をつけて色の定義する必要がありません。 [ 色の名前 ]の補足 名前が区別しやすくなり、名前の冗長化を防ぐといった利点から、以下の条件を加えました。 コンポーネントに対して、1色のみ使用 → 色の名前を省略 例) ActiveButtonの場合、Surface colorの40%の1色 - ActiveButtonColor コンポーネントに対して、2色以上使用 → 色の名前 例) Iconの場合、WhiteとNavyの2色 - IconWhiteColor - IconNavyColor 実際に当てはめてみた 次に、以下のRadiotalkのトーク詳細画面を用いて説明します。 [ コンポーネント名 ] + [ 色の名前 ] + Color TextPrimaryColor ベースとなるテキスト用の色です。 階層が一つ下のテキストの場合はTextSecondaryColorです。 命名規則に当てはめると以下の通りです。 - [ コンポーネント名 ] → Text - [ 色の名前 ] + Color → ([ 色の名前 ]は省略) PrimaryColor BackgroundPrimaryColor ベースとなる背景色です。 階層によって、SecondaryやTertiaryも使用します。 命名規則に当てはめると以下の通りです。 - [ コンポーネント名 ] → Background - [ 色の名前 ] + Color → ([ 色の名前 ]は省略) PrimaryColor ActiveButtonColor フォロー中のボタンの色です。 命名規則に当てはめると以下の通りです。 - [ コンポーネント名 ] → ActiveButton - [ 色の名前 ] + Color → ([ 色の名前 ]は省略) Color IconWhiteColor 白いアイコン用の色です。 命名規則に当てはめると以下の通りです。 - [ コンポーネント名 ] → Icon - [ 色の名前 ] + Color → WhiteColor [ 汎用名 ] + [ 色の名前 ] + Color AccentYellowColor 強調させるコンポーネントに使用する色です。 ボタンやスライダーなどの小エリアに使用します。 命名規則に当てはめると以下の通りです。 - [ 汎用名 ] → Accent - [ 色の名前 ] + Color → YellowColor Surface12Color 白の透明度12%の色です。 命名規則に当てはめると以下の通りです。 - [ 汎用名 ] → Surface12 - [ 色の名前 ] + Color → ([ 色の名前 ]は省略) Color ダークモード対応後 解消前 以下①②のように色の名前のみで定義した規則でした。 解消後 上記により、同じNavyであってもどこに使う色かという情報が明確になりました。 さらに、別のNavyが追加されても規則に沿って追加しやすくなりました。 実装の具体例 トーク詳細画面をダークモード対応した結果が以下の通りです。 まとめ 本記事では、ダークモード対応をする際に、コンポーネントベースな色の命名規則で対応する過程をご紹介しました。 ダークモードに取り掛かる予定の方、もしくは、命名規則の考え方において少しでも参考になれば幸いです。 また、Radiotalkは1タップで簡単にラジオ収録することができるサービスです。 ぜひ、ダウンロードしてみてください! https://radiotalk.jp/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swiftの高階関数をまとめた

はじめに こんにちは@kaneko77です。 今回はSwiftの高階関数についてまとめてみました。 配列の操作でよく使うのでswiftのエンジニアは絶対覚えといて損はないものだと思います。 こちらを参考にしました。 目次 map flatMap compactMap filter reduce 紹介 map 配列のデータを一つ一つ引っ張る時に使います。 let test = ["マチュピチュ", "モンサンミッシェル", "サグラダファミリア", "アンコールワット"] test.map{ print("データ取得", $0) } ログ データ取得 マチュピチュ データ取得 モンサンミッシェル データ取得 サグラダファミリア データ取得 アンコールワット flatMap 多重配列を結合する時に使います。 let array = [ ["hoge1", "hoge2","hoge3"], ["huga1", "huga2"] ] let result = array.flatMap { $0 } print(result) ログ ["hoge1", "hoge2", "hoge3", "huga1", "huga2"] compactMap 配列のデータをキャストする時に使う let array = ["1", "2", "3", "4", "5"] let result = array.compactMap{ Int($0) } print("Stringの配列:", array) print("Intの配列:", result) ログ Stringの配列: ["1", "2", "3", "4", "5"] Intの配列: [1, 2, 3, 4, 5] filter 一部データを条件で絞って表示したい時に使います。 let array = [ (title: "Test1", status: false), (title: "Test2", status: true), (title: "Test3", status: false), (title: "Test4", status: false), (title: "Test5", status: true), (title: "Test6", status: true) ] let result = array.filter{ $0.status } print(result) ログ [(title: "Test2", status: true), (title: "Test5", status: true), (title: "Test6", status: true)] reduce 現場で使うとしたらこのパターンかな.. 配列のデータを足したいときに使います。 let array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] let result = array.reduce(0) { $0 + $1 } print(result) ログ 55 終わりに 今回は高階関数についての簡単な紹介でした。 かなり簡単に配列の操作ができるようになって楽だなっと思いながらいつも使っています。 覚えていない方はこの記事を見てどういう時に使うのかを頭に叩き込んで常に高階関数が使えるかどうか考えながら設計するのも良いと思います。 ここまで読んでいただきありがとうございます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む