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
Deep dive into the select statement (GopherCon UK)
jespino
0
170
信頼性の目標を誰も求めてない
shubox
0
500
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
130
XHTMLが残したもの
yosuke_furukawa
PRO
2
470
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
220
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
4
1.1k
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
140
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
270
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
450
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
690
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
420
Featured
See All Featured
AI: The stuff that nobody shows you
jnunemaker
PRO
9
980
Thoughts on Productivity
jonyablonski
76
5.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Code Reviewing Like a Champion
maltzj
528
40k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
820
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
380
Docker and Python
trallard
47
4.2k
Chasing Engaging Ingredients in Design
codingconduct
0
300
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
400
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
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で超簡単!? トリミング範囲の調整機能とは
皆さんこれで… 完全に理解した🙋 早⾜での発表ですいませんでした。。。
おしまい 皆さんのアプリにトリミング機能が実装される⽇も近い!?
おしまい ご清聴ありがとうございました