- 1. 【WKWebView】UserAgentの取得方法
- 2. ハイライト処理に touchesBegan(_:with:) を使うのはやめよう!
- 3. 世界一簡単に実装できるタグ風CollectionViewのカスタムレイアウト
- 4. 【Swift】CombineでshareReplayの実装を考えながら内部の仕組みを学ぶ
- 5. iOSアプリ開発を目指して〜1ヶ月の学習記録〜
- 6. Flutter Meetup Tokyo #12 参加報告 #flutter_meetup_tokyo
- 7. FirebaseにXcodeアプリを登録する
- 8. 関数定義で使用される”_”について
- 9. 【Swift】CocoaPodsでRealmをインストールする方法 & でもimportできない場合の対処法。
- 10. 【Swift】UITabBarControllerでアプリ起動時に指定したタブを表示する
- 11. [iOS][Swift]SnapKitをRxSwiftと連携する
- 12. PythonistaでiOSの写真に画像を追加する
- 13. 【意外と知らない】iOSアプリでのビルドコード
- 14. Combineフレームワーク リンク集
- 15. macOS Catalinaで fastlaneが動作しなくなった件 & 解決方法
- 16. Buttonのタイトル変更について
- 17. Swiftで予約語を変数名やCase名として使う
- 18. Firebase AuthenticationでTwitterのOAuthを利用し、Twitter APIにリクエストする
- 19. iOS10のサポートを切るときにやったこと
- 20. RxSwift + SPM + XCode11.2 + iOS 環境でビルドすると実行時にクラッシュする
【WKWebView】UserAgentの取得方法
“`swift:
var webView: WKWebView? = WKWebView()
webView.evaluateJavaScript(“navigator.userAgent”) { (userAgent, error) in
// nilを代入しておかないと、errorが代入されuserAgentがnilになってしまう
webView = nil
print(userAgent)
}
“`
ハイライト処理に touchesBegan(_:with:) を使うのはやめよう!
## 何事か
あるViewがタップされたときにそれをハイライトさせたいけど、ハイライトの演出をカスタムしたいとき。
私の観測上では [touchesbegan](https://developer.apple.com/documentation/uikit/uiresponder/1621142-touchesbegan) 系メソッドを利用してハイライト演出をするというコードが書かれやすいように感じます。ググり方によってはこれを使う方法がトップヒットするのでしょうか。私はこの手法は良くないと思っているため、その問題点と改善案を紹介します。
## よくない例
例えば以下のようなコードです。
ハイライト時に表示される用のViewを用意し、 `touchesBegan` 系メソッドをオーバーライドしてそのViewの `isHidden` を書き換えるパターン。“`swift
class BadHighlightView: UIView {
var highlightView: UIView!
init() { … } // highlightView を生
世界一簡単に実装できるタグ風CollectionViewのカスタムレイアウト
現在開発中の[Parnovi](https://parnovi-work.studio.design/)でのCollectionViewのカスタムレイアウトについての記事です?
# レイアウトの種類
collectionViewのレイアウトは大きく分けて二つのセグメントに分かれます。
1. UICollectionViewFlowLayout
2. UICollectionViewLayout後者の`UICollectionViewLayout`はカスタムでレイアウトを作るため比較的敷居が高いですが、だいたいのレイアウトは比較的簡単な前者の`UICollectionViewFlowLayout`で実装することができます。
# 完成イメージ
下記の`お悩みで探す`セクションが完成系のイメージです。
![Simulator Screen Shot – iPhone 11 – 2019-11-08 at 17.01.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/ef80bbf3
【Swift】CombineでshareReplayの実装を考えながら内部の仕組みを学ぶ
以前Publisherからの出力結果を共有するPublisherを見ていた時に
CombineにはRxのshareReplayのような動きをするPublisherがないということがわかりました。https://qiita.com/shiz/items/f089c93bdebfaef2196f
そこで
今回はいくつかの例や投稿などを参考にしながら
shareReplayの実装の検証と
実装をするために必要なCombineの内部の仕組みについて
見てみたいと思います。# Combineの内部の仕組み
下記の図のような流れになります。
![Subscription.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219965/7b0cda0c-b0c9-7310-38d6-9cb49503e829.png)
ポイントとしてはPublisherからSubscriberへ
直接値を渡している*わけではなく*
PublisherがSubscriptionを生成し
それを経由してSubscriberへ値
iOSアプリ開発を目指して〜1ヶ月の学習記録〜
##初めに
おはようございます || こんにちは || こんばんわ || 初めまして。
普段は小学生〜大人(主に高校生が多い)の前で授業や講義をしますので、話す事は慣れていますが
ネット上で学習記録や経験談を掲載する事は初めてなので、少し緊張しながら書いています。
もし誰かの役に立てれば&自身の記録になればと思い書く事にしました。
よってiOSについても、ライティングについても初心者ですがよろしくお願いします!
##内容
記念すべき初めての内容ですが、完全に表題通りです。
自分がなぜiOSアプリの開発をしようと思ったのか、この1ヶ月どんな学習をしてきたのか、また学習効果や結果はどうだったのか
はもちろん、今後の学習ロードマップのようなものも掲載したいと思いますので興味がある方は最後まで何卒よろしくお願いします。###・なぜiOSアプリを開発しようと思ったのか。
そもそもなぜiOSアプリを開発しようと思ったかですが、本題の前置きみたいな内容ですので、そんな情報や前置きどうでもいいわ‼︎って方はすっ飛ばして下さい。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Flutter Meetup Tokyo #12 参加報告 #flutter_meetup_tokyo
Flutter Meetup Tokyo #12 ブログ枠に参加させていただいたため、
簡単に概要だけまとめました!
LT15分枠のもののみ一旦感想を入れています。詳しい内容は資料のリンクをはっているので、そちらをご参照ください!
## Flutter Meetup Tokyo #12
https://flutter-jp.connpass.com/event/147892/## 開催概要
・共催: Flutter Japan User Group, 株式会社ガイアックス
・日時: 2019年11月7日(木)
・会場: 株式会社ガイアックス 6F Attic## togetterまとめ
https://togetter.com/li/1427577# 発表内容
## ①Add Flutter to existing apps
### ・ 発表者:
[@neonankiti](https://twitter.com/neonankiti)
### ・ 資料:
https://scrapbox.io/neonankiti-portfolio/Add_Flutter
FirebaseにXcodeアプリを登録する
**ここで、紹介する方法は2019/11/8の方法なので仕様が変わっている場合があります。**
#Firebaseの準備をする
まずは、[ここ](https://firebase.google.com/)からFirebaseにアクセスしてGoogleアカウントでログインする。
ログインが完了すると以下のような画面が出てくるので「プロジェクトの追加」を選択する。
すると、以下のような画面が出てくるのでプロジェクト名を決めて「プロジェクト名を入力します」という部分に入力する。(ここで入力する、プロジェクト名はXcode上と異なっていても良い)
関数定義で使用される”_”について## “_”は何のため?
swiftのプログラムを見ていると、たまに関数の引数名の左に”_”(アンダースコア)が書いてあるときがあります。“`swift:howToUseUnderscore
func howToUseUnderscore(_ number1: Int, _ number2: Int) {
print(number1 + number2)
}
“`引数名number1とnumber2の左に書かれている”_”は何を意味するのでしょうか、、、
## “_”で引数名を省略できる!
関数定義のとき、”_”を引数名の左に書くことで、関数を呼び出す際に引数名の記載を省略することができます。
– “_”を書かないとき
“`swift:howToUseUnderscore
func howToUseUnderscore(number1: Int, number2: Int) {
print(number1 + number2)
}howToUseUnderscore(number1: 1, number2: 2) // -> 3
“
【Swift】CocoaPodsでRealmをインストールする方法 & でもimportできない場合の対処法。
# はじめに
iOSの勉強をしている中で、データの管理をRealmにしてみようかなと思い、自分のプロジェクトにインストールしました。その際に困った部分があったので投稿させていただきました。同じ境遇の人の助けになりますようにと。podでRealmSwiftをインストール
→プロジェクト内の.swiftファイルでimport RealmSwiftを追記
→エラーメッセージ「**No such module ‘RealmSwift’**」結果…ビルドしたらエラー消えた、、!
podのとかRealmのインストール方法を知りたい方は、一緒に下に進んでいきましょう!↓↓↓# やりたいこと
1. CocoaPodsを使う
2. RealmSwiftをインストールする
3. プロジェクトの中でRealmSwiftをimportする## 実行環境
・MacOSX Catalina バージョン10.15.1
・Xcode バージョン11.2## CocoaPodsを使うための準備(環境構築)
コマンドラインツールで以下のように打ちます。
“`sudo gem install coco
【Swift】UITabBarControllerでアプリ起動時に指定したタブを表示する
UITabBarControllerで最初にデフォルト表示されるタブを指定する方法です。
調べてもObjective-Cでの記述ばかりだったので残しておきます。## 結論
`TabBarController.swift`を作り`selectIndex`で表示したいタブの番号を指定する“`swift:TabBarController.swift
class TabBarController: UITabBarController {override func viewDidLoad() {
super.viewDidLoad()
selectedIndex = 1
}
}
“`これで理解できる方、この記事はここまでです。
以下、順に`TabbarController.swift`を作った場合と作らなかった場合の挙動と、実装の手順を示していきます。
## 確認環境
Xcode 11.1
iOS 13.1(Simulator)
Storyboard使用## プロジェクト生成
画像のような状態のデモプロジェクトを用いて
[iOS][Swift]SnapKitをRxSwiftと連携する
# はじめに
iOSでコードベースでレイアウトを組む際に便利なSnapKitと、振る舞いを宣言的に記述できるRxSwiftを連携する方法について説明します。# 前提
以下のライブラリについて基本的な知識を有している方向けの記事です– RxSwift https://github.com/ReactiveX/RxSwift
– RxCocoa https://github.com/ReactiveX/RxSwift/tree/master/RxCocoa
– SnapKit https://github.com/SnapKit/SnapKit# サンプルアプリ
https://github.com/idomazine/RxSnapKit
`git clone`後、 `pod install` を実行しXCodeでビルドします。# RxでConstraintの値を操作
以下のように記述することでSnapKit.ConstraintのプロパティをRxのBinderに適応させることができます。
“`swift
import RxSwift
import RxCocoa
i
PythonistaでiOSの写真に画像を追加する
# Pythonistaで処理した画像をiOSの写真に追加したい
## サンプルコード
“` sample.py
import photos
import os
import tempfile
from PIL import ImageimageName = ‘lena.png’
img = Image.open(imageName)
temp_path = os.path.join(tempfile.gettempdir(),imageName)
img.save(temp_path)
photos.create_image_asset(temp_path)“`
## 解説
画像を追加する関数は“photos.create_image_asset() “なのですが、どこかに画像が保存されていないといけないので、“temp_path “を取得し、一旦そこに保存しているよって感じです。
スクリプトがあるディレクトリと同じところに一旦保存するよりもなんとなくスマートですね。
【意外と知らない】iOSアプリでのビルドコード
![スクリーンショット 2019-11-07 11.31.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49481/777478e0-0837-580c-c106-f36cd67e3f91.png)
意外と知らない人多いと思うのですが
***iTunes Connect***に送信するアプリ(iOS等)のビルドコードですが
バージョンコードが変われば同じものを使用してもいいんです。Androidだとだめなはずなので勘違いしている人多いかもしれないですね。
Combineフレームワーク リンク集
# はじめに
Combineフレームワーク についてのリンクをまとめてみました。
特にサンプルコードを見てみるのは、Combineフレームワークの概要を掴むのにとても有効です。#【Apple公式】
## Apple Documentation**Combine**
https://developer.apple.com/documentation/combine**Receiving and Handling Events with Combine**
https://developer.apple.com/documentation/combine/receiving_and_handling_events_with_combine## WWDC2109
**Introducing Combine**
https://developer.apple.com/videos/play/wwdc2019/722
>Combine is a unified declarative framework for processing values over time. Lear
macOS Catalinaで fastlaneが動作しなくなった件 & 解決方法
macOS Catalinaにアップデート後、fastlaneを実行すると、このようなエラーになる。
“`
% fastlane
zsh: /usr/local/bin/fastlane: bad interpreter: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: no such file or directory
“`CatalinaからRubyのバージョンが変わったそうなのだが、その関連でエラーが出ているとおもわれます。
自分はこの辺の設定に詳しくなく、解決にかなり時間を費やしました:frowning2:。もし、同様の件でお困りの方がいれば参考になると思い、解決方法を書き残して置きます。
## エラー解消のために行ったこと
### gem update
gemを更新する。
“`
% sudo gem update –system
“`### install fastlane(失敗)
fastlaneを更新する。
“`
% sudo gem inst
Buttonのタイトル変更について
## Buttonのタイトルが変更できない、、、
Labelと同じだと思い“`swift:changeButtonTitle
ボタン名.currentTitle = “変更したいタイトル名”
“`とすると、エラーが表示されてしまいました。
## 変更方法
以下のコードで変更できました↓
“`swift:changeButtonTitle
ボタン名.setTitle(“変更したいタイトル名”, for: .normal)
“`##### 参考サイト
– https://stackoverflow.com/questions/26326296/changing-text-of-uibutton-programmatically-swift
Swiftで予約語を変数名やCase名として使う
Swiftで変数名やenumのcase名を命名しようとして使った単語が、予約語であったため使えなかったという事態に遭遇したことがある人は多いと思う。
“`UserStatus.swift
enum UserStatus {// Error: private’ modifier cannot be applied to this declaration
case private
case open
}
“`“`Vars.swift
// selfという命名のString型の変数は作れない
let self = “Ham Spam”
“`今回はその回避方法と、回避方法を使う際の注意点を解説する。
## 予約語を使う
Swiftの予約語として使われている単語は“でその変数名やenumのcaseを囲むことで使うことができる。
“`Enum.swift
enum Status {
case `public`
case `private`
}let status1 = Status.private
let s
Firebase AuthenticationでTwitterのOAuthを利用し、Twitter APIにリクエストする
[2018年5月にTwitterKitのサポートが終了](https://blog.twitter.com/developer/ja_jp/topics/community/2018/TKSDK_tr.html)し、Firebase Authenticationでも[OAuthを利用したTwitterログイン](https://firebase.google.com/docs/auth/ios/twitter-login?hl=ja)が推奨されるようになりました。
設定まわりに関してはすでにいくつか記事があるので、主にiOS/Swiftでの実装部分について書きたいと思います。というわけでさっそく作っていきましょう???
## 環境
* iOS 11.0〜
* Swift 5
* FirebaseAuth
* [OAuthSwift](https://github.com/OAuthSwift)
* [KeychainAccess](https://github.com/kishikawakatsumi/KeychainAccess)## TwitterのDeveloperア
iOS10のサポートを切るときにやったこと
先日、自社アプリのサポートOSを10.0 -> 11.0に変更する対応をしました。
実装するうえで参考になる記事が少なく、手探りでやっていったので、そのときの手順・ハマった点などをメモしておきます:pencil:# iOS10を切ることにした経緯
もともとチーム内に「管理面や新しい機能を取り入れていくことなどを考えると、古いバージョンを切りたいね」という話がありました。
さくっと調べてみたところ、2019年8月末時点で色々なアプリがiOS10を切り始めていることがわかりました。【iOS10のサポート切ってるアプリ】
* Slack
* Yahoo系列アプリ(ヤフオク、Yahoo!カーナビ、Yahoo! MAPなど)
* Kyash
* bitFlyer
* Eight
* SHOWROOM
* Airレジ
* テラー意外と多いな??
— orimomo / e
RxSwift + SPM + XCode11.2 + iOS 環境でビルドすると実行時にクラッシュする
##多分期間限定で掲載する投稿になります
表題の通りの内容です。XCode11からSwift Package Managerが統合されたので、Carthageから乗り換えていたのですが、先日リリースされたXCode11.2 で地雷を踏みました。
私の環境 : Xcode 11.2 final, Catalina 10.15.1, iOS 13.2
https://bugs.swift.org/browse/SR-11564?focusedCommentId=51285&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-51285
SPMに関連する処理の部分で、linkerがmoduleを最適化するところにバグがあるみたいです。
ですので、RxSwift以外でもSPMをつかってると広く影響があるようですね。一応回避策として、DEAD_CODE_STRIPPING = NO とオプションをつければいける様なのですが、私はひとまず、Xcode 11.1 を入れ直して対応し