SlideShare a Scribd company logo
iOSのUI構築小技集
(小さなとこから始められる編)
2018/05/31
ever sense × Green Snap 合同勉強会 @ ever sense inc.
Fumiya Sakai
自己紹介
・酒井 文也 (Fumiya Sakai)
・ever sense. inc エンジニア
・Designer → ServerSide Engineer → AppDeveloper
Accounts
・Facebook: https://www.facebook.com/fumiya.sakai.37
・Twitter: https://twitter.com/fumiyasac
・Github: https://github.com/fumiyasac
・Qiita: https://qiita.com/fumiyasac@github
Who are you?
Library (Personal)
Products (ever sense. inc)
他は、
React・Go・Kotlin
に関心ありかも...
今回お伝えしたいと思っているところ
ほんの少しだけのコード実装や工夫をすることで実現できるUI小技集
その1. 簡単見えて実は複雑そうなレイアウトをいかに実現するか?
その2. 少ないコードとアニメーションで実現する小技
その3. リッチなアニメーションを実現するための手法
その4. ライブラリを使う際に自分なりに気をつけていること
簡単に見えても実は複雑そうなレイアウトの実現
テキストが可変になった際でも崩れないようによしなにする工夫
... 高さ固定
... 高さ可変
①
②
ベースはUIScrollView + UIStackViewの中に、
・それぞれのボタンや表示要素に関するView × N個
・最新ニュースを表示するUITableView × 1個
① タイトルやメッセージの長さは基本的に可変。
② セル1個の高さは75px固定だがセル個数が変化。
また中のセルをタップしたら遷移する。
可変になる要素が多い場合はSelf-Sizingはもちろんのこと、
UITableViewやUICollectionViewを入れ子にする構造が求められてしまう。
※ Webだと当たり前に実現できそうなことが結構めんどくさい場合がままある。
ここがポイント !!!
こんな感じで実装してみた一例
ContainerViewとNotificationCenterを使ってコンテンツの高さを合わせる
ContainerView
UITableView
(News表示用)
News表示用ViewControllerの`viewDidAppear`
でMainViewControllerにNotificationを送り、
ContainerView高さ = News表示長さにする。
NewsViewControllerMainViewController ... ニュースセル(可変)
Notification
Embed Segue
... ニュース用記事セル(可変)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if recentNewsList.count > 0 {
let height = recentNewsTableView.contentSize.height
NotificationCenter.default.post(name: Notification.Name(rawValue: LoadLatestNews), object: self,
userInfo: ["height": height])
}
}
@objc func receiveLoadLatestNewsNotification(_ notification: Notification) {
if let height = notification.userInfo?["height"] as? CGFloat {
latestNewsContainerViewHeight.constant = height
}
...他に実行したい
}
受信側のコード:
送信側のコード: ※ 描画され終わるまでcontentSizeがわからない
※ 高さのconstantをコンテンツの高さに合わせる
実際のコードはこんな感じになる
addTargetをTouchDown時とTouchUp時の両方に対して付与する
// ボタンの初期化処理
private func setupButton() {
// TouchUp・TouchDownの時のイベントを設定する(完了時の具体的な処理はTouchUp側で設定すること)
button.addTarget(self, action: #selector(self.onDownButton(sender:)), for: .touchDown)
button.addTarget(self, action: #selector(self.onUpButton(sender:)), for: [.touchUpInside, .touchUpOutside])
}
// 画像の伸縮アニメーションはアファイン変換を使って行う
@objc private func onDownButton(sender: UIButton) {
UIView.animate(withDuration: 0.05, animations: {
self.buttonWrappedView.transform = CGAffineTransform(scaleX: 0.96, y: 0.96)
}, completion: nil)
}
@objc private func onUpButton(sender: UIButton) {
UIView.animate(withDuration: 0.05, animations: {
self.buttonWrappedView.transform = CGAffineTransform(scaleX: 1, y: 1)
}, completion: { finished in
// TODO: ボタンタップ時の具体的な処理(データ登録等はこのタイミングで実装する)
})
}
ボタン押下時にふわっとした押し心地を作る
Spotifyのシャッフルプレイボタンの様な動きの表現
メイン機能ボタン押下時はボタンの背景を
96%の大きさに変更(CGAffineTransform)
押下時 平常時
参考アプリ: Spotify
(ボタン押下時にバウンド)
→ UIButton透明
→ 背景付UIView
// ボタン用の初期設定(buttonWrappedViewの中にbuttonを上下
左右0の制約で配置)
@IBOutlet weak private var buttonWrappedView: UIView!
@IBOutlet weak private var button: UIButton!
// 画像についてはUIViewの背景として設定すると微調整がしやすいと
思います。
buttonWrappedView.backgroundColor =
UIColor(patternImage: UIImage(named: "xxx")!)
UIView.animateKeyframes()を使った実装Tips
異なるアニメーションを連鎖した形に実行することができる
Touch Up/Downの区別をしない場合は下記のような実装も可能
ボタンの動き: 押下時バウンド + 背景色クロスフェード
// 体調入力画面で体調情報を入力するボタン用のViewへ拡大縮小アニメーションを付与する
static func bounceButtonBackgroundViewForInputHealthConditions(targetView: UIView, duration: TimeInterval) {
// 縮小するパーセントと開始を遅延する秒数
let shrinkingScale: CGFloat = 0.96
let delayTime: TimeInterval = 0.00
// ボタン用のViewが縮むようにバウンドするアニメーションを付与する
UIView.animateKeyframes(withDuration: duration, delay: delayTime, options: [.autoreverse], animations: {
UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 1.0, animations: {
targetView.transform = CGAffineTransform(scaleX: shrinkingScale, y: shrinkingScale)
})
UIView.addKeyframe(withRelativeStartTime: 1.0, relativeDuration: 1.0, animations: {
targetView.transform = CGAffineTransform.identity
})
})
}
①
②①
②
ボタンが縮小する
ボタンが元に戻る
CoreAnimationを利用した表現
擬似的なページネーションや日付の切り替えの表現に用いた例
作り方の解説: https://github.com/fumiyasac/AnimationCounterSample
日めくりカレンダーみたいな動きを「マスク用UIViewとCoreAnimation」で作る
→ 下のViewを包んでいる親View(マスクになる)
→ 記録データを表示するView
その他に使っている事例:
→ 戻る & 進むボタン
→ 日付表示ラベル
ボタン押下時にデータの切り替えと一緒に戻るor進む動きを付与する。
実際のコードはこんな感じになる
表示するデータを切り替える際にCoreAnimationを実行させる
private func animateWeightView(isPrevious: Bool = true) {
// アニメーション対象のViewの親にあたるViewをマスクにする
inputWeightView.superview?.layer.masksToBounds = true
// アニメーションの設定を行う
let transition = CATransition()
transition.type = kCATransitionPush
transition.duration = 0.16
transition.timingFunction = CAMediaTimingFunction(
name: kCAMediaTimingFunctionEaseInEaseOut
)
var key: String
if isPrevious {
transition.subtype = kCATransitionFromLeft
key = "previous"
} else {
transition.subtype = kCATransitionFromRight
key = "next"
}
inputWeightView.layer.removeAllAnimations()
inputWeightView.layer.add(transition, forKey: key)
}
@IBAction func previousDateButtonTapped(_ sender: Any) {
// 戻るボタンクリック時には前の日のデータがテキストフィールドに反映される
setSelectedDate()
setWeightTextField()
animateWeightView(isPrevious: true)
}
@IBAction func nextDateButtonTapped(_ sender: Any) {
// 戻るボタンクリック時には次の日のデータがテキストフィールドに反映される
setSelectedDate()
setWeightTextField()
animateWeightView(isPrevious: false)
}
アニメーション素材を使った表現
AnimationPNGを用いたリッチなアニメーション表現
入力前の状態 入力後の状態
デザイナー エンジニア
データが入力された際に、
チェックマークが入る様な
アニメーションを再生する
役割:
デザインの適用
APNGに関する部分はAPNGKitを活用
https://github.com/onevcat/
APNGKit
役割:
APNGファイル作成&レイアウト
使用するツール類
AfterEffect・Protto.io・XD等
デザイナー&エンジニアの共同作業: 役割の違いはあれどチェックや動作検証はお互いに細かく惜しまずに行う!
連携作業
APNGはアルファチャンネルに対応しているので影や境界線も綺麗に表示できます。
APNGKitを実装するための準備
おおまかな準備と手順を記載しています
1. まずはCocoaPodsなどでライブラリをインストールする
2. 作成したAPNGファイルをXCodeの中に入れる
APNGファイルを入れて管理する際のポイント:
Assets.xcassets内ではなく.swiftファイルとかと同様に管理すること。
3. StoryboardやXibにUIViewを配置して、このクラス名を下記のように変更する
※ コードで利用する場合でももちろん活用できます。
UIImageViewではなくUIViewなのがポイント:
選定および実装するにあたって参考にした資料(1)
・Core Animationの基礎的なところ:
http://obc-fight.blogspot.jp/2012/10/Core-Animation-fundamental.html
・iOSアプリ開発でアニメーションするなら押さえておきたい基礎
https://qiita.com/hachinobu/items/57d4c305c907805b4a53
・Swiftでアニメーションの連続実行をしてみる話
https://qiita.com/lovee/items/460cbb02a345e0ff7910
・Swiftでアニメーション[CoreAnimation編]
https://qiita.com/h_nagami/items/0ad8f8ef5bc23de21e1e
・Core Animation 中級編
https://qiita.com/inamiy/items/bdc0eb403852178c4ea7
・パスに沿ってアニメーションさせる
https://qiita.com/shu223/items/c15547667f8318d4acfe
・Swift アニメーション実装
https://www.lanches.co.jp/blog/7323
選定および実装するにあたって参考にした資料(2)
・心地よいアニメーションを求めて
http://techlife.cookpad.com/entry/2015/10/02/180247
・A look at UIView Animation Curves (Part 1 ~ Part 3)
https://medium.com/@RobertGummesson/a-look-at-uiview-animation-curves-part-1-191d9e6de0ab
https://medium.com/@RobertGummesson/a-look-at-uiview-animation-curves-part-2-b68412e441bf
https://medium.com/@RobertGummesson/a-look-at-uiview-animation-curves-part-3-edde651b6a7a
Appendix: APNGに関する参考資料
・【つくってみた!】APNGで高解像度アニメーション!
http://www.nowhere.co.jp/blog/archives/20160502-170036.html
・GIFアニメからAPNGの時代に! 次世代画像形式APNGを使いこなそう
https://ics.media/entry/2441
ライブラリを使うか否かの(自分なり)戦略
どんな時に使うか?の判断軸を持っておくと良い
その1. ライブラリを知る
その2. スター数やContribution・Issueをチェック
その3. 実際に素振りしてみる
→ 情報源はなんでもあるけど、iOS Cookiesやgithubを直接調べることが多い
→ スター数やIssue数はあくまで指標で、実際にはコードまである程度見る
→ 導入のしやすさもポイントの1つなのでドキュメントの充実具合も確認
UIを作る際にライブラリにする?それともDIYする?の切り分けと実装のアイデア帳 (@Swift Tweets 2018 Spring)
https://qiita.com/fumiyasac@github/items/144aec1e1726500d9d5a
まとめ
意外と少しの工夫だけでUIに心地よさを伴う動きを実現する余地がある
その1. UIKitの特性への理解を深めておくことがまずスタート
その2. アニメーションを特定のポイント入れる場合は機会とタイミングが大事
その3. UIViewのクラスメソッド以外の実装手段やアニメーション素材を適切に活用する
その4. ライブラリを使う際には仕様や改変の余地といった観点を持って選択する
その5. そして一番大切なのはUIのバランスということを忘れない
ありがとうございました!
まだまだ若いサービスですが、
「michiru」&「キッズドクター」
をよろしくお願いします!

More Related Content

PDF
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
PDF
アプリ開発におけるテキスト装飾のアイデア集
PDF
最近の業務やAndroid関連のインプットと振り返り
PDF
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
PDF
2022年の抱負とここ数年続けてきたインプット
PDF
iOSアプリで気になった動きや表現を上手にアレンジして活用してみる
PDF
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
PDF
iOSアプリ開発で意識すると役立ちそうな「つなぎ目」の部分について
試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine
アプリ開発におけるテキスト装飾のアイデア集
最近の業務やAndroid関連のインプットと振り返り
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
2022年の抱負とここ数年続けてきたインプット
iOSアプリで気になった動きや表現を上手にアレンジして活用してみる
少しずつキャッチアップしていくAndroidアプリ開発の補足と振り返り
iOSアプリ開発で意識すると役立ちそうな「つなぎ目」の部分について

What's hot (20)

PDF
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
PDF
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
PDF
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
PDF
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
PDF
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介
PDF
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
PDF
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
PDF
少しずつキャッチアップしていくAndroidアプリ開発
PDF
RxSwiftとMVVMパターンと仲良くなる次のステップ
PDF
Approach of Prototyping for making Application User Interface about iOS
PDF
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
PDF
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
PDF
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
PDF
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)
PDF
SwiftとReactNativeで似たようなUIを作った際の記録
PDF
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回 @Co-Edo
PPTX
Swift playgroundsでアプリを作る
PDF
まずはできるところから始める UnitTestとテストができる実装について
PDF
メディアアプリでよく見る無限スクロールするタブの動きへの考察
KEY
iPhoneアプリ開発を楽に楽しくするサイトまとめ
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
何故に私達(特に私)はアプリのアニメーションや UI表現に魅了されるのか? そして共存と向き合いを考える
レイヤー分けをしたアーキテクチャで作るiOSアプリ&バックエンドのサンプル実装をのぞく
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
UI表現ライブラリを有効活用して iOSアプリのUIをオシャレにするワザ紹介
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
少しずつキャッチアップしていくAndroidアプリ開発
RxSwiftとMVVMパターンと仲良くなる次のステップ
Approach of Prototyping for making Application User Interface about iOS
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)
SwiftとReactNativeで似たようなUIを作った際の記録
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回 @Co-Edo
Swift playgroundsでアプリを作る
まずはできるところから始める UnitTestとテストができる実装について
メディアアプリでよく見る無限スクロールするタブの動きへの考察
iPhoneアプリ開発を楽に楽しくするサイトまとめ
Ad

Similar to iOSのUI構築小技集(小さなとこから始められる編) (20)

PDF
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介
PDF
Swift Study Vol.4
PDF
⑭iPhoneアプリを作ってみよう!(超初心者向け)その2
PDF
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
PPTX
スマートフォン勉強会関西#16(iOS,Android,WP7マルチタッチ)
PDF
DevIO Auto Layout 道場スライド
PDF
⑬I phoneアプリを作ってみよう!(超初心者向け)
PPTX
Uiviewanimation
PDF
SwiftUIで本のUIにチャレンジしてみた!potatotips #87 iOS/Android開発Tips共有会 ...
PDF
Pb tween
PPTX
iPhoneアプリ開発の歩き方〜Swift編〜
PDF
iOS 9 Bootcamp #6 UIKit
PDF
iPhone UI勉強会資料
PPT
Core Animation 使って見た
PPTX
News picksのUIデザイン
PDF
魅せるUIの作り方 | iOS 7エンジニア勉強会
PPTX
PDF
Swift gesture
PDF
How to measure UIView position on Native App
PPTX
WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介
Swift Study Vol.4
⑭iPhoneアプリを作ってみよう!(超初心者向け)その2
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
スマートフォン勉強会関西#16(iOS,Android,WP7マルチタッチ)
DevIO Auto Layout 道場スライド
⑬I phoneアプリを作ってみよう!(超初心者向け)
Uiviewanimation
SwiftUIで本のUIにチャレンジしてみた!potatotips #87 iOS/Android開発Tips共有会 ...
Pb tween
iPhoneアプリ開発の歩き方〜Swift編〜
iOS 9 Bootcamp #6 UIKit
iPhone UI勉強会資料
Core Animation 使って見た
News picksのUIデザイン
魅せるUIの作り方 | iOS 7エンジニア勉強会
Swift gesture
How to measure UIView position on Native App
WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
Ad

More from Fumiya Sakai (9)

PDF
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
PDF
少しずつ手厚くして不具合や仕様漏れを防ぐために
PDF
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
PDF
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
PDF
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
PDF
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
PDF
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
PDF
Hint of a little ingenuity about UI.
PDF
書籍執筆からの今後に向けてのロードマップ
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
少しずつ手厚くして不具合や仕様漏れを防ぐために
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
Hint of a little ingenuity about UI.
書籍執筆からの今後に向けてのロードマップ

iOSのUI構築小技集(小さなとこから始められる編)