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
CALayerを見直す
Search
taminif
November 28, 2016
Technology
380
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
CALayerを見直す
関西モバイルアプリ研究会 #20
taminif
November 28, 2016
More Decks by taminif
See All by taminif
React Native New Architecture 移行実践報告
taminif
1
240
「とりあえずAI」が招く悲劇〜私がAIで生産性を下げるまでの話〜 / The tragedy caused by "AI for now" - The story of how I used AI to reduce my productivity
taminif
1
310
PuppeteerとPlaywrightの15日間の演劇 / relation of Puppeteer and Playwright
taminif
3
2.3k
Redashの開発はじめました / How to get started Redash development
taminif
0
810
私の生活を変えたHeadless Chrome / Headless Chrome who changed my life
taminif
3
540
WebSocketをiOSに持ち込んで辛い思いをした経験がありますか!? / have you painful experience in web socket?
taminif
3
6.2k
LINEで馬券を購入する / Purchase a betting ticket at LINE
taminif
1
1.7k
SkyWayで一年間運用してきたけどWebRTCってつらいんじゃないの
taminif
2
1k
オンライン英会話とSkyWay
taminif
0
550
Other Decks in Technology
See All in Technology
TypeScript Compiler APIとPHP-Parserを活用し、TypeScriptとPHPで型を共有する
shuta13
0
360
2026.06.13_AI時代に事業会社が「SIer出身エンジニア」を求める理由 / Why Businesses Seek Engineers with a System Integrator Background in the AI Era
jumtech
0
500
Oracle AI Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
6
1.5k
[モダンアプリ勉強会]今更聞けないGit/GitHub入門
tsukuboshi
0
270
noUncheckedIndexedAccess、3時間、1万円。 / noUncheckedIndexedAccess, 3 Hours, 10,000 JPY.
kaonavi
1
300
イベントストーミングとKiroの仕様駆動開発で実現する要件の認識合わせプロセス
syobochim
7
1.2k
Claude Code×Terraform IaC テンプレート駆動開発
itouhi
1
290
地元にいないローカルオーガナイザーの立ち回り
uvb_76
1
470
新アーキテクチャ「TiDB X」解説とDedicated比較 TiDB Cloud Premiumのゲーム運用活用を検証
staffrecruiter
0
110
AI駆動開発が変える、大規模開発の前提 ーHuman in the Loop から Human on the Loop へ / AIE2026
visional_engineering_and_design
7
4.8k
Chart.js が簡単に使えるようになっていたので OGP 画像生成に使った話
kamekyame
0
160
AI フレンドリーなエラー監視を TypeScript で実現する
shinyaigeek
2
260
Featured
See All Featured
Six Lessons from altMBA
skipperchong
29
4.3k
How to Think Like a Performance Engineer
csswizardry
28
2.6k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
140
Statistics for Hackers
jakevdp
799
230k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
390
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Typedesign – Prime Four
hannesfritz
42
3.1k
30 Presentation Tips
portentint
PRO
1
320
Utilizing Notion as your number one productivity tool
mfonobong
4
310
WCS-LA-2024
lcolladotor
0
620
Transcript
CALayerΛݟ͢ ؔϞόΠϧΞϓϦݚڀձ #20 2016/11/28 େౡ ޫو
ࣗݾհ • ΣϒϦΦגࣜձࣾ • WEBΤϯδχΞ • ΞϓϦΤϯδχΞ ʢࣗশʣ • 8݄ʹΞϓϦΛ
ϦϦʔε͠·ͨ͠ʂ
CALayer
Core Animation Layer • άϥϑΟοΫඳըͷج൫ • ΞχϝʔγϣϯॲཧΛ୲ • iOSʹඪ४Ͱࡌ͞Ε͍ͯΔ
UIViewʹαϙʔτ
Έͳ͞ΜԿؾͳ͍ͬͯ͘ Δ͔ͱࢥ͍·͢ɻ
CALayerͰͬͯΔͣ • ӨΛམͱ͢ • ઢΛ͚ͭΔ • ؙ֯ʹ͢Δ • ʑɾɾɾ
CALayerΛ༻ͨ͠খٕΛ ຊհ͠·͢
1. CALayerΛܧঝͨ͠αϒΫϥε
CALayerΛܧঝͨ͠αϒΫϥε • CAEmitterLayer • CAGradientLayer • CAMetalLayer • CAEAGLLayer/ CAOpenGLLayer
• CAReplicatorLayer • CAScrollLayer • CAShapeLayer • CATextLayer • CATiledLayer • CATransformLayer • QCCompositionLayer
CALayerΛܧঝͨ͠αϒΫϥε • CAEmitterLayer • CAGradientLayer • CAMetalLayer • CAEAGLLayer/ CAOpenGLLayer
• CAReplicatorLayer • CAScrollLayer • CAShapeLayer • CATextLayer • CATiledLayer • CATransformLayer • QCCompositionLayer
CATextLayer override func viewDidLoad() { super.viewDidLoad() let textLayer = CATextLayer()
textLayer.frame = textView.bounds let string = "Hello! Can I have a Tall Caramel Macchiato?" textLayer.string = string let fontName:CFString = "Noteworthy-Light" as CFString let fontSize:CGFloat = 14.0 textLayer.font = CTFontCreateWithName(fontName, fontSize, nil) textLayer.foregroundColor = UIColor.darkGray.cgColor textLayer.isWrapped = true textLayer.alignmentMode = kCAAlignmentLeft textLayer.contentsScale = UIScreen.main.scale textView.layer.addSublayer(textLayer) }
2. AVPlayerLayer
AVPlayerLayer • AVFoundationʹؚ·ΕΔCALayerαϒΫϥε • mp4Λ࠶ੜͰ͖Δ • Layerͱͯ͠͏ͨΊʹҰඞཁ
AVPlayerLayer Class final class AVPlayerView : UIView { override public
class var layerClass: Swift.AnyClass { get { return AVPlayerLayer.self } } fileprivate var playerLayer: AVPlayerLayer { return self.layer as! AVPlayerLayer } func player() -> AVPlayer { return playerLayer.player! } func setPlayer(_ player: AVPlayer) { playerLayer.player = player } func setVideoFillMode(_ fillMode: String) { playerLayer.videoGravity = fillMode } func videoFillMode() -> String { return playerLayer.videoGravity } }
AVPlayerLayer Layer let path = Bundle.main.path(forResource: "cat", ofType: "mp4") let
fileURL = URL(fileURLWithPath: path!) let avAsset = AVURLAsset(url: fileURL, options: nil) let playerItem = AVPlayerItem(asset: avAsset) let videoPlayer = AVPlayer(playerItem: playerItem) let layer = playerView.layer as! AVPlayerLayer layer.videoGravity = AVLayerVideoGravityResizeAspect layer.player = videoPlayer videoPlayer.play()
3. ӨΛଆʹམͱ͢
αϯϓϧίʔυ let subLayer:CALayer = CALayer.init() subLayer.frame = image.bounds image.layer.addSublayer(subLayer) subLayer.masksToBounds
= true let size:CGSize = subLayer.bounds.size var x:CGFloat = -10.0 var y:CGFloat = -10.0 let pathRef:CGMutablePath = CGMutablePath() pathRef.move(to: CGPoint(x: x, y: y)) x += size.width + 10.0 pathRef.addLine(to: CGPoint(x: x, y: y)) y += 10.0 pathRef.addLine(to: CGPoint(x: x, y: y)) x -= size.width pathRef.addLine(to: CGPoint(x: x, y: y)) y += size.height pathRef.addLine(to: CGPoint(x: x, y: y)) x -= 5.0 pathRef.addLine(to: CGPoint(x: x, y: y)) y -= size.height pathRef.addLine(to: CGPoint(x: x, y: y)) pathRef.closeSubpath() subLayer.shadowOffset = CGSize(width: 5, height: 5) subLayer.shadowColor = UIColor.black.cgColor subLayer.shadowOpacity = 0.5 subLayer.shadowPath = pathRef
Ͳ͏͍ͬͯΔ͔ 7JFX -BZFS - B Z F S
͋Γ͕ͱ͏͍͟͝·ͨ͠