xyk blog

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

swift

iPhone のマイクから拾った音の音程を判定する

環境: Xcode10.3、Swift 5.0.1 iPhone のマイクから拾ったオーディオ情報から音程を判定する方法について調べた。 ちゃんとやるには、離散フーリエ変換 (discrete Fourier transform) を使って周波数を算出するらしいのだけれども、今回はAudioKitというOSS…

Firebase Cloud Messaging によるプッシュ通知をバックグラウンドでも受け取る

Swift version 5.0.1 iOS11 Firebase Cloud Messaging でアプリがバックグラウンドでもプッシュ通知を受け取る方法について。 APNs ペイロードに content-available: 1を含める必要あり。 これが含まれることでアプリがバックグラウンドであっても applicati…

CGAffineTransform を使い View を180度回転、元に戻す

環境: Swift 5.0.1 ある View (ここではUIImageView)を180度回転させる、そして元の状態に戻すアニメーションをさせたい。 こういう場合、 CGAffineTransform の rotation を使えば実現できる。 こんなかんじの動きにしたかったのだが少しハマってしまった。…

UILabelのattributedTextのテキストを他の属性は変更せずに別の文字列に置き換える

環境: Swift5.0 UILabelのattributedTextのテキストを他の属性は変更せずに別の文字列に置き換える例。 @IBOutlet weak var textLabel: UILabel! private func setupUI() { if let attrStr = textLabel.attributedText?.mutableCopy() as? NSMutableAttribut…

UISegmentedControl を未選択状態にする

selectedSegmentIndex に UISegmentedControlNoSegment (-1) を設定する。 この定数を忘れるのでメモ。 segmentedControl.selectedSegmentIndex = UISegmentedControlNoSegment Swift4 から segmentedControl.selectedSegmentIndex = UISegmentedControl.noS…

UIColorの色を暗くする

Swift 4.2.1 現在の色から暗めの色に明度(brightness/lightness)を変更するための UIColor Extension。 extension UIColor { func dark(brightnessRatio: CGFloat = 0.8) -> UIColor { var hue: CGFloat = 0 var saturation: CGFloat = 0 var brightness: CG…

複数の CLLocationManager を使う

Swift 4.2.1 Deployment Target: 9.0 CoreLocation で位置情報を取得する際に、複数のCLLocationManagerインスタンスを同時に立ち上げて動かしたときにどうなるか気になったので試してみた。 結論としては、それぞれのインスタンスが影響し合うことなく別々…

UITextField, UITextView がキーボードで隠れないようにする - Swift 版

環境: Swift 4.2.1 Deployment Target: 11.0 以前にも同じ内容の記事を書いたが久しぶりに Swift でも同じような実装をしたのでメモ。 前提として - UIViewController.view に UIScrollView を貼り付け - UIScrollView 上に UITextField, UITextView を貼り…

ある UIColor から別の UIColor に徐々に色を変化させる

環境: Swift 4.2.1 ある UIColor から別の UIColor に徐々に色を変化させるヘルパーメソッド。 extension UIColor { static func colorLerp(from: UIColor, to: UIColor, progress: CGFloat) -> UIColor { let t = max(0, min(1, progress)) var redA: CGFlo…

Swift カスタムビュー実装方法の記事まとめ

以前書いたカスタムビューの実装方法の記事一覧メモ xyk.hatenablog.com xyk.hatenablog.com xyk.hatenablog.com xyk.hatenablog.com

Swift で NSAttributedString 内の部分文字列を別の文字列に置換する方法

環境: Swift3 StroyBoard 上で UILabel の文字列を Plain ではなく Attributed で設定し、その文字列内の PlaceHolder を後から別の文字列に置き換えたいケースがあり必要になった。 NSMutableAttributedString#replaceCharacters(in:with:)メソッドを使用す…

UITextView を使ってテキストの一部をハイパーリンク化する

環境: Swift3 iOS10 UILabel ではなく UITextView の attributedText に NSLinkAttributeName をセットすることで簡単にできた。 クリック時にデフォルトでは Safari が起動して設定したURLのページが表示された。 クリック時の挙動を変更したい場合は UITex…

View の Auto Layout によるアニメーションを無効にする

環境: Swift3 あるViewのSubviewのレイアウトをAuto Layoutで行った時にアニメーションしながら配置された。 この時のアニメーションは不要なので無効にする。 やり方はSubviewの配置が行われるlayoutSubviewsメソッドをオーバーライドして以下のようにアニ…

角丸なUIViewに角丸な影をつける

環境: Swift3 角丸なUIViewに角丸なドロップシャドウをつけるやり方。 shadowView.layer.cornerRadius = 10 shadowView.layer.masksToBounds = false shadowView.layer.shadowColor = UIColor.black.cgColor shadowView.layer.shadowOffset = CGSize(width: …

CGPath の変化をアニメーションさせるサンプル

環境: Xcode8.2.1, Swift3 CGPath の変化をアニメーションさせる方法を試した。 気をつける点としては変更前と変更後のパスの数を同じにしておくこと。 import UIKit import PlaygroundSupport class SquareButton: UIControl { let pathLayer = CAShapeLaye…

UIScrollView で現在のページ数を取得する

環境: Xcode8.2.1, Swift3 UIScrollViewのisPagingEnabledプロパティを true にすると、ページ単位のスクロールが可能になる。 このときに現在のページ数を求める方法についてメモ。 ページングは横スクロールの場合なら UIScrollView のcontentOffset.xがUI…

UIScrollView の keyboardDismissMode を設定してドラッグ時に自動でキーボードを閉じる

環境: Xcode8.2.1, Swift3 UIScrollView 上に UITextField / UITextView を乗せている場合はkeyboardDismissModeプロパティを設定することで自動でキーボードを閉じることができる。 Storyboardの場合 コードの場合 // デフォルト設定。UIScrollView をドラ…

UIScrollViewDelegate について

環境: Xcode8.2.1, Swift3 UIScrollView のドラッグによるスクロール時に呼ばれる UIScrollViewDelegate の順番 // MARK: - UIScrollViewDelegate // any offset changes // スクロール中は常に呼ばれる func scrollViewDidScroll(_ scrollView: UIScrollVie…

UIScrollView の Bounce 設定について

環境: Xcode8.2.1, Swift3 UIScrollView の Bounce 設定のパラメータが3つあるが、これらの違いについて調べた。 Storyboard 以下がデフォルトの設定 コード // UIScrollView // default YES. if YES, bounces past edge of content and back again open va…

Storyboard 上で UIScrollView を AutoLayout を使って設定する

環境: Xcode8.2.1, Swift3 Storyboard 上で UIScrollView を AutoLayout を使って設定する方法について。 ちょっとハマったのでメモ。 ビューの階層構造は UIViewController.view -> UIScrollView -> UIView とする。 UIScrollView の制約 UIScrollView の制…

UICollectionViewで縦横両方向にスクロールさせる

環境: Swift3 コレクションビューで縦横どちらにもスクロールさせることはできるか調べてみた。 デフォルトのレイアウトクラスであるUICollectionViewLayoutでは縦横どちらかの方向にしかスクロールできないようだ。 コレクションビューではUICollectionView…

Font Awesome を Xcode で使用する

環境: swift3 fontawesome.io FontAwesome をXcodeにカスタムフォントとして取り込んで使用する方法。 以下からFontAwesome.otfをダウンロードする https://github.com/FortAwesome/Font-Awesome/blob/master/fonts/FontAwesome.otf Xcode のプロジェクト内…

SwiftでON・OFFの切り替えをする円形ボタンを作る

環境: Swift3 こんな感じの円形ボタンのカスタムビューを作る。 ボタンというよりUISwitch的なON・OFFの状態切り替えをさせたい。 UIControlを継承して、状態はisSelectedプロパティで保持している。 import UIKit import PlaygroundSupport final class Cir…

Storyboardを使ってUITableViewを組み立てる場合のテンプレート(Swift3)

環境: Swift3 よく使うのでコピペ用にメモしておく。 ViewController import UIKit class ViewController: UIViewController { var items: [String] = ["foo", "bar", "hoge"] @IBOutlet weak var tableView: UITableView? override func viewDidLoad() { su…

UIViewに角丸な枠線(破線/点線)を設定する

環境: Swift3 UIViewの角を丸くした枠線を書くには以下のように書けばよい。 let roundView = UIView() roundView.backgroundColor = .lightGray roundView.layer.borderColor = UIColor.blue.cgColor roundView.layer.borderWidth = 3 roundView.layer.corn…

UIWebViewのリクエストにUserAgentを設定する

環境: Swift3 UIWebViewのリクエストにUserAgentを設定するには、リクエスト前にUserDefaultsのregisterメソッドでキー名UserAgentで値をセットする必要がある。 UserDefaults.standard.register(defaults: ["UserAgent" : "hoge"]) この時、 // これだと設…

UserDefaultsのregisterDefaultsメソッドについて

環境: Swift3 UserDefaultsのregisterDefaultsメソッドについて勘違いしていたのでメモ。 // Swift3 で registerDefaults() から register(defaults: ) に変更になった open func register(defaults registrationDictionary: [String : Any]) このregisterメ…

UserDefaults に保存されているデータをすべて表示する

環境:Swift3 UserDefaults に保存されているデータをすべて表示する for (key, value) in UserDefaults.standard.dictionaryRepresentation().sorted(by: { $0.0 < $1.0 }) { print("- \(key) => \(value)") } または if let appDomain = Bundle.main.bundle…

プッシュ通知受信時に呼ばれるメソッドについて

環境: Swift2.3 前提となるCapabilitiesの設定 - Push Notifications -> ON - Background Modes -> OFF プッシュ通知受信時に呼ばれるメソッド プッシュ通知受信時に呼び出されるメソッドに 1. application:didReceiveRemoteNotification:と 2. application:…

いつも設定するAppearanceのメモ

環境: Swift2.2 iOS8以降対象 いつも設定している Appearance のコピペ用メモ。 以下を AppDelegate で呼ぶ。 mainColor は extension で独自に設定したもの。 private func setupAppearance() { // アプリケーション全体のtintColor設定 self.window?.tintC…