Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
5分ぐらいで分かる、トリミング機能の作り方
Search
筒井巧
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
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
190
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
170
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.2k
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
200
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
180
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
380
自分的「カンファレンスの楽しみ方」
syumai
0
200
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
250
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
120
FreeBSDでZabbixを動かす.pdf
kenkino
0
280
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
200
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Color Theory Basics | Prateek | Gurzu
gurzu
1
470
Ethics towards AI in product and experience design
skipperchong
2
370
My Coaching Mixtape
mlcsv
0
310
Speed Design
sergeychernyshev
33
2.1k
From π to Pie charts
rasagy
1
370
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Odyssey Design
rkendrick25
PRO
2
810
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
670
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で超簡単!? トリミング範囲の調整機能とは
皆さんこれで… 完全に理解した🙋 早⾜での発表ですいませんでした。。。
おしまい 皆さんのアプリにトリミング機能が実装される⽇も近い!?
おしまい ご清聴ありがとうございました