アラのアラアラしい日記

こっそりかいてます

UITextFieldの入力に自動的にスペースを入れる

忘備録です。

UITextFieldに入力する内容が電話番号や会員番号などの場合、適当なところでスペースを入れたい時があります。
f:id:wknar0311:20190110174846p:plain
こんな感じ。

※ Swift3を利用しています。
UITextFieldの更新中の内容を受け取る為にはNotificationCenterを利用します。

NotificationCenter.default.addObserver(self, selector: #selector(self.textFieldDidChange(_:)), name: .UITextFieldTextDidChange, object: self.myTextField)

更新内容を受け取るメソッドです。

func textFieldDidChange(_ sender: NSNotification) {
}

今回は16桁、4文字ずつ入力するフォームを作成します。

func textFieldDidChange(_ sender: NSNotification) {
    guard let textField = sender.object as? UITextField, let text = textField.text {
        return
    }

    // すでに16文字入力されている場合は入力された文字を削除
    let truncatedText = self.myTextField.text!.replacingOccurrences(of: " ", with: "")
    if truncatedText.count > 16 {
        self.myTextField.deleteBackward()
        return
    }
    let length = text.count
    if (length > self.currentLength) { // currentLengthはインスタンス変数
        // 入力された時
        if (length == 4 || length == 9 || length == 14) {
            self.myTextField.text = text + " "
        }
    } else {
        // 削除された時
        if (length == 5 || length == 10 || length == 15) {
            self.myTextField.deleteBackward()
        }
    }
    self.currentLength = length
}

入力文字が削除され、カーソルがスペース部分に当たっている場合はスペースを削除する処理を書きます。
また、textFieldDidChangeは常にTextFieldを監視している為、currentLengthで文字列の長さを比較できる変数を用意しておく必要があります。

もっと良い方法を知っている方がいたら教えてくれたら嬉しいです。

Swiftの個人的に好きな変数の書き方

変数を定義する時に色々な設定を付加することが多いですが、その時に個人的に好きな書き方の忘備録です。(いつも忘れるので)

UILabelの例です。

let nameLabel = UILabel()
nameLabel.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
nameLabel.text = "wknar"
nameLabel.textColor = .blue
nameLabel.font = .systemFont(ofSize: 20)
nameLabel.textAlignment = .center

このような書き方が以下に書き換えられます。

let nameLabel: UILabel = {
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    label.text = "wknar"
    label.textColor = .blue
    label.font = .systemFont(ofSize: 20)
    label.textAlignment = .center
    return label
}()

カッコの中にまとめることが出来ます。

個人的にはプロパティが多い場合や、同じような変数を続けてinitする場合に見やすくて良いなと思っています。ビューのクラスは設定内容が多いので使う機会が多いです。

この書き方の呼び方もクロージャでいいのかな?

UIBlurEffectが動かない時の対処法

忘備録です。

SwiftでBlur効果を加えたい場合、よく使われるのがUIVisualEffectViewでエフェクトをUIBlurEffectに指定する方法です。

let blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: UIBlurEffectStyle.regular))

UIBlurEffect - UIKit | Apple Developer Documentation

しかしこの方法で実装する場合、Blur効果が表れない場合があります。

Settings > General > Accessibility > Reduce Transparency

この設定をONにした場合、UIBlurEffectは無効になります。

端末の消費電力を抑える為の設定だと思われますが、全体的な端末の見た目や動作もこの設定でかなり変わります。

色々調べていたら設定に関係なくBlurを入れられるライブラリを見つけました。

github.com

このライブラリでユーザがReduce TransparencyをONにしている場合でもBlurの挿入が可能です。

基本的にユーザが許可していない機能は入れるべきではないと思いますが、修正中のアプリでは背景をトラッキングする必要がない為利用しました。Eventbrideのような大きなサービスでもこの方法を利用しているようです。(小声)

端末の設定周りでハマることが多かった月でした。おしまい!

Swiftでdate format後のyear部分が想定と違う数字になってしまう

こんにちは! 先日swift3でで日付をフォーマットした際にyyyyの部分が想定と違う数字になったのでそのメモです。

Date()で取得できるデータは現在の日付ですが、

2018-12-15 05:09:30 +0000

これをDateFormatteryyyy-MM-ddの形式にフォーマットした場合、

2018-12-15

こうなる想定だったはずが、実際にフォーマットされた数字が、

0030-12-15

でした。

この0030は、平成30年の意味で、DateFormatterのカレンダーを設定していない場合、デバイスに設定されているカレンダーの種類を使用してフォーマットされています。 私の使用していたデバイスの設定が日本カレンダーになっていた為、フォーマット後の年が0030になっていまっていました。

これはUserDefaultsなどでデバイスに保存された日付とサーバーから取得した日付を比較する場合に2018年と30年を比較することになり、データに誤作動が出ていまします。

バイス設定でSettings > General > Language&Region > Calendarからカレンダーの種類を変更することが可能ですが、フォーマットする際にコード上でカレンダーを設定しておくことが最適な方法だと思います。

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
formatter.calendar = Calendar(identifier: Calendar.Identifier.gregorian)
formatter.string(from: Date())

これでデバイス設定関係なく2018を取得することが出来ます。

バイスの設定から変更できるのはGregorian, Japanese, Buddhistの3種類ですが、コードではもっと多くの種類に変更が可能です。

Calendar.Identifier - Calendar | Apple Developer Documentation

ちなみにBuddhistを選択した場合は以下のようになります。

2561-12-15

見慣れない笑

Swiftでコマンドラインツールを書きました

こんばんわ
ビーサン出社する勇気が出ない人です。
つまらない大人になってしまいました。

コマンドラインツールを仕事中に作ったので報告です。
この記事が上司にばれませんように。

github.com

どうでもいいですが私はエディタにはお金出したことないgithub課金勢です。
説明は全てREADMEに記載しているので使い方の細かい説明は省略しますが、
第一引数にワード、第二引数に絵文字や記号を入れると、第二引数に飾られた第一引数が出力されます。
言葉の意味をもっと簡単に表現したい(大袈裟にしたい)と思い作りました。
“エモい"という言葉から名前を付けています。

「それいいね!」ではなく「☆☆☆☆☆☆☆ それいいね ☆☆☆☆☆☆☆」の方がすごく共感してそうだしちょっと面白いかなと思っています。
メルマガ等にたまにあるような装飾にも使えるかなと作りながら思っていたのでメルマガ書く人はぜひ使ってください。

iOSアプリを出しました

こんばんわ。
お盆休みを全てファミレスで過ごした人です。

数ヶ月前ですがアプリをリリースしたので報告です。
他にやりたいことが多すぎてすっかり紹介記事を書くのを忘れていました。

SDT

SDT

  • Wakana Ara
  • ライフスタイル
  • 無料

翌日のゴミが何かを教えるリマインドアプリです。
ユーザは曜日ごとに好きなゴミの種類を登録することが出来、毎日20時に通知が届きます。
この通知はローカル通知ですので電波のないところでも受け取ることができます。

数時間で書きましたが数時間でリジェクトされました笑
理由はリマインドのみの機能だとアプリのリリース規定を破ることになるので、機能を増やすようにとのことでした。
そこから1時間で都内数区のゴミ出し表を表示する機能を追加したらレビューが通ったので良かったです。

私自身これを作りたくて始めたわけではなく、なんでもいいから何か自分の作品を持っておきたかったというのが大きな理由で、first commitのようなアプリではありますが、なんとなくダウンロードしてくれたらグラフをみてぬか喜びしてると思います。
現在はこれの他に自分の作りたいものを作っているのでそちらが完成してレビューが通ればまたブログに書きたいと思います。

しかしゴミアプリの方も少しずつ更新していきたいとは思っているので、もっとこうして欲しい等のご意見があればぜひお願いします。
(自分でもある程度の改善点は認識してますが笑)

git grepをもっと見やすくする

こんにちは。注射の針が刺さってるのが見れない人です。
grepはむちゃくちゃよく使うコマンドのひとつだと思いますが、今日はそれをもっと見やすく色つけようっていうエントリです。

grepのコマンド自体には元々GREP_OPTIONS='--color=auto'などのオプションが用意されているのは知っていましたが、私はgit grepを多用するので今日はその色分け設定をメモしておきます。
(git grepの方がgitがインデックスを持っているので地味に処理が早いみたいです)

git grepの色の設定はgit configで行うことが出来ます。.gitconfigの中に入れてしまってもいいですね。

Git - git-config Documentation
こちらがgit configのドキュメントですが、想像以上にオプションがありました。なんかもったいない笑

色の設定はこちらにあります。
https://git-scm.com/docs/git-config#git-config-colorgrepltslotgt

<slot>部分にどのパートの色なのかを指定し、値に実際の色を代入する感じです。

.gitconfigでは以下のように書きます。

[color "grep"]
match = cyan
linenumber = bold white
filename = yellow

結果はこのようになります。
f:id:wknar0311:20170310170053p:plain
とても見やすくなりました。
git grepを使う方はぜひ試してみてください。