しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Defaultsを使ってUserDefaultsの管理を楽にする

Defaultsというライブラリを試してみました github.com 新規にプロジェクトを作ってSPMでライブラリを追加します キーの定義と値の取得・保存は下の通りです import Defaults extension Defaults.Keys { static let quality = Key<Double>("quality", default: 0.8) </double>…

Jetpack Compose+Snapshotで画面を作ってみる

Jetpack ComposeとSnapshotを使ったViewModelで画面を構築してみました まずはViewModelなしでボタンを押すと画面の数字が増えるViewを作ってみました import androidx.compose.runtime.setValue import androidx.compose.runtime.getValue class MainActivi…

SwiftでKotlinのapplyのような事をする(Then)

Thenというライブラリを使ってKotlinのapplyに近い事をしてみました github.com ライブラリはSwift Package Managerで追加します 他にもCocoaPodsにも対応しています Thenの使い方は下の通りです thenというメソッドを呼んでその中でそのオブジェクトに対す…

XcodeのLaunch Screen周りについて調べる

アプリ起動時の画面の設定であるLaunch Screenについて調べてみました Launch ScreenはInfo.plistに追加して利用します Launch Screen(UILaunchScreen)はiOS14から使えるようになったキーで起動画面の画像や背景色などを設定できます Storyboardほど複雑なこ…

ChatGTP for MacでXcodeのコードを修正してみる

下記事でChatGPTがXcode上のファイルの修正もできるようになったという事で試してみました www.publickey1.jp まずは下URLでデスクトップ版ChatGPTをダウンロードします デスクトップで ChatGPT | OpenAI 起動するとログインを求められるので自分のアカウン…

SwiftのCombineでModelの値を監視する(UIKit)

Combineを使ってViewModelの値を監視してみます 今回はUIKit(Storyboard)を使った処理について記述します まずはViewController用のViewModelを作成します import Combine import Foundation class ViewModel { @Published var count = 0 } 次にStoryboardに…

Argument type 'Date' does not conform to expected type 'CVarArg'というエラーについて調べる

Swiftで下のようなコードを書いた時にタイトルのようなエラーが出ました let text = String(format: "date: %@", Date()) エラーは案内に従って下のように修正すれば解消します let text = String(format: "date: %@", Date() as CVarArg) エラーの原因です…

iOSのSceneやWindowなどを整理する

SceneDelegateやWindowなどについて改めて調べてみました SceneDelegateはiPadのマルチウィンドウで使われます 具体的にはSplit ViewやSlide overなどの時に活躍します 検証のためにマルチウインドウ対応のアプリを作ってみます 変更自体は簡単でInfo.plist…

Kotlinでアプリを閉じた時のバックグラウンド処理を動かす

アプリを閉じた時に通知をセットする方法について下URLを参考に調べてみました developer.android.com 調べた所、通知セットはMainActivityのonStopが良いようです onPauseでも動くのですが、重い処理は途中で停止される事もあるのでonStopの方が確実そうで…

WorkManagerを使ってバックグラウンド処理を行う

Androidアプリでバックグラウンド処理を行うためにWorkManagerを試してみました まずはbuild.gradle.ktsにライブラリを追加します implementation("android.arch.work:work-runtime-ktx:1.0.1") 次にWorkerを継承したクラスを作成します doWorkメソッドの中…

UIViewControllerTransitioningDelegateでUIViewControllerのpresentのアニメーションをカスタマイズ

UIViewControllerをpresentする時のアニメーションのカスタマイズ法について調べてみました まずはプロジェクトを作ってUIViewControllerを2つ作ります それぞれ真ん中のボタンを押す事で別画面の表示・画面を閉じる事をできるようにします modalPresentatio…

SwiftUIの@Stateを動かしてみる

@Stateについて調べてみました @Stateは下のようにView内の変数で利用します struct ContentView: View { @State var test = 0 var body: some View { VStack { Text("\(test)") Button(action: { test += 1 }, label: { Text("Button") }) } .padding() } }…

Jetpack Composeで画面遷移をする

まずは画面遷移をするためにライブラリを追加します build.gradleに下のようにnavigation-composeを記述します dependencies { implementation("androidx.navigation:navigation-compose:2.8.5") } 下のように画面を2つ作ります @Composable fun Screen1(nav…

allowCrossUidActivitySwitchFromBelowについて調べてみる

AndroidのOS15から追加されたallowCrossUidActivitySwitchFromBelowについて、下サイトを参考に調べてみました 動作の変更点: Android 15 以上をターゲットとするアプリ | Android Developers allowCrossUidActivitySwitchFromBelowはAndroidManifest.xmlのa…

Gemini in Android Studioを動かしてみる

Gemini in Android Studioで何ができるか試してみました 初期設定は下ページを参考にしました Gemini in Android Studio | Android Developers まずはAndroid StudioのView → Tool Windows → Gemini を選択します 選択すると下のような表示が出るのでログイ…

SwiftUIのForEachについて整理

SwiftUIのForEachなんですがあまり分からずに使っているので調べてみました ForEachですが下のように繰り返しのViewを表示する際に利用します struct ContentView: View { var body: some View { ForEach(1..<6) { i in Text("Item \(i)") }.padding() } } F…

Kotlinのrememberについて調査する

KotlinのJetpack compose試した時にrememberというキーワード出てきたので調べてみました 調べた所、Jetpack composeを保持する時に使うキーワードのようです 今回は手元の環境でrememberを動かして動作を確認してみました まずはプロジェクトを作ってMainAc…

Kotlinでウィジェットのボタンを押したらActivityを起動する

ウィジェットのボタンを押したら特定のActivityを開くような実装をしてみたいと思います まずは新規プロジェクトを作成します 次はウィジェットを追加します 追加後はnew_app_widget.xmlで下のようにボタンを配置します

Xcode 16から登場したSwift AssistとGitHub Copilotの比較

Xcode 16からAIがコード補完をできる機能が登場しました XcodeではGitHub Copilotも使えるので簡単に補完の性能の比較をしてみました GitHub Copilot単独で試した記事は下のものです llcc.hatenablog.com 比較のため、GitHub CopilotをOFFにします 設定アプ…

SwiftUIの@Environmentについて調べる

SwiftUIでダークモード判定する時などに使う@Environmentについて調べてみました 調査では下記事を参考にしました qiita.com @Environmentの使い方は下の通りです 下ではダークモードかの判定をしています struct ContentView: View { @Environment(\.colorS…

SwiftUIのViewModifierを使ってみる

SwiftUIでは下のようにModifier(imageScaleやpaddingなど)を中心にコーディングしていきます struct ContentView: View { var body: some View { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundStyle(.tint) Text("Hello, world!") }…

Excluded Architecturesをセットしないと動かない問題について調べる

CocoaPodsを使ってiPhoneアプリを開発していると下のようなエラーが出てシミュレーターで動かせない事があります Could not find module 'SwiftDate' for target 'arm64-apple-ios-simulator'; found: x86_64-apple-ios-simulator, at: /Users/XXX/Library/D…

SwiftUIのbuildifメソッドを確認する

SwiftUIでif文が使えるのはbuildIfに自動変換されていると聞いたのでbuildIfを見てみました buildIfメソッドはViewBuilderのメソッドで下のようなものになります extension ViewBuilder { public static func buildIf<Content>(_ content: Content?) -> Content? wher</content>…

SwiftUIのmaskで画像を切り抜いてみる

SwiftUIのマスクを使って色々試してみました 画像素材は下サイトのものを使わせてもらいました フリーテクスチャ素材館/Calkboard(黒板)テクスチャのシームレスパターン4種類(PHOTO) まずは円形に切り抜いてみました struct ContentView: View { var bo…

XcodeでGitHub Copilotを使う

GitHub CopilotがXcodeを公式をサポートしたようなので試してみました ただBeta Previewsなので今後変更される事が多いことは注意が必要です それとGithub Copilotは事前に契約しておく必要があります github.com GitHubのページのLatest Releaseからdmgファ…

SwiftUIのStyleを使ってみる

SwiftUIのStyleを使うとデザインの共通化ができるようなので調べてみました Styleの定義方法は下の通りです ButtonStyleに準拠した構造体を作ってmakeBodyメソッドを定義します struct CustomButtonStyle: ButtonStyle { func makeBody(configuration: Confi…

SwiftのTextKit2の動作を確認する

下のスライドが面白かったので実際に自分でも動作を確認してみました TextKit 2 時代の iOS のキーボードとテキスト入力と表示のすべて - Speaker Deck まずはプロジェクトを作って普通にUITextViewを表示してみました class ViewController: UIViewControll…

xcstrings-toolでxcstringsの翻訳データの補完ができるようにする

xcstrings-toolというツールを使うとxcstringsの翻訳データを補完できるようになるらしいので調べてみました github.com 今回はSwiftPackageManagerを使いました CocoaPodsやCarthageは未対応のようです インストールしたらプラグインを追加します プラグイ…

Layout protocolで柔軟なレイアウトを実現する

iOS 16で登場したLayout protocolというのを使うと柔軟なレイアウトができるようなので調べてみました 使い方ですが、まずは下のようにCustomLayoutを定義します CustomLayoutはVStackやHStackのように親ビューとして使う事ができます struct CustomLayout: …

SwiftUIでアニメーションを実装する

SwiftUIでのアニメーションを試してみました まずは画面上にTextを配置します 最初はButtonで試したのですが、自動的にアニメーションが入ってしまうようなのでTextにしました struct TestView: View { var body: some View { Text("Text") } } まずはボタン…