- 投稿日:2022-03-23T23:32:04+09:00
たまにしか使わないXcodeを外付けSSDに移動した
DockerやらAdobe関係で内蔵SSDが逼迫していて、OSのアップデートのたびに悩んでいたので、Xcodeを外付けSSDに移動したよ。 環境 Mac mini 2020 M1チップ Monterey 12.3 外付けSSDはSATA接続のやつ ドッキングステーションはこれ 安いけどスリープ時に何故か接続が切れてる時がある。 まず、SSD をフォーマットした とりあえずSSDをAPFS(MacOS拡張)にフォーマットした。 ネットを漁っているとOSの入っているディスク(起動ディスク)じゃないと起動しない説があったので、後々OSを入れられるようにこちらを選んだ。(起動ディスクである必要はなかった!) フォーマットの方法はディスクユーティリティで該当のSSDを選べばできるよ。 アプリケーション > ユーティリティ > ディスクユーティリティ 試したこと 既にインストールされている(AppStoreでダウンロードした)Xcodeを外付けSSDに移して起動してみた。 ダメでした。 パスを通してみた。 sudo xcode-select --switch /Volumes/SSDのパス/Xcode.app こちらもずっとくるくる状態でダメでした。 参考: うまくいく人もいるみたい。 うまく行った方法 Apple Developer ページからダウンロードした。 Apple IDでサインインを求められるのでサインインする。 Develop > Downloads > More でXcodeがダウンロードできる Xipファイルをダウンロード⇨外付けSSDに移して展開。 とんでもなく時間がかかります。(2〜3時間) その間にスリープに入ってSSDの接続が切れるとエラーが出るのでスリープの時間を変更しておこう。 初回起動時に Install additional required components? と出るので Install を押す。 起動できました! エミュレーターも正常に動き、いまのところ特に困っていません。 わーい!
- 投稿日:2022-03-23T23:32:04+09:00
Xcodeを外付けSSDに移動した
DockerやらAdobe関係で内蔵SSDが逼迫していて、OSのアップデートのたびに悩んでいたので、Xcodeを外付けSSDに移動したよ。 環境 Mac mini 2020 M1チップ Monterey 12.3 外付けSSDはSATA接続のやつ ドッキングステーションはこれ 安いけどスリープ時に何故か接続が切れてる時がある。 まず、SSD をフォーマットした とりあえずSSDをAPFS(MacOS拡張)にフォーマットした。 ネットを漁っているとOSの入っているディスク(起動ディスク)じゃないと起動しない説があったので、後々OSを入れられるようにこちらを選んだ。(起動ディスクである必要はなかった!) フォーマットの方法はディスクユーティリティで該当のSSDを選べばできるよ。 アプリケーション > ユーティリティ > ディスクユーティリティ 試したこと 既にインストールされている(AppStoreでダウンロードした)Xcodeを外付けSSDに移して起動してみた。 ダメでした。 パスを通してみた。 sudo xcode-select --switch /Volumes/SSDのパス/Xcode.app こちらもずっとくるくる状態でダメでした。 参考: うまくいく人もいるみたい。 うまく行った方法 Apple Developer ページからダウンロードした。 Apple IDでサインインを求められるのでサインインする。 Develop > Downloads > More でXcodeがダウンロードできる Xipファイルをダウンロード⇨外付けSSDに移して展開。 とんでもなく時間がかかります。(2〜3時間) その間にスリープに入ってSSDの接続が切れるとエラーが出るのでスリープの時間を変更しておこう。 初回起動時に Install additional required components? と出るので Install を押す。 起動できました! エミュレーターも正常に動き、いまのところ特に困っていません。 わーい!
- 投稿日:2022-03-23T18:51:43+09:00
【Swift】カスタムインプットビュー対応のキーボードで隠されない文字入力欄を作る
iOSには普段利用するシステムキーボードがあります。 これとは別にサービスによってスタンプや絵文字など独自の入力を行いたい場合があります。 そのような場合に独自入力は別UIViewで表示/非表示を制御する方法もありますが、 UITextField ではカスタムインプットビューを使うことでキーボードの一部として扱うことが出来ます。 この記事では以下のような表示の作り方や入力しやすい工夫について記載します。 キーボードで隠れないようにする UITextFieldを追加しただけではキーボードを表示した際に隠れてしまいます。 その為、キーボードが表示されている場合にキーボードの真上に UITextField が表示されるように移動させます。 キーボードの表示/非表示イベントは以下のように Notification を登録することで取得することが出来ます。 SampleViewController.swift import RxSwift import RxCocoa public final class SampleViewController: UIViewController { private var disposeBag = DisposeBag() public override func viewDidLoad() { super.viewDidLoad() bindNotification() } func bindNotification() { NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification) .takeUntil(rx.deallocated) .subscribe(onNext: { [weak self] notification in // キーボードが開く際の処理を記載 }) .disposed(by: disposeBag) NotificationCenter.default.rx.notification(UIResponder.keyboardWillHideNotification) .takeUntil(rx.deallocated) .subscribe(onNext: { [weak self] notification in // キーボードが閉じる際の処理を記載 }) .disposed(by: disposeBag) } } また、取得できる情報からキーボードの高さやアニメーション等も取得することが出来ます。 SampleViewController.swift NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification) .takeUntil(rx.deallocated) .subscribe(onNext: { [weak self] notification in guard let self = self else { return } guard let userInfo = notification.userInfo else { return } // アニメーションカーブ guard let curve = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? Int else { return } // キーボードのサイズ情報 guard let keyboardInfo = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { return } // アニメーション秒数 guard let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval else { return } }) .disposed(by: disposeBag) この動きに合わせてUITextFieldをアニメーションさせることにより、キーボードに隠れないように表示することが可能です。 SampleViewController.swift // UITextFieldのBottomのNSLayoutを設定 @IBOutlet private var textFieldBottom: NSLayoutConstraint! // キーボードを表示する時のアニメーション private var showKeyboardAnimation: UIViewPropertyAnimator? // キーボードを隠す時のアニメーション private var hideKeyboardAnimation: UIViewPropertyAnimator? func showTextField(curve: Int, keyboardInfo: CGRect, duration: TimeInterval) { if let curve = UIView.AnimationCurve(rawValue: curve) { let height = keyboardInfo.size.height let safeAreaHeight: CGFloat = 34// SafeAreaの高さを取得、こちらは省略させて頂きます。 self.hideKeyboardAnimation?.stopAnimation(true) self.showKeyboardAnimation = .init(duration: duration, curve: curve) { self.textFieldBottom.constant = -(height - safeAreaHeight) self.view.layoutIfNeeded() } self.showKeyboardAnimation?.startAnimation() } } func hideTextField(curve: Int, duration: TimeInterval) { if let curve = UIView.AnimationCurve(rawValue: curve) { self.showKeyboardAnimation?.stopAnimation(true) self.hideKeyboardAnimation = UIViewPropertyAnimator(duration: duration, curve: curve) { self.textFieldBottom.constant = 0 self.view.layoutIfNeeded() } self.hideKeyboardAnimation?.startAnimation() } } アニメーションにはUIView.animateのメソッドも存在しますが、 こちらはアニメーション中にキャンセルが出来ません。 表示→非表示や、システムキーボード→カスタムインプットビューを素早く行った際に アニメーションがぶつかってしまう為、UIViewPropertyAnimatorを利用しています。 カスタムインプットビューを追加する カスタムインプットビューとは The custom input view to display when the text field becomes the first responder. 引用元:UITextField.inputView UITextFieldにフォーカスが当たったときに表示するViewを独自に作成したViewに変更させることが出来ます。 こちらにnilの場合はデフォルトのシステムキーボードが表示され、デフォルトではnilになっています。 カスタムインプットビューは絵文字やスタンプ、 入力プリセット等サービスに特化した入力欄を用意する場合に用いられます。 カスタムインプットビューを表示/非表示する UITextField.inputViewに対してカスタムインプットビューを追加します。 SampleViewController.swift @IBOutlet private weak var textField: UITextField! func showCustomInputView() { // 表示するカスタムインプットビューを生成 let customInputView = generateCustomInputView() textField.resignFirstResponder() textField.inputView = customInputView textField.becomeFirstResponder() } inputViewに対してカスタムインプットビューを設定する際に前後でresign, becomeを行っています。 これを行わなかった場合、システムキーボード表示中にカスタムインプットビューに切り替えることが出来ませんでした(要調査) 非表示にする場合はnilを代入します。 SampleViewController.swift @IBOutlet private weak var textField: UITextField! func hideCustomInputView() { textField.resignFirstResponder() textField.inputView = nil textField.becomeFirstResponder() } 今回は例として下記のような定型文を入力する用のカスタムインプットビューを作成しました。 組み込んだ際の実際の動作は下記のようなものとなります。 システムキーボードとカスタムインプットビューの切り替えにはUIButtonのTapで行っています。 前述したとおり、UITextFieldのアニメーションにUIViewPropertyAnimatorを使っており、 表示/非表示をそれぞれキャンセル可能にしている為、 キーボードが切り替わってもスムーズに追従します。 以上
- 投稿日:2022-03-23T18:20:42+09:00
初めてiOSアプリをリリースした話
はじめに こんにちは!初めましてsoraと申します! カレンダーアプリをリリースしたのでこちらにて紹介させてください! ちなみに私は現在、22年卒の大学生でSwift歴は2020年9月~です。 リリースしたアプリの紹介 今回リリースしたアプリは「Re:スケ」というカレンダーアプリです。このアプリは大学のゼミの卒業制作として3人でチームを組み作ったアプリです。 カレンダーアプリを作った理由は、みんなが使えるアプリを作りたいってなったのと今までカレンダーを扱ったアプリを作ったことがなかったので勉強したいからという割とざっくりとした理由でカレンダーアプリを作ることにしました。 AppStore: https://apps.apple.com/jp/app/re-%E3%82%B9%E3%82%B1/id1607735456 ソースコードはこちらです。 よろしければインストールして試してみて欲しいです! アプリ概要 このアプリはカレンダーでスケジュール管理するスマホアプリです。 主な機能としては 日付ごとのイベント管理機能(CRUD) リマインダープッシュ通知 カスタマイズ可能なカレンダー表示(スライド方向の切り替え設定、曜日順、土日祝のみと平日のみの表示機能) 六曜の表示 Widget Googleカレンダーアプリと同期、iOS標準カレンダーアプリと同期 となっております。 開発環境 Swift5.5.2 Xcode13.2.1 使用ライブラリ FSCalendar カレンダーの実装 RealmSwift 日付ごとのイベント管理 CalculateCalendarLogic 祝日判定 TextFieldEffects TextFieldのUI IQKeyboardManager キーボード表示時の画面のスライド PKHUD 通信時のローディングインジケーター SwiftLint ソースコードの品質管理 AppAuth OAuth2.0およびOpenIDConnectプロバイダーと通信するためのクライアントSDK GTMAppAuth AppAuthでリクエストを認証するためGTMFetcherAuthorizationProtocolの実装を提供する GoogleAPIClientForREST/Calendar Googleの様々なAPI へのアクセス・データの取得などを簡単にできるようにしてくれるもの(今回はGoogleカレンダー) Google-Mobile-Ads-SDK Googleモバイル広告の最新世代で、洗練された広告フォーマットと、モバイル広告ネットワークや広告ソリューションにアクセスするため LicensePlist CocoaPods、SwiftPMなどで管理しているライブラリのライセンス表示を自動的に生成するツール Firebase Firebaseのアナリティクスでユーザー解析をするため 特徴 カスタマイズ可能なカレンダー表示 これは土日祝に予定を追加する際、その月の土日祝や平日がくっきり瞬時に分かります。普段土日祝の休日にしか予定を入れない人や学生には便利な機能ではないかと思います。 作ってみた感想 今まで何個かアプリを個人で作っていましたが、今回初めてカレンダーを扱うアプリを作りました。その中でデータベースのRealmも初めて実装しました。ですので、最初はその勉強から始まりましたが、無事に完成させることができて良かったです。 苦労した点は、Realmはこれまで利用していたSQLiteやFirebaseと比べて設計思想や使い方が少し違うので、理解して実装しなければクラッシュがよく起こるところとシンプルなアプリですので既存アプリとどう差別化するかについては苦労しました。 アプリをリリースして良かったこと ユーザーから意見やアイデアをもらえる やはりなんといってもユーザーからの声が一番嬉しいですね。このアプリはまだまだ知名度が低いですが、周りの友人から「便利やな」や「もっとここをこうして欲しい」とか「今までカレンダーアプリ使ったことないけどこれを機に使ってみる」などのポジティブなフィードバックをもらった時は「これがアプリ開発か~」と嬉しかったことを覚えています。 もし、アプリ開発の勉強しているけどリリースしたことがない人はなにかしらのアプリを作ってリリースすることをおすすめします。 私はもっと早くにアプリを作ってリリースしていればよかったと少し後悔しています。(笑) おわりに 既存のカレンダーアプリに比べて劣るとこはたくさんあると思いますが、大学のゼミの卒業制作としてしっかり完成させてリリースできて良かったです。技術的にも、興味があったものや実装したことがないものを中心に採用できたので自己成長にも繋がりました。 今後はSwiftUIも勉強し、どんどんアプリを作っていきたいと思っています。 あと、Flutterにも興味あるので余裕があれば勉強してみようかなと思っています。
- 投稿日:2022-03-23T05:17:09+09:00
Pod install がエラーになる
You may have encountered a bug in the Ruby interpreter or extension libraries. Cocoa Podsをインストールした後、Pod installで上記のエラーが出たときは、ターミナルを一回閉じてみよう。 ? フリーランスエンジニアです。 お仕事のご相談こちらまで rockyshikoku@gmail.com Core MLやARKitを使ったアプリを作っています。 機械学習/AR関連の情報を発信しています。 Twitter Medium GitHub