xyk blog

最近は iOS 開発の記事が多めです。

ios

Swift で月初・月末を取得する

検証環境: Xcode Version 12.5 (12E262) Swift 5.4 Swift で、ある月の月初・月末を取得する方法。 月初の取得は1日固定で取得するだけだが、月末の取得は月初から1ヶ月進めて1日戻すことで算出できる。 例1:2020年2月の月初と月末を取得する let calendar …

表示中のマップ(MKMapView)領域内に含まれるアノテーション(MKAnnotation)を調べる

検証環境: Xcode Version 12.5 (12E262) Swift 5.4 iOS Deployment Target 11.0 表示中のマップ(MKMapView)領域内に配置されているアノテーション(MKAnnotation)を調べる方法について。 MKMapView.visibleMapRectで現在表示中の領域を取得し、MKMapView.anno…

Swift 5.3 からの Multiple Trailing Closures

Swift 5.3(SE-0279、SE-0286)から追加された Multiple Trailing Closures について。 例えば、UIView.animate メソッドのような引数に複数の Closure を持つ場合の Trailing Closure は Swift5.2 までは次のように書いていた。 UIView.animate(withDuratio…

iOS アプリがユニバーサルリンクから起動されたかを判定する

検証環境: Xcode Version 12.5 (12E262) Swift 5.4 ユニバーサルリンク(Universal Link)から iOS アプリが呼び出された場合にはAppDelegateのapplication(_:continue:restorationHandler:)メソッドが呼び出される。 これはアプリが 未起動状態からアプリ起動…

App内課金の審査が「審査待ち」から進まない

ios

App内課金の審査が審査待ち状態から進まなかった時の話。 アプリの審査については最近は1~2日で終わる。 今回は新規のアプリというわけではなく、追加で消耗型のApp内課金を追加したのだが、「審査待ち」状態のまま、何の音沙汰もなく1週間ほど過ぎてしまっ…

Swift で少数第二位や第三位で丸め処理を行う

検証環境: Xcode 12.4 Swift 5.3.2 Swift で少数第二位や第三位で丸め処理を行う方法について。 例えば第二位で四捨五入したいのであれば、対象の少数値にまず10を掛けてからrounded()で四捨五入し、その後に10で割ればよい。 実行例 let pi = Double(3.1415…

Swift の Float(CGFloat) や Double で小数点の丸め処理を行う

検証環境: Xcode 12.4 Swift 5.3.2 Swift の浮動小数点数型である Float(CGFloat) や Double で小数点の切り捨て、切り上げ、四捨五入などの丸め処理をするには Swift3 から追加された FloatingPoint プロトコルの extension に定義されている roundedメソッ…

UITabBar の特定タブの選択時の色を変える

検証環境: Xcode 12.4 Swift 5.3.2 iOS Deployment Target 14.4 UITabBar 使用時に、特定タブ(UITabBarItem)のみ、選択時の色を変える方法について。 2つ目のタブを赤に変更 その他のタブはデフォルトの tint color タイトル文字色はtabBarItem.setTitleTex…

iOS14 での CLLocationManager の変更点

検証環境: Xcode 12.4 Swift 5.3.2 iOS Deployment Target 14.4 iOS で位置情報を取得するにはCLLocationManagerを使用するのだが、iOS14から使い方が少し変更になったのでメモ。 1つ目がアプリが位置情報サービスの使用するための承認ステータスauthorizat…

MKAnnotation ピンの画像をカスタマイズする

検証環境: Xcode 12.4 Swift 5.3.2 iOS Deployment Target 14.4 マップ(MKMapView)上のピンの画像をデフォルトのものではなく別の画像にカスタマイズする方法について。 iOS11からマップビューにデフォルトでMKMarkerAnnotationViewが登録されているので、ma…

マップ(MKMapView)上にピンを立てる

検証環境: Xcode 12.4 Swift 5.3.2 iOS Deployment Target 14.4 マップ(MKMapView)を表示してピンを立てるだけの簡単な実装例。 マップビューにピンを追加するには、MKAnnotationプロトコルを適合したクラスを用意して、位置情報CLLocationCoordinate2Dを設…

Swift - Struct のイニシャライザを Xcode で自動生成する

検証環境: Xcode 12.4 Swift 5.3.2 Swift の Struct にはデフォルトで暗黙的なイニシャライザ init メソッドが定義されているので自分で実装する必要ないのだが、public structで定義して別モジュールから import して使う場合は使用できない。 以下の Initi…

Swift - UIBezierPath でクーポン風画像のパスを描く

検証環境: Xcode 12.4 Swift 5.3.2 UIBezierPath のよるお絵描きシリーズ。 今回は UIBezierPath を使って、以下のようなクーポン用画像としてよく使われる図形をを描いてみる。 Playground コードサンプル import UIKit import PlaygroundSupport class Cou…

UICollectionViewCell の Self-Sizing で動的にセルサイズを調整する

検証環境: Xcode 12.4 Swift 5.3.2 UICollectionViewCell の Self-Sizing 機能でコンテンツに基づいて動的にセルサイズを調整する方法について。 まず今回 UICollectionView を使って実現したいレイアウトは横幅が画面幅(collectionView.frame.width)で、縦…

UICollectionView で複数 Section の Header と Footer を表示する

検証環境: Xcode 12.4 Swift 5.3.2 UICollectionView で複数セクションのヘッダーとフッターを表示する方法について。 StoaryBoard 設定 まず StoryBoard で Root View に UICollectionView 及び UICollectionViewCell のビューを設置しておく。 UICollectio…

UICollectionView でタグクラウド風のレイアウトを実現する

検証環境: Xcode 12.4 Swift 5.3.2 UICollectionView を使ってタグクラウド風にセルが並ぶレイアウトを実現したい。 UICollectionView のデフォルトのレイアウトである UICollectionViewFlowLayout をそのまま使うと以下のようにセル間にスペースが入ってし…

UICollectionViewCell の横幅を計算する

検証環境: Xcode 12.4 Swift 5.3.2 UICollectionView のセルの横幅をいい感じに調整する方法について。 前提条件として、セルの並び方向はデフォルトのflowLayout.scrollDirection = .vertical、セルのサイズは正方形ですべてのセルが同じサイズであること。…

新生銀行のスマホ認証サービスの更新方法(iPhone)

ios

新しい iPhone に移行する際に一番面倒だった新生パワーダイレクトのスマホ認証サービスの更新についてのメモ。 新生銀行の新生パワーダイレクトでは、振り込みなどの取引時には Symantec の「VIP Access」アプリを使った認証を行う必要がある。 www.shinsei…

Array の indices を使って安全に添字アクセスする

検証環境: Xcode 12.3 Swift 5.3.2 配列に添字アクセスする場合、存在しないインデックスにアクセスすると Index out of rangeの例外が発生してしまうので、事前にインデックスが配列数の範囲内であるかをチェックする必要がある。 そういう場合に Array#ind…

UITabBar の中央のタブを大きな画像ボタンに変更する2

検証環境: Xcode 12.3 Swift 5.3.2 前回の記事の実装では問題が発生することが発覚したので実装方法を見直す。 xyk.hatenablog.com 問題というのは、UINavigationController のプッシュで画面遷移する時に、事前に遷移先 UIViewController の hidesBottomBar…

UITabBar の中央のタブを大きな画像ボタンに変更する

検証環境: Xcode 12.3 Swift 5.3.2 ※追記 この記事の実装方法では問題があることが発覚したので新しい記事で修正版を書いた。 xyk.hatenablog.com 多くのアプリでよく見かける、タブバーの中央に大きな画像ボタンを配置する方法について。 やり方はいろいろ…

UIImage の画像を単色で塗りつぶす

検証環境: Xcode 12.2 Swift 5.3.1 UIImage の画像を単色で塗りつぶす方法について。 元画像 変更後 UIImageView と一緒に使って変更する UIImage を UIImageView にセットして一緒に使う場合は、UIImage のRenderingMode.alwaysTemplateの指定とUIImageView…

Xcode 関連ファイルを定期的に削除する

検証環境: Xcode 12.2 Swift 5.3.1 Xcode のキャッシュファイルなどの関連ファイルはかなりのディスクスペースを消費するので定期的に削除するほうがよい。 DerivedData 中間生成ファイル。アプリ単位でビルド時に作成される。 ビルドが突然できなくなった場…

Carthage で The file couldn't be saved. Command PhaseScriptExecution failed with a nonzero exit code のエラー

検証環境: Xcode 12.2 Swift 5.3.1 最近、Carthage でビルドをしていると以下のエラーが出てビルドできなくなる現象がちょくちょく発生していた。 The file couldn't be saved. Command PhaseScriptExecution failed with a nonzero exit code こちらの issu…

マップ(MKMapView)上のある座標が円領域内に含まれるかどうかを判定する方法

検証環境: Xcode 12 Swift 5.3 マップ(MKMapView)上のある座標が円領域内に含まれるかどうかを判定する方法。 CLCircularRegionを使うと簡単にできる。 import MapKit // 対象の座標(CLLocationCoordinate2D) let location = CLLocationCoordinate2D(latitud…

マップ上に追加した MKCircle やMKPolygon などの領域内にある座標かどうかを判定する方法

検証環境: Xcode 12 Swift 5.3 マップ(MKMapView)上にオーバーレイしたMKCircleやMKPolygonなどの領域内にある座標かどうかを判定する方法。 座標の緯度経度はCLLocationCoordinate2Dで扱っているとする。 マップ上に MKCircle や MKPolygon の図形をオーバ…

表示中のマップ(MKMapView)領域内に含まれている座標かどうかを判定する

検証環境: Xcode 12 Swift 5.3 まずMapKitをインポートしておく。 import MapKit MKMapRect を使う ある座標が表示中のマップMKMapView領域内に含まれているかで判定する方法。 座標の緯度経度はCLLocationCoordinate2Dで扱っているとする。 表示中のマップ…

MKMapView 上のタップした地点を中心にして正方形を描く

検証環境: Xcode 12 Swift 5.3 前回は地図上(MKMapView)に円を描画したが、今回は正方形の矩形を描画してみる。 まずMapKitをインポートしておく。 import MapKit MKMapView にUITapGestureRecognizerを追加してタップを検出する。 let tapGesture = UITapGe…

MKMapView 上のタップした地点を中心にして円を描く

検証環境: Xcode 12 Swift 5.3 地図上(MKMapView)に図形を描画するためにはMKOverlayプロトコルに適合したオブジェクトをMKMapView#addOverlayメソッドで追加する必要がある。 まずMapKitをインポートしておく。 import MapKit MKMapView にUITapGestureReco…

Swift で UITextView のテキスト内のURLをリンク化する

検証環境: Xcode 12 Swift 5.3 UITextView のテキスト内のURLをリンク化するには、isSelectableプロパティをtrue、そしてdataDetectorTypesプロパティに.linkを指定すればよい。 これでURL部分がリンク化され、リンクをタップすると Safari で開くようになる…