Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
5分ぐらいで分かる、トリミング機能の作り方
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
筒井巧
November 20, 2024
Programming
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
5分ぐらいで分かる、トリミング機能の作り方
筒井巧
November 20, 2024
Other Decks in Programming
See All in Programming
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
4.9k
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
1
650
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Oxcを導入して開発体験が向上した話
yug1224
4
300
ふつうのFeature Flag実践入門
irof
7
3.7k
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
530
TAKTでAI駆動開発の品質を設計する
j5ik2o
6
1.2k
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
110
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
390
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
3.6k
OSもどきOS
arkw
0
480
Featured
See All Featured
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
280
Balancing Empowerment & Direction
lara
6
1.2k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
340
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
390
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Being A Developer After 40
akosma
91
590k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
250
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Transcript
5分ぐらいで分かる の作り⽅ トリミング機能
はじめに ⾷べログiOSアプリに トリミング機能があると知っている⼈🙋
たくさんいるね? ほとんど知ってそうで安⼼しました。
トリミング機能のおさらい ⾷べログiOSアプリのトリミング機能 トリミング範囲の調整 画像の回転 固定⽐を保った状態での変更と⾃由操作を選択できる トリミング範囲は変更せずに回転 画像の表⽰位置調整 ズームイン/アウトとスクロール操作
今回解説する部分 ⾷べログiOSアプリのトリミング機能 トリミング範囲の調整 画像の回転 固定⽐を保った状態での変更と⾃由操作を選択できる トリミング範囲は変更せずに回転 画像の表⽰位置調整 ズームイン/アウトとスクロール操作 今回の内容を踏まえればできるので割愛 UIScrollView標準の動作なので割愛
作り⽅をちょこっと解説 Google検索ではあんまり出てこないので \UIKitでの/
画像の座標系を利⽤して トリミング範囲を簡単に再描画する この発表で⼤事なこと
いくぞーーー スタート
⾷べログiOSアプリのトリミング機能における登場⼈物 UIScrollView UIImageView トリミング範囲 4つの頂点を端末左上を(0,0)とする座標系で管理している。 UIScrollViewの上に重なる感じで配置。 なんの変哲もないただのUIImageView。 UIScrollView内に存在する。 ※計算上はCGRectとして利⽤することが多い なんの変哲も無いただのUIScrollView。
トリミング範囲の調整機能とは トリミング範囲の調整 とは ???
トリミング範囲の調整 とは トリミング範囲の調整機能とは
トリミング範囲の調整 とは 2. 指定範囲をズームインしつつ真ん中に トリミング範囲も⼤きくして真ん中に 1. トリミング範囲をユーザー操作で変更 UIPangestureRecognizerから移動量を取得して座標を更新 トリミング範囲の調整機能とは zoomScaleとcontentOffsetの調整
+ いい感じにやればいいんでしょ…???
トリミング範囲の調整 とは 2. ズームインしつつ指定範囲を真ん中に トリミング範囲も⼤きくして真ん中に 1. トリミング範囲をユーザー操作で変更 UIPangestureRecognizerから移動量を取得して座標を更新 トリミング範囲の調整機能とは zoomScaleとcontentOffsetの調整
+ ↑これだけ愚直にやると⾯倒
P y x 画像からみた点Pの座標:点P(300,500) トリミング範囲の中⼼座標:点P(150,250) トリミング範囲の中⼼座標:点P(100,150) 拡⼤! 描画⾼さ:300 描画横幅:200 画像サイズ
400x600 画像からみた点Pの座標:??? y x 描画⾼さ:300 描画横幅:200 P トリミング範囲の調整機能とは > トリミング範囲の動き⽅>普通にやると⾯倒?
P y x 画像からみた点Pの座標:点P(300,500) トリミング範囲の中⼼座標:点P(150,250) トリミング範囲の中⼼座標:点P(100,150) 拡⼤! 描画⾼さ:300 描画横幅:200 画像サイズ
400x600 画像からみた点Pの座標:??? y x 描画⾼さ:300 描画横幅:200 P トリミング範囲の調整機能とは > トリミング範囲の動き⽅>普通にやると⾯倒?
P y x 画像からみた点Pの座標:点P(300,500) トリミング範囲の中⼼座標:点P(150,250) トリミング範囲の中⼼座標:点P(100,150) 拡⼤! 描画⾼さ:300 描画横幅:200 画像サイズ
400x600 画像からみた点Pの座標:??? y x 描画⾼さ:300 描画横幅:200 P いちいち計算するのは⾯倒(拡⼤率, 回転状態 etc...) トリミング範囲の調整機能とは > トリミング範囲の動き⽅>普通にやると⾯倒?
P y x 画像からみた点Pの座標:点P(300,500) トリミング範囲の中⼼座標:点P(150,250) トリミング範囲の中⼼座標:点P(100,150) 拡⼤! 描画⾼さ:300 描画横幅:200 画像サイズ
400x600 画像からみた点Pの座標:??? y x 描画⾼さ:300 描画横幅:200 P どうすれば楽になる? トリミング範囲の調整機能とは > トリミング範囲の動き⽅>普通にやると⾯倒?
P y x 画像からみた点Pの座標:点P(300,500) 描画する座標:点P(150,250) 描画する座標:点P(100,150) 拡⼤! 描画⾼さ:300 描画横幅:200 画像サイズ
400x600 画像からみた点Pの座標:??? y x 描画⾼さ:300 描画横幅:200 P トリミング範囲の調整機能とは > トリミング範囲の動き⽅>普通にやると⾯倒?
// ズーム前 imageView.bounds = (0.0, 0.0, 750.0, 982.0) imageView.frame =
(0.0, 0.0, 402.44142607128356, 526.9299738693339) // ズーム後 imageView.bounds = (0.0, 0.0, 750.0, 982.0) imageView.frame = (0.0, 0.0, 1299.288755747131, 1701.2020775249102) imageView.bounds.size(画像本来の⼤きさ)は変更されず、 scrollView.contentSize(imageView.frame.size)が更新される ズーム前 ズーム後 =画像の中のどこにあるかという情報(imageViewのローカル座標)は変更しない トリミング範囲の調整機能とは > トリミング範囲の動き⽅>UIScrollViewのズーム処理について
Before After トリミング範囲同じ =座標も同じ ⾒えてる範囲⼤ ⾒えてる範囲⼩ トリミング範囲の調整機能とは > トリミング範囲の動き⽅>UIScrollViewのズーム処理について
P y x 画像からみた点Pの座標:点P(300,500) 描画する座標:点P(150,250) 描画する座標:点P(100,150) 拡⼤! 描画⾼さ:300 描画横幅:200 画像サイズ
400x600 画像からみた点Pの座標:点P(300,500) y x 描画⾼さ:300 描画横幅:200 P トリミング範囲の調整機能とは > トリミング範囲の動き⽅>簡単にトリミング範囲を再描画しよう
P y x 画像からみた点Pの座標:点P(300,500) 描画する座標:点P(150,250) 描画する座標:点P(100,150) 拡⼤! 描画⾼さ:300 描画横幅:200 画像サイズ
400x600 画像からみた点Pの座標:点P(300,500) この変わらない座標を⽤いてトリミング範囲を再描画する y x 描画⾼さ:300 描画横幅:200 P トリミング範囲の調整機能とは > トリミング範囲の動き⽅>簡単にトリミング範囲を再描画しよう
P y x y x 描画⾼さ:300 描画横幅:200 P 画像からみた点Pの座標:点P(300,500) 描画する座標:点P(150,250)
描画する座標:点P(100,150) 拡⼤! 描画⾼さ:300 描画横幅:200 画像サイズ 400x600 トリミング範囲の調整機能とは > トリミング範囲の動き⽅>簡単にトリミング範囲を再描画しよう
P y x y x 描画⾼さ:300 描画横幅:200 P 描画する座標:点P(150,250) 描画する座標:点P(100,150)
拡⼤! 描画⾼さ:300 描画横幅:200 画像サイズ 400x600 画像からみた点Pの座標:点P(300,500) トリミング範囲の調整機能とは > トリミング範囲の動き⽅>簡単にトリミング範囲を再描画しよう
P y x y x 描画⾼さ:300 描画横幅:200 画像からみた点Pの座標:点P(300,500) 描画する座標:点P(150,250) 描画する座標:点P(100,150)
拡⼤! 描画⾼さ:300 描画横幅:200 画像サイズ 400x600 変わらない 画像の描画 更新 トリミング範囲の調整機能とは > トリミング範囲の動き⽅>簡単にトリミング範囲を再描画しよう
P y x y x 描画⾼さ:300 描画横幅:200 P 描画する座標:点P(150,250) 描画する座標:点P(100,150)
拡⼤! 描画⾼さ:300 描画横幅:200 画像サイズ 400x600 画像からみた点Pの座標:点P(300,500) トリミング範囲の調整機能とは > トリミング範囲の動き⽅>簡単にトリミング範囲を再描画しよう
P y x y x 描画⾼さ:300 描画横幅:200 P 描画する座標:点P(150,250) 描画する座標:点P(100,150)
拡⼤! 描画⾼さ:300 描画横幅:200 画像サイズ 400x600 画像からみた点Pの座標:点P(300,500) トリミング範囲の調整機能とは > トリミング範囲の動き⽅>簡単にトリミング範囲を再描画しよう
https://developer.apple.com/documentation/uikit/uiview/1622504-convert 呼び出し元の座標系に属する特定の範囲を、指定したViewにおける座標系に変換するメソッド トリミング範囲の調整機能とは > トリミング範囲の動き⽅>簡単にトリミング範囲を再描画しよう
self.convert(トリミング範囲, to: imageView) 描画するView 画像の座標系に 親座標系内の座標 描画する座標 描画する座標(ズーム後) 画像からみた座標 トリミング範囲の調整機能とは
> トリミング範囲の動き⽅>簡単にトリミング範囲を再描画しよう
imageView.convert(画像からみたトリミング範囲, to: self) 画像の座標系 画像の座標系 描画するView 描画する座標 描画する座標(ズーム後) 画像からみた座標 ③で画像の描画⾃体は更新されているのでいい感じにトリミング範囲の描画も変わる
トリミング範囲の調整機能とは > トリミング範囲の動き⽅>簡単にトリミング範囲を再描画しよう
トリミング範囲の調整 とは UIPangestureRecognizerから移動量を取得して座標を更新 1. トリミング範囲を変更 (ジェスチャー中) 2. ズームイン+トリミング範囲の再描画 zoomScaleやcontentOffsetの調整で対象範囲を中⼼に +convert(_,to)を使って同じ範囲を再描画する
=座標系に気をつけながらズーム操作だけ上⼿いことやればOKで超簡単!? トリミング範囲の調整機能とは
皆さんこれで… 完全に理解した🙋 早⾜での発表ですいませんでした。。。
おしまい 皆さんのアプリにトリミング機能が実装される⽇も近い!?
おしまい ご清聴ありがとうございました