面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

UIBarButtonItemで画像の見たを変えずに使用するやり方

UIBarButtonItem

UIBarButtonItemは、UINavigationControllerとかと併せてよく使うButtonですが、そのまま使用すると下記のように透過じゃない部分は単色でTint Colorによって塗りつぶされます。

f:id:aryzae:20180211211616p:plain
この画像を使用すると…

f:id:aryzae:20180211211808p:plain
こうなる

これを画像を加工せずそのまま表示したいと思ったので、いいやり方ないか調べた際のメモです。

init(customView:)を使う

UIBarButtonIteminit(customView:)という初期化方法にUIButtonを設定することで簡単に実現できる。

流れとしては、

  1. Storyboardで、UIButtonを用意する
  2. IBOutletで紐づける
  3. そのButtonを使用してコードでUIBarButtonItemを作成する
  4. UIBarButtonItemをセットする

f:id:aryzae:20180211212238p:plain

そうすると、このようになる、

f:id:aryzae:20180211212353p:plain

このやり方のメリットとして、StoryboardのUIButtonからIBActionを設定できるのでaddTargetとかを使って#selectorで押下時の挙動を設定してあげる必要がない。

Storyboardを使わない場合

この場合、コードでUIButtonを生成して同じようにUIBarButtonIteminit(customView:)でセットしてあげればよい。

AutoLayoutでmarginを画面比率によって変更したい時の対処

経緯

ふと前にも調べた気がするが、覚えていないなら覚えるまで同じ記事であろうか書くしかない。

AutoLayoutで制約をつけていると、固定のものは問題ないが、画面サイズによって可変にしたい場合、Viewのwidthheightであれば、superviewとequal widthやequal heightしてから、割合で入力してやれば簡単にできるので困らない。

一方で、safeAreaのtopからのmarginとなると素直にやる方法がなくて困る。

UINavigationBarがないStoryboardなら使える方法

ものによっては、Vertically in Containerをつけて調整することで対応できるものもある。(具体的に言えば、UINavigationBarの影響がないStoryboard、LaunchScreen等)

ただ、これも万能ではなく、Storyboard上で上手く作れた様に見えて、実機で確認するとstatusBarやNavigationBarの高さが余分に含まれた見た目になることがある。

Storyboardを捨てるかどうか

marginを画面サイズから割合で出す方法は2つある。

1. Storyboardを使わない場合

UILayoutGuideというものがあるので、これを使いましょう。

詳しくはこちら

Goodbye Spacer Views Hello Layout Guides

2. Storyboardを使う場合

これは、もう色々諦めの境地で空のUIViewをSpacerとして配置しましょう。

ViewとView、safeAreaとViewの間に置き、TopやBottom等を0marginでくっつけ、SpacerのViewのwidthheightをsuperviewとの割合で調整します。調整が終わったら、hiddenにチェックをつけ、画面から見えないようにします。

これは意味もなくViewを置く無駄加減にモヤっとしますが、他に方法がないです。

UILayoutGuideがInterface Builderに対応してくれれば、可能ですが、Xcode9の時点では無理です。(Xcode7時代からずっと今まで無理)

NavigationItemのLeftBarButtonItemsにitemを入れるとBackボタンが表示されなくなるやつの対処

経緯

割と当たり前だったりすることでも、知らないことも多々あるので、今回そんな例として今更知った内容のメモとして記載

内容

UINavigationControllerから pushViewController(UIViewController, animated: Bool) で次のViewControllerに遷移するのは珍しくない。

しかし、遷移先のViewControllerのUINavigationItemのLeftBarButtonItemsにItemが入っていると、NavigationBarにBackButtonが表示されず、画面を戻ることができない事態に遭遇する。

その解消方法をメモ程度のつもりで記載

本来であれば、このようにBackButtonが表示される。

f:id:aryzae:20180123023821p:plain

f:id:aryzae:20180123023841p:plain


しかし、下記のような作りをしていると…

f:id:aryzae:20180123023828p:plain

VC2に遷移した時BackButtonが出ない。

f:id:aryzae:20180123023816p:plain

対処方法

対処は簡単。 StoryboardでUINavigationItemの Left Items Supplement にチェックをつける。

f:id:aryzae:20180123023834p:plain

または、コードで leftItemsSupplementBackButtontrue にする。

self.navigationItem.leftItemsSupplementBackButton = true

そうすることで、LeftBarButtonItemsとBackButtonが共存するようになる。

f:id:aryzae:20180123023812p:plain

2018年の目標

(遅くなりましたが)あけましておめでとうございます

年が明けて早半月程経ち、そろそろ今年の目標を決めておかないと思い、本年1 発目のブログを書いている。

2017年の目標の反省

まず去年(2017年)の反省もしていないので、先にそっちから。 目標は3つ立てていたみたいだけど、途中から忘れてました。

  1. はてなブログをもう少し細かく書く(目指せ週1ペース) [通年]

これは見事に出来てません。 原因は、怠惰な面が出た結果かなと。記事にしようとメモは毎日のように貯めているものの、それを記事にしようとした時に時間がかかるので、放置してしまっているがため。

2017年の記事数は36件なので、36/52で69.2%の達成具合で、プラスに捉えるなら2週に1回のペースでは書いている。もう一息ってところだろうか。

  1. 組織からの脱退 [目標: 6月中まで]

これは達成!
時期としては6月中とはいかなかったものの、2017年内には退職して憎っくき組織から脱出成功したので、良かったかなと思います。

  1. 引っ越し [目標: 物件状態によるが3月中若しくは6月中まで]

これも達成!
思い立ったが吉日で、1月末から探して、2月の頭には物件決めて、引っ越しも2月中に完了した。

2018年の目標

2017年の反省も踏まえつつ、2018年の目標を考える

1. はてなブログを週1ペースを目指して書く [目標: 通年]

去年は達成できていないし、書く習慣付けをしたいところでもあるので、同じ目標を設定

2. 組織からの脱退 [目標: 上半期まで]

これまた、同じ目標。

2017年まで属していた企業は、とにかく業務以外の部分が酷く関わりたくない、いてもろくなことにならないし、薄給すぎる。といった不満で辞めると考えていた。

今回は、そこまでネガティブな話ではない。

iOSエンジニアとして働いているが、スマホ界隈は流れが早く毎年新しい話題が出てくる(特にSwiftやiOSと毎年アップデートされることもあって)。

今所属している企業は、企業体質としては悪くないし、賃金も年相応にはもらっているため大きな不満はない。ただ、業務面ではどうしてもレガシーなままで職業として業界と会社のギャップがどんどん開いていることに耐え難いと感じている。

所属している期間が伸びれば伸びるほど、そのギャップも日増しで、ストレスとして感じしまうため、ギャップの少ない働き方を目指したいと思い、結論として会社を辞めようと考えた。

辞めた際は、フリーランスで希望に近いところで働いていこうと考えている。

3. 引っ越し [目標: 年内]

これまた同じ目標

2017年引っ越して、以下の点で満足していた。

  • 部屋が広くなった
  • ウォシュレットがついた
  • 独立洗面台がついた
  • 風呂とトイレが別になった

一方で引っ越して不満として以下のものが出た。

  • 隣の部屋で移動販売用の食べ物を仕込むため、Gが自分の部屋に流れ込んでくる(月1はあたりまえ、酷いと特大サイズが2匹同時に)
  • 隣の部屋が食べ物を仕込むため、朝4時から動き出し、ドタバタ音を立てて五月蝿い
  • 上の階の部屋が深夜1時くらいに帰宅して酷い足音で動き回り五月蝿い
  • たまにアパートの住人の車でマフラー改造したのか暴走族並みに五月蝿い車を止める
  • スーパーと薬局とコンビニが遠くなり買い物が不便になった
  • 引っ越したことでヤマトの再配達がギリギリ間に合う様になった後、再配達時間の見直しにより間に合わなくなった

隣人騒音やGの出現が理由で引っ越してきたはずが、結局改善されないどころか一部悪化している。

家賃自体は前より2万も高くなったのにメリットが薄く、Gと戦うのがきついので出来れば引っ越したいと考えている。

4. LTを行う [目標: 2ヶ月に1回程度]

ブログを書き、外にわずかながら情報発信しはじめたので、次のステップとして人前で話し、伝えることに慣れていこうと考えた。最終的には技術本を書くとかtry SwiftやiOSDCでの登壇を目標としていきたい。

この取り組み自体は去年の10月から始め、今のところ10月と12月に発表はしている。

5. アプリの作成と配信 [目標: 通年]

業務だけではブログやLTのネタは十分なほど貯まらないと感じている。

また、普段アプリを使用していて不満はそれなりに感じたり、もっとこういう機能欲しいと思うことがあるので、ネタ帳に書いている。それらを肥やしにするのはもったいないので、作っていこう(マネタイズも考えているのであわよくばお金稼ぎたい)と考えている。

今のところ想定として、下記アプリで、「1.」ともう1つどれかを作るまでが目標。

  1. Twitter関連のライトアプリ(iOS)
  2. Twitter関連のミドルアプリ(iOS)
  3. RSSリーダー系のミドルアプリ(iOS)
  4. Twitter関連の「1.」や「2.」と連携したアプリ(macOS)

6. その他

技術系の目標としては以下。上から順に優先度高めで、必ずしも全部達成しようというわけではなく、自分に必要だと思う部分、興味ある部分を設定しているので努力目標。

  • 知識のバックボーンの強化
  • MVVMとRxの技術を自分の中に標準として落とし込む
  • OSSへのコントリビュート
  • Githubの活用を増やす
  • macOSアプリの知識を導入
  • Androidでの開発技術習得
  • PythonやGo等でWeb側のバックエンドを簡易的にでもできる様になる

iOSアプリのiPhone X対応調査

iOSエンジニアは、iOS開発に力入れているところを好む

Twitterではないけど、akatsuki174さんのLTでも
"iOSアプリ開発に力入れていないのかな…と思ってしまう"
とある。
iPhone X対応 ~Safe Areaの外側~ // Speaker Deck

等、転職時の会社選びにも少なからずマイナスなイメージがつくことも…。

iPhone X対応いつした?

じゃあ、iOS界隈で有名な会社、アプリはiPhone X対応どのくらいでやってるのだろうか?と気になったので調べて見た。

iPhone X発売が2017年11月03日で、発売前からシミュレータでデバッグもできたので、対応する期間としては3ヶ月近くあったと思う。これだけあれば、対応終わっていてもいいはずと思っている。

調査するアプリの選考基準はひとまず、下記としている。

  • iOS系イベントのスポンサーをやっている会社のアプリ
  • iOS界隈で著名と思われる人が所属している会社または携わっているアプリ

各アプリとiPhone X対応した日付と実機での確認

表の説明

  • 調査日は2017/12/23〜12/24にかけてで、その間にアップデートがあったアプリは漏れている可能性がある
  • 対象アプリは、 try Swift 及び iOSDC のスポンサーのアプリと有名どころのアプリ (但し、ゲーム以外)
  • 企業からリリースされているアプリの中でベストセラーと他有名そうなアプリにフォーカス
  • サービス自体は社内で、アプリは外注のものも混じっていると思うが判別つかないのでそのまま記載
  • アップデート内容で "iPhone X対応" またはそれに類する言葉があれば、その日付を対応日としている
  • アップデート内容で "iOS 11対応" またはそれに類する言葉があれば、その日付を対応日としている
  • 複数対応日が存在する場合、直近の日付を対応日としている
  • アップデート内容から対応した日がわからないものは、 "-" としている
  • 実機確認は起動して数画面確認した程度
<スポンサー企業1>
企 業 アプリ名 iPhone X
対応日
iOS 11
対応日
最終Update日 iPhone X対応実機確認

○:対応済
△:SafeArea対応漏れあり
×未対応
LINE LINE 2017/12/04 - 2017/12/18
LINE Creators Studio - 2017/10/23 2017/12/11
LINE BLOG - 2017/09/27 2017/12/11 ×
YAHOO JAPAN Yahoo!JAPAN - 2017/09/19 2017/12/11
Yahoo!乗換案内 2017/11/01 2017/10/10 2017/12/14
ヤフオク! 2017/11/06 2017/09/19 2017/12/11
PassMarket 2017/11/02 - 2017/11/02
mercari メルカリ - - 2017/12/20
メルカリ アッテ 2017/12/01 - 2017/12/18
メルカリ カウル 2017/11/01 2017/11/01 2017/12/21
Cyber Agent Ameba 2017/10/23 - 2017/12/19
ハコニワタイマー - - 2017/10/26
AbemaTV AbemaTV 2017/11/23 - 2017/12/18
AWA AWA 2017/11/02 2017/09/19 2017/12/20
cookpad クックパッド 2017/12/21 - 2017/12/21
みんなのお弁当 - 2017/09/28 2017/10/05 ×
VASILY IQON - - 2017/11/20 ×
ookami Player! 2017/11/02 2017/11/02 2017/12/22
リクルートライフスタイル ホットペッパー - - 2017/12/19
リクルートマーケティングパートナーズ ゼクシィ - - 2017/12/20 ×
LIFULL SUUMO 2017/10/31 2017/09/18 2017/12/21
Money Forward マネーフォワード - - 2017/11/30
MFクラウド経費 - - 2017/12/14
MFクラウド会計 - - 2017/04/13 ×
freee freee - - 2017/12/18
GameWith シャドバ攻略forシャドウバース - - 2017/11/10 ×
パズドラ 攻略 & マルチ掲示板 - - 2017/11/13 ×
DeNA マンガボックス 2017/11/10 2017/09/19 2017/12/21
ハッカドール 2017/11/14 - 2017/12/13
HANDS LAB ハンズクラブアプリ - - 2017/09/19 ×
SHOWROOM SHOWROOM - 2017/09/19 2017/10/23 ×
FURYU ピクトリンク 2017/11/01 - 2017/12/20
curet - - 2017/11/21 ×
HARUHARU - - 2017/12/21
GMOペパボ minne - 2017/09/20 2017/12/14
PicApp DMM TELLER - - 2017/12/23
CHIPS 2017/11/07 - 2017/12/21
MAMORIO MAMORIO - 2017/09/29 2017/12/18
Hatena はてなブログ 2017/12/12 - 2017/12/12
はてなブックマーク 2017/11/02 2017/11/27 2017/12/21
B!KUMA - - 2015/10/19 ×
sansan Sansan 2017/11/13 - 2017/12/21
Eight 2017/10/30 - 2017/12/14
JET BRAINS YouTrack 2017/11/14 - 2017/11/14
KotlinConf - - 2017/11/03 ×
eureka Couples - - 2017/09/27 ×
Pairs - 2017/10/23 2017/12/20
<スポンサー企業2>
企 業 アプリ名 iPhone X
対応日
iOS 11
対応日
最終Update日 iPhone X対応実機確認

○:対応済
△:SafeArea対応漏れあり
×未対応
chatwork チャットワーク 2017/12/13 2017/09/19 2017/12/13
MEDLEY CLINICS 2017/11/30 2017/10/03 2017/12/18
FRIL フリル(FRIL) 2017/12/11 2017/12/11 2017/12/11
asken あすけんダイエット - 2017/09/23 2017/12/19
Kibousoft KnzkApp - - 2017/12/05 ×
dip バイトル - 2017/10/12 2017/12/20
はらこねっと - - 2017/08/30 ×
Wondershake LOCARI(ロカリ) - - 2017/12/07 ×
Creon(クレオン) - - 2017/11/21
NIKKEI 日本経済新聞 電子版 - - 2017/12/22
日本経済新聞 紙面ビューアー 2017/11/14 - 2017/12/18
PAY ID(BASE .inc) BASE 2017/10/30 - 2017/12/20
PAY ID - - 2017/10/13 ×
FOWD Balloon - - 2017/11/21 ×
Retty Retty - - 2017/12/15
Goodpatch Prott 2017/11/01 - 2017/11/14
Balto 2017/10/31 - 2017/11/03
Wantedly Wantedly People 2017/11/03 2017/10/23 2017/12/19
Wantedly Visit - 2017/10/01 2017/11/23 ×
ORIGAMI Origami - 2017/09/20 2017/12/07
pixiv pixivコミック 2017/11/20 2017/09/19 2017/12/12
pixiv - - 2017/12/22
Pawoo for Mastdon - - 2017/11/09
<他有名アプリや著名なiOSエンジニアが関わっているアプリ>
企 業 アプリ名 iPhone X
対応日
iOS 11
対応日
最終Update日 iPhone X対応実機確認

○:対応済
△:SafeArea対応漏れあり
×未対応
Spotify Spotify 2017/11/17 - 2017/11/17
START TODAY WEAR 2017/12/07 - 2017/12/18
ZOZOTOWN - - 2017/11/20 ×
UNIQLO UNIQLOアプリ - - 2017/12/21 ×
Vikona JOIN US - - 2017/12/19
Coincheck Coincheck 2017/11/09 - 2017/12/15
bitFlyer bitFlyer - 2017/10/05 2017/12/21
AMZN Mobile Amazon - - 2017/11/15
Amazon プライム・ビデオ - - 2017/12/20
Kindle - - 2017/12/01 ×
Twitter Twitter 2017/10/23 2017/09/20 2017/12/17
Facebook Facebook - - 2017/12/15
Google Google アプリ 2017/11/14 - 2017/12/15
Gmail - - 2017/12/19
Chrome - 2017/10/27 2017/12/06
Google マップ 2017/12/01 - 2017/12/14
YouTube - - 2017/12/07
Nintendo Nintendo Switch Online 2017/11/27 - 2017/12/06
みまもりSwitch 2017/10/14 2017/09/25 2017/10/14
McDonald's マクドナルド - - 2017/12/07 ×
DMM.com DMMぱちタウン - - 2017/12/22 ×
DMMブックス - - 2017/11/30 ×
DMM mobile - - 2017/12/18
Hammer&Chisel Discord 2017/11/02 2017/10/04 2017/12/09
Slack Technologies Slack 2017/12/15 2017/09/29 2017/12/15
BrightTable ペコッター - - 2017/12/22 ×
mixi mixi 2017/12/04 - 2017/12/08
minimo - - 2017/12/12
Instagram Instagram - - 2017/12/20
SNOW SNOW - 2017/10/18 2017/11/28 ×
Studyplus Studyplus 2017/11/09 2017/09/30 2017/12/18
Timers Pairy - - 2017/07/24 ×
Famm - - 2017/12/18
Zaim 家計簿Zaim 2017/10/17 - 2017/12/12
ibis アイビスペイントX 2017/11/02 - 2017/11/29
Graffity Graffity - - 2017/12/14
FiNC FiNC - - 2017/12/20
Tabely タベリー - - 2017/12/21
Cluex ままのて - - 2017/12/06

まとめ

  • 同一企業でも、プロジェクトによって温度差やタスクの優先度で対応/非対応が分かれる
  • iPhone X未対応しかない企業は論外だが、SafeArea対応しきれてない等あってもiPhone Xに対応した企業は、iOSエンジニアにとってやりがいのあるところだと思うので良さそう
  • スポンサーになっているのに、iPhone X対応していない企業は、iOS開発に理解があるのか疑問。(単に人手の問題とかもあるだろうけど)

アップデート内容が企業によってまちまちなので、手作業で調査しており、完全に信頼できるデータではないので、あくまで目安として見ていただければと思います。