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
tvOS Workshop
Search
Ben Scheirman
October 12, 2016
Programming
170
1
Share
tvOS Workshop
A 1-day workshop given to attendees of Pragmaconf '16 in Verona, Italy.
Ben Scheirman
October 12, 2016
More Decks by Ben Scheirman
See All by Ben Scheirman
A Promise for a Better Future
subdigital
0
170
Bézier Curves
subdigital
1
5.6k
Buckets of Code
subdigital
0
2k
Building 5 Calls for iOS
subdigital
0
140
Swift on Linux
subdigital
1
890
Swift Solutions
subdigital
2
490
iOS 8 Networking
subdigital
4
960
iOS 8 App Extensions
subdigital
1
390
Effective Networking with iOS 8 and Swift
subdigital
4
1.7k
Other Decks in Programming
See All in Programming
AI時代の脳疲弊と向き合う ~言語学としてのPHP~
sakuraikotone
1
1.9k
Laravel Nightwatchの裏側 - Laravel公式Observabilityツールを支える設計と実装
avosalmon
1
330
レガシーPHP転生 〜父がドメインエキスパートだったのでDDD+Claude Codeでチート開発します〜
panda_program
0
700
Claude Codeをカスタムして自分だけのClaude Codeを作ろう
terisuke
0
110
Go_College_最終発表資料__外部公開用_.pdf
xe_pc23
0
180
実践ハーネスエンジニアリング #MOSHTech
kajitack
7
6.3k
L’IA au service des devs : Anatomie d'un assistant de Code Review
toham
0
230
ふりがな Deep Dive try! Swift Tokyo 2026
watura
0
190
Nuxt Server Components
wattanx
0
270
へんな働き方
yusukebe
6
2.9k
存在論的プログラミング: 時間と存在を記述する
koriym
5
860
ローカルで稼働するAI エージェントを超えて / beyond-local-ai-agents
gawa
3
270
Featured
See All Featured
The Limits of Empathy - UXLibs8
cassininazir
1
290
The SEO Collaboration Effect
kristinabergwall1
0
420
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
720
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
310
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
64
53k
How to Think Like a Performance Engineer
csswizardry
28
2.5k
A better future with KSS
kneath
240
18k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
500
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.3k
Paper Plane
katiecoart
PRO
1
49k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
190
YesSQL, Process and Tooling at Scale
rocio
174
15k
Transcript
None
None
None
None
None
A New Platform
Not just a bigger screen. • Central place in home
• The hub for media • Families
Refreshing Stuff
One Screen Size* *(for now) 1920 x 1080 16:9
One Image Scale
One Image Scale
Always Connected…
Not So Refreshing…
Overscan 90 pt gutter on sides 60 pt gutter top/bottom
None
Input
None
None
None
?
None
Design Considerations
None
10-feet away
None
•Provide a single focus point. •Keep the background simple. •Use
words only when they’re essential or part of a logo. •Don’t include screenshots. •Keep icon corners square.
None
None
None
2 UI Paradigms
UIKit TVML
UIKit UIViewController UIView UIButton UILabel UIImageView
JavaScript TVML XML
TVML <document> <loadingTemplate> <activityIndicator> <text>Hello World!</text> </activityIndicator> </loadingTemplate> </document>
<document> <stackTemplate> <banner> <title>Available Action Movies</title> </banner> <collectionList> <shelf> <section>
<lockup onselect="playMedia('path to video', 'video')"> <img src="path to image" width="182" height="274"/> <title>Movie 1</title> </lockup> <lockup onselect="playMedia('path to video', 'video')"> <img src="path to image" width="182" height="274" /> <title>Movie 2</title> </lockup> </section> </shelf> </collectionList> </stackTemplate> </document>
<document> <stackTemplate> <banner> <title>Available Action Movies</title> </banner> <collectionList> <shelf> <section>
<lockup onselect="playMedia('path to video', 'video')"> <img src="path to image" width="182" height="274"/> <title>Movie 1</title> </lockup> <lockup onselect="playMedia('path to video', 'video')"> <img src="path to image" width="182" height="274" /> <title>Movie 2</title> </lockup> </section> </shelf> </collectionList> </stackTemplate> </document>
function playMedia(extension, mediaType) { var videourl = baseURL + extension;
var singleVideo = new MediaItem(mediaType, videourl); var videoList = new Playlist(); videoList.push(singleVideo); var myPlayer = new Player(); myPlayer.playlist = videoList; myPlayer.play(); }
None
https://developer.apple.com/library/content/samplecode/TVMLCatalog/Introduction/ Intro.html
None
Focus
None
Am I focusable? canBecomeFocused? userInteractionEnabled? visible?
Am I focusable? po [view _whyIsThisViewNotFocusable]
None
None
None
magic? !
None
None
None
None
None
None
.sectioned
.inset
Project Setup
Project Setup ViewController.swift RSSParser.swift RSSEntry.swift iTunesClient.swift
Project Setup E