xyk blog

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

新生銀行のスマホ認証サービスの更新方法(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で扱っているとする。 表示中のマップ…

UIView 同士が重なっているかいないかを判定する方法

検証環境: Xcode 12 Swift 5.3 UIView 同士が重なっているかいないかを判定する方法について。 CGRect#intersects(_:)メソッドで2つの CGRect が交差するかどうかを判定することができる。 UIView の Extension として以下のように追加した。 extension UIVi…

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 で開くようになる…

Swift で UILabel、UITextView の行間を広げる

検証環境: Xcode 12 Swift 5.3 UILabel や UITextView で複数行のテキストを表示する場合、デフォルトでは行間がかなり狭い。 行の間隔を広げるには、UILabel、UITextView のどちらもattributedTextプロパティにNSAttributedString.KeyのparagraphStyle属性…

Xcode で証明書を自動生成する方法

検証環境: Xcode 12 証明書の期限が切れてたので新しい証明書を Xcode から自動生成した。 1年に一度しかやらず、やり方を忘れるのでメモしておく。 昔ながらの手順としては - Keychain Access.app から Certificate Signing Request (CSR) を作成 - Apple …

UITableViewCell の高さ変更時に制約エラー

検証環境: Xcode 12 Swift 5.3 Deployment Target 11.0 UITableviewCell に vertical な UIStackView を配置して、セルタップ時にStackされているビューの isHidden プロパティを切り替えて、セルの高さを広げる処理をしたところ以下の制約エラーが発生した…

Swift で縦横の長さが違う UIImage を 90° 毎に回転させる

検証環境: Xcode 12 Swift 5.3 今回は縦横の長さが違う画像を 90° 回転させた画像を作成する方法について。 表示上、回転するだけでよい場合は UIView の transform プロパティを使うと簡単にできる。 let radians = 90 * CGFloat.pi / 180 imageView.transf…

Swift で UITextField の値の変更を検知する方法

検証環境: Xcode 12 Swift 5.3 UIControl.Event.editingChanged を使う let textField = UITextField(frame: .zero) textField.addTarget( self, action: #selector(textDidChange), for: .editingChanged) @objc func textDidChange(_ textField: UITextFie…

CircleCI で SSH fingerprint が原因で xcodebuild エラー

CircleCI で iOS アプリをxcode: "12.0.0"でビルド中に以下のエラーが出た。 SSH fingerprint が原因でパッケージの依存関係の解決に失敗している。 xcodebuild: error: Could not resolve package dependencies: The server SSH fingerprint failed to veri…

Xcode にキーボードショートカットを追加する

検証環境: Xcode 12 Swift 5.3 Finder を開き、「Cmd + Shift + G」を押す。 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/ を入力してディレクトリを開く。 IDETextKeyBindingSet.plist ファイルをエディタで開く。…

Plain な UITableView で、Grouped っぽいデザインにする

検証環境: Xcode 11.4 Swift 5.2 UITableView の style がデフォルトの Plain だけど、Grouped っぽいデザインにする方法。 Grouped だとデータがない空行は表示されないが、Plain だと表示される。 これは tableView.tableFooterView に UIView を作って突…

IBDesignable を使ったカスタムビューがリアルタイムプレビューに反映されない

検証環境: Xcode 11.4 Swift 5.2 IBDesignable を使ったカスタムビューは StoryBoard 上に配置するとリアルタイムでデザインをプレビューすることができる。 しかし、UITableViewCell 上に配置したときはプレビューできるのに UICollectionViewCell 上にカス…

Swift カメラアプリのサンプル

検証環境: Xcode 11.4 Swift 5.2 Apple 公式の Swift で AVFoundation を用いて実装したカメラのサンプルアプリがあったのでメモ。 サンプルアプリ「AVCam Swift」 ダウンロードはこちら。 developer.apple.com Oevrview 前面カメラと背面カメラの両方から写…

PhotoKit のサンプル

検証環境: Xcode 11.4 Swift 5.2 画像選択UI としては標準で用意されている UIImagePickerController を使えば簡単に実装できるが、複数選択などカスタマイズする場合は PhotoKit を使って自分で実装する必要がある。 (※ 追記: iOS14から追加された PHPicker…

Xcode のデバッグ時に `error: Couldn't IRGen expression, no additional error` が発生

検証環境: Xcode 11.4 Swift 5.2 ちょっとどのタイミングででそうなったのか、把握できていないんだけど、Xcode でブレークポイントで止めて、po コマンドで出力しようとしたら error: Couldn't IRGen expression, no additional error が発生して出力できな…

UIImageView の画像に AspectFit を適用した後の画像サイズを知る方法

検証環境: Xcode 11.4 Swift 5.2 UIImageView の画像に AspectFit を適用した後の画像サイズは、AVFoundation の AVMakeRect(aspectRatio:insideRect:) を使うと自分で計算せずに簡単にサイズを知ることができます。 UIImageView の Extension として実装し…

Swift で UIView を穴を開ける

検証環境: Xcode 11.4 Swift 5.2 Swift で UIView の穴を開ける実装を Playground で試してみます。 今回のサンプルはまず画像を配置し、その上に UIView を被せます。 被せた UView の内部に穴を開けることで下の画像が見えるようにします。 また、ついでに…

Swift で UIImagePickerController を使って写真を読み込む

検証環境: Xcode 11.4 Swift 5.2 Swift で UIImagePickerController を使って写真を読み込むための最小コードサンプルです。 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func h…

UITextField, UITextView 編集時にキーボードで隠れないようにする - Swift Protocol Extension 版

検証環境: Xcode 11.6 Swift 5.2.4 以前にも同様の記事を書いていますが、UITextField, UITextView を UIScrollView (やそのサブクラス、UICollectionView ・UITableView など)上に配置して、contentInset を変化させることでキーボードで隠れないようにしま…