xyk blog

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

swift

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

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

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…

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

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

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…

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 を変化させることでキーボードで隠れないようにしま…

Swift の Protocol Extension 内で Selector を呼び出す

検証環境: Xcode 11.6 Swift 5.2.4 Swift の Protocol Extension 内では @objc をつけたメソッドを実装しても #selector で呼び出しすることはできません。 例えば以下のコードでは NotificationCenter の引数で selector を指定しています。 protocol Keybo…

Swift - UIBezierPath で吹き出しのパスを描く

検証環境: Xcode 11.6 Swift 5.2.4 こんな吹き出しを UIBezierPath を使って描画してみます。 パスの描画順は以下図の流れになっています。 吹き出し部分は addQuadCurve メソッドを使い、曲線上の終点とコントロールポイント1つを指定します。 この時の終…

Swift でフォトライブラリに UIImage を保存する

検証環境: Xcode 11.4 Swift 5.2 Photos.framework を使って フォトライブラリに UIImage 画像を jpeg または png で保存する方法です。 まず Info.plist に使用目的を追加します。 <key>NSPhotoLibraryUsageDescription</key> <string>フォトライブラリの写真を利用します。</string> <key>NS</key>…

IBDesignable を使ったカスタムビュー使用時に発生するエラー原因を調べる

検証環境: Xcode 11.3.1 Swift 5.1.3 Storyboard上で IBDesignable を使ったカスタムビューを貼り付けたところ、 error: IB Designables: Failed to render and update auto layout status for UIViewController (nyp-0u-XJD): The agent crashed というエラ…

IBDesignable を使ったカスタムビューのプレビュー時に呼ばれるメソッドについて

検証環境: Xcode 11.3.1 Swift 5.1.3 IBDesignable や IBInspectable を使うことで Storyboard や Xib 上でカスタムの属性の設定ができ、変更がリアルタイムに反映されてプレビューできるようになります。 ところで、IBOutlet で接続したビューに対して初期…

Xcode の Swift Package Manager で Repository を追加しようとしたらエラーになる

検証環境: Xcode 11.3.1 Swift 5.1.3 Swift Package Manager でリポジトリを追加しようとしたところ以下のようなエラーが出た。 Couldn’t communicate with a helper application. Try your operation again. If that fails, quit and relaunch the applicat…

【Swift5】UITextViewの任意の文字列をタップ可能なリンクにする

検証環境: Xcode 11.3 Swift 5.1.3 UITextView の任意の文字列のタップ可能なリンクにする方法についてです。 まず NSAttributedString.link 属性を使用してリンク化する text と range を設定します。 そして UITextViewDelegate の textView(_:shouldInter…

UIStackView に背景色を設定する

検証環境: Xcode 11.3 Swift 5.1.3 UIStackView の backgroundColor プロパティに色を設定しても描画されません。 (※追記: iOS 14 から UIStackView の backgroundColor で背景色を付けられるようになりました。) そこで UIStackView の layer に CAShapeLay…

UIRefreshControl のプルダウンの距離を短くする

検証環境: Xcode 11.3 Swift 5.1.3 標準 の UIRefreshControl ですがアクションを開始させるためのプルダウンの距離が長いので短くする方法について調べました。 いくつかやり方はあるようですが今回は非推奨なやり方になりますが UIRefreshControl のプライ…

UITextView にプレースホルダーを設定できるようにする

検証環境: Xcode 11.3 Swift 5.1.3 UITextView にプレースホルダーを設定できるカスタムビューを作成した。 import UIKit @IBDesignable open class PlaceHolderTextView: UITextView { @IBInspectable open var placeHolderText: String = "" { didSet { pl…

Swift で端末の低電力モード、Appのバックグラウンド更新の状態を取得する

検証環境: Xcode 11.3 Swift 5.1.3 「低電力モード」になっているかを取得 if ProcessInfo.processInfo.isLowPowerModeEnabled { // Low Power Mode is enabled. Start reducing activity to conserve energy. } else { // Low Power Mode is not enabled. }…

UITableViewCell のタップした位置の IndexPath を取得する

検証環境: Xcode 11.3 Swift 5.1.3 UITableViewCell 上に置いたボタンをタップしたときにそのセルをアニメーション削除したい。 UITableViewDataSource プロトコルの cellForRowAt メソッドにセルのコールバックプロパティに引数の indexPath を渡す実装にし…

プログラムから iPhone 画面の明るさを取得、変更する

検証環境: Xcode 11.2.1 Swift 5.1.2 iPhone 画面の明るさは UIScreen.main.brightness プロパティから取得できます。 また、UIScreen.main.brightness プロパティに 0.0 から 1.0 の値を設定することで明るさをプログラムから変更できます。 1.0 が最も明る…

iOS13 で UITableViewCell をタップしても背景色がハイライトしなくなった

検証環境: Xcode 11.1 Swift 5.1 iOS13 で UITableViewCell をタップしてもハイライトしなくなったケースがあった。 原因はこちらの UIKit の仕様変更だった。 Apple Developer Documentation The UITableViewCell class no longer changes the backgroundCo…

Swift で 画像ビューワを実装する その3 - 複数画像を並べて表示

検証環境: Xcode 11.1 Swift 5.1 前回の続き。 後ほど。

Swift で 画像ビューワを実装する その2 - ダブルタップで拡大縮小

検証環境: Xcode 11.1 Swift 5.1 前回の続き。 今回は画像をダブルタップしたときに拡大・縮小するように実装を追加する。 ScrollView のタップ箇所をズームさせる方法は Apple のプログラミングガイドを参考に実装する。 https://developer.apple.com/libra…

Swift で 画像ビューワを実装する その1

検証環境: Xcode 11.1 Swift 5.1 画像1枚を表示するシンプルな画像ビューワを実装してみる。 画像はピンチで拡大縮小ができるようにする。 実装方法としては UIScrollView 上に UIImageView を配置して実現する。 ただ乗せるだけだと画像の起点が左上になる…

Swift で for-in ループ時にキャストする

環境: Swift5.1 例えば、あるビューに追加されている複数のサブビューの中から UIButton にキャストできるものだけ処理する場合 for case let button as UIButton in view.subviews { // ボタンに対する処理。ボタン以外はスキップされる。 // 例えばボタン…

UITableView に行追加すると contentOffset がズレる時の対応

環境: Xcode10.3、Swift 5.0.1 UITableView で行の一番下までスクロールして、データの追加読み込み行い、行追加後の reloadData 時にカクっと画面位置がズレる場合がある。 セルの高さはすべて固定値の場合の話。 UITableView の rowHeight と estimatedRow…