2017-01-01から1年間の記事一覧
objc_getAssociatedObjectを使ってUIViewに新しいプロパティーを生やしてみました。 UIViewにプロパティーを追加する UIViewにvalueというプロパティーを生やします。 実装は簡単で、下のようなextensionを追加すれば完了です。 private var valueKey = 0 ex…
UICollectionViewでの並び替えを試してみました。 Storyboardを使わないでUICollectionViewを表示 まずは普通にUICollectionViewを表示してみます。 コードは下の通りです。 class CollectionViewController: UICollectionViewController { override func vi…
Xcode8から登場したDebug Memory Graphという機能を試してみました。 これはインスタンス間の参照を図として表示できるもので、循環参照の発見などに役立ちます。 Debug Memory Graphは、アプリ起動後にデバッグエリア右端のアイコンをタップする事で実行で…
バックグラウンド再生を試してみました。 mp3をフォアグラウンドで再生 まずはフォアグラウンドでmp3を再生してみます。 再生したいmp3ファイルをAssets.xcassetsに追加して下さい。 そのあと下のようにmp3再生処理を記述すれば完了です。 import UIKit impo…
毎回2xと3xのデータを作るのが大変だったので、1つの画像データ(PDF形式)で全部に対応する方法を調査しました。 今回は下のような画像で検証しました。 利用したツールはSketchです。 まずはこのデータをpdfとして書き出します。 次にAssets.xcassetsでImage…
paper-onboardingというライブラリを使っておしゃれなウォークスルーを実現してみました。 github.com paper-onboardingのインストール target 'MyApp' do use_frameworks! pod 'paper-onboarding' end 2017/10/16現在はSwift4に対応していないので、Swift3.…
GoogleAnalyticsのデータの取り方を調べてみました。 取得準備 まずはGoogleCloudPlatformにアクセスしてプロジェクトを作成します。 Google Cloud Platform 続けて「IAM と管理」の「サービス アカウント」からサービスアカウントを作成します。 この時、js…
iOSのサイレントプッシュというものを試してみました。 サイレントプッシュとは その名の通り、ユーザーに通知メッセージが出ないプッシュ通知の事です。 送信時にバックグラウンドで処理を走らせる事ができるので、バックグラウンドでのデータの更新などに…
循環参照対策で使う[weak self]ですが、常に付ける必要があるのか、それとも付けなくて良い時があるのかを調べてみました。 UIAlertControllerを使った検証 最初に、下のようなUIAlertControllerで[weak self]が必要なのかを調べてみました。 let alert = UI…
Firebaseを使ったpush通知を試してみました。 APNs証明書の準備 まずはプッシュ通知用の証明書を作成します。 キーチェーンを開き、「認証局に証明書を要求」を選択します。 次の画面で、メールアドレスと名前を入力して証明書要求を作成します。 Certificat…
isとisMemberOfClassとisKindOfClassですが、挙動の差がわかりにくかったのでまとめてみました。 isKindOfClass 下のようなケースでは当然trueになります。 それとisKindOfClass/isMemberOfClassはNSObjectProtocolのメソッドなので、NSObjectなどを継承して…
下で定義された2つのプロトコルに準拠する型の書き方です。 protocol MyProtocol1 {} protocol MyProtocol2 {} 複数のプロトコルへの準拠を表したい時は、下のように&を使います。 protocol MyProtocol1 {} protocol MyProtocol2 {} class MyClass: MyProtoc…
Amper Musicというサービスを試してみました。 これは音楽を生成してくれるサービスで、30秒ほどの曲を簡単に作る事ができます。 www.ampermusic.com ライセンスは、非商用なら無制限に利用可能。 商用利用したい時は問い合わせが必要です。 Legal | Amper M…
iOSから登場したUniversal Linksを試してみました。 Universal Linksとは Universal Linksとは特定のURLにアクセスした時にアプリを遷移させる事ができる技術です。 例えば「https://example.com/にアクセスした時にアプリAに遷移する」と言った挙動が可能で…
iOS11で登場したARKitを使って、画面上に立方体を配置してみました。 下のように地面に複数のオブジェクトが並ぶようにしています。 まずはプロジェクト作成から「Augmented Reality App」を選んでARKitのテンプレートを作成します。 次はサンプルコードを消…
AlamofireとCodableを使った実装を試してみました。 Alamofireは事前にCocoaPodsでインストールしておきます。 Alamofire+Codableの事前準備 target 'MyApp' do use_frameworks! pod 'Alamofire' end もし非SSL(http)通信をする場合はApp Transport Security…
SafariServicesのSSReadingListという機能を使ってiPhoneのリーディングリストに項目を追加してみました。 リーディングリストとは Safariについている機能で、サイトを保存してあとで見る事ができます。 ブックマークと近いのですが「オフラインでも見れる…
BitBarというアプリを使ってMacのメニューバーに文字を表示してみました。 まずは公式サイトからBitBarをインストールします。 getbitbar.com 起動するとプラグインのフォルダーを求められるので、好きな場所を指定します。 次にプラグインフォルダの中にス…
SimpleTabというUITabBarControllerがオシャレになったようなライブラリを試してみました。 github.com CocoaPodsでインストールします。 target 'MyApp' do use_frameworks! pod 'SimpleTab' end 2017/10/3時点ではSwift4に対応していないので、Swift3で動…
先日読んだ本で、ユーザーの継続率を上げる為にはAHA体験が重要という事を学んだので、自分のアプリのAHA体験は何かを考えてみました。 いちばんやさしいグロースハックの教本 人気講師が教える急成長マーケティング戦略 「いちばんやさしい教本」シリーズ作…
TabPageViewControllerというタブメニューを実現するライブラリを使ってみました。 このライブラリは有名なiQONで使われているということで、かなり期待できそうです。 github.com UIPageViewControllerをつかって無限スクロールできるタブUIを実装してOSSと…
SwiftのdidSetの呼ばれるタイミングを調べてみました。 didSetとは プロパティーの値セットを検知する仕組みです。 下のように書くことで、プロパティーに値がセットされたタイミングを検知する事ができます。 class MainClass { var value: Int? { didSet {…
MacでGNU Goという囲碁ソフトを動かしてみました。 brewに対応しているので、インストールはコマンド1行でできます。 brew install gnu-go 実行はgnugoコマンドを打つだけです。 そのあとはQ16のような形で位置を指定すれば遊ぶ事ができます。 白番を取りた…
iOS9から登場したUIStackViewを試してみました。 UIStackViewでUIViewを均等配置 まずはUIStackViewを配置します。 縦方向と横方向があるのですが、今回は横方向に配置しました。 UIStackViewは下のように画面に配置しました。 続けてUIViewを2つ配置します…
GPUImageというライブラリを使って、カメラ映像にリアルタイムでフィルターをかける事を試してみました。 github.com まずはCocoaPodsでGPUImageをインストールします。 target 'MyApp' do use_frameworks! pod 'GPUImage' end 次はInfo.plistのNSCameraUsag…
AVAudioEngineというクラスを使って、mp3をエフェクト付きで再生してみました。 まずはプロジェクトにmp3ファイルを追加します。 追加したファイルがBuild Phasesにも入っているか確認します。 入っていない場合は+ボタンからmp3を追加します。 まずは普通に…
Phones.frameworkを使って、端末の写真の取得・保存・削除を試してみました。 写真を操作する前にInfo.plistにNSPhotoLibraryUsageDescriptionに写真を操作する理由を記述します。 これがないとアプリがクラッシュします。 取得 端末写真をUIImageとして取得…
スクリーンショットを撮ったタイミングを検知するには.UIApplicationUserDidTakeScreenshotを使います。 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selec…
最近はGoogleAnalyticsプロパティー作成時にモバイルアプリを選ぶとFirebase一択になりました。 今日はモバイルアプリでもFirebaseなしのGoogleAnalyticsを使う方法を書いてみます。 まずはウェブサイトとしてプロパティーを作成します。 続けてそのプロパテ…
push遷移アニメーションが下のように斜めになってしまったので対策を調べてみました。 stackoverflowによると、遷移先のviewDidLoadでtableViewのcontentInsetAdjustmentBehaviorを.neverにすれば良いとのことでした。 popViewControllerの時のアニメーショ…