<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Reveal | News</title><link>https://revealapp.com/</link><description>Reveal helps you to review, fix and improve your app’s accessible and visual user experiences.</description><lastBuildDate>Fri, 28 Nov 2025 08:30:00 +1100</lastBuildDate><atom:link href="https://revealapp.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Cyber Monday Sale</title><link>https://revealapp.com/news/cyber-monday-sale/</link><pubDate>Fri, 28 Nov 2025 08:30:00 +1100</pubDate><dc:creator>Tony Arnold</dc:creator><guid>https://revealapp.com/news/cyber-monday-sale/</guid><description>&lt;p>Hi, folks!&lt;/p>
&lt;p>&lt;strong>We&amp;rsquo;re offering a whopping 75% off the first year of your Reveal&lt;/strong> subscription for Cyber Monday — you&amp;rsquo;ve got until the 15th December to take
advantage of this offer.&lt;/p>
&lt;p>All you have to do is use the discount code &lt;code>CYBERMONDAY25&lt;/code> when purchasing Reveal.&lt;/p>
&lt;blockquote>
&lt;p>The fine print: We&amp;rsquo;re not offering this to resellers or enterprise customers. Please be aware that the discounted price applies for the first year. After that, it goes back up to full price.&lt;/p></description><content:encoded>&lt;p>Hi, folks!&lt;/p>
&lt;p>&lt;strong>We&amp;rsquo;re offering a whopping 75% off the first year of your Reveal&lt;/strong> subscription for Cyber Monday — you&amp;rsquo;ve got until the 15th December to take
advantage of this offer.&lt;/p>
&lt;p>All you have to do is use the discount code &lt;code>CYBERMONDAY25&lt;/code> when purchasing Reveal.&lt;/p>
&lt;blockquote>
&lt;p>The fine print: We&amp;rsquo;re not offering this to resellers or enterprise customers. Please be aware that the discounted price applies for the first year. After that, it goes back up to full price.&lt;/p>&lt;/blockquote>
&lt;h2 id="whats-been-happening">What&amp;rsquo;s been happening?&lt;/h2>
&lt;figure>
&lt;picture>
&lt;source srcset="https://revealapp.com/images/updates/56/discovery.png" media="(prefers-color-scheme: light)">
&lt;source srcset="https://revealapp.com/images/updates/56/discovery~dark.png" media="(prefers-color-scheme: dark)">
&lt;img src="https://revealapp.com/images/updates/56/discovery.png" alt="Inspecting a large, vibrant button in the Layout Workspace."/>
&lt;/picture>
&lt;figcaption>Vibrant, glassy UI as far as the eye can see.&lt;/figcaption>
&lt;/figure>
&lt;p>In the past month, we added &lt;strong>support for Apple&amp;rsquo;s 26 SDKs&lt;/strong>, alongside &lt;strong>a thoughtful redesign for Liquid Glass&lt;/strong>.&lt;/p>
&lt;p>Reveal&amp;rsquo;s accessibility tooling helps you to build helpful, meaningful interfaces for all of your users, &lt;em>faster than ever before&lt;/em>. Reveal has been helping developers for Apple&amp;rsquo;s mobile platforms debug and deliver their apps for over a decade.&lt;/p></content:encoded></item><item><title>Hello, Mantel</title><link>https://revealapp.com/news/hello-mantel/</link><pubDate>Fri, 20 Jun 2025 11:00:00 +1100</pubDate><dc:creator>Tony Arnold</dc:creator><guid>https://revealapp.com/news/hello-mantel/</guid><description>&lt;p>Hi, folks!&lt;/p>
&lt;p>From today onward, you’ll start seeing “Mantel” (or more formally “Mantel Operations Pty Ltd”) on Reveal’s website, and in other communications including invoices from Paddle, our payment provider.&lt;/p>
&lt;p>Back in 2022, Itty Bitty Apps (the makers of Reveal) were acquired by Mantel (&lt;a href="https://mantelgroup.com.au/">https://mantelgroup.com.au/&lt;/a>) — this acquisition included Reveal.&lt;/p>
&lt;p>I want to reassure you that it’s the same team working on Reveal, and aside from the change of name, we don’t expect there will be any other changes that you’ll notice. &lt;strong>Mantel continues to invest in and support Reveal&lt;/strong>, just as Itty Bitty Apps did before it.&lt;/p></description><content:encoded>&lt;p>Hi, folks!&lt;/p>
&lt;p>From today onward, you’ll start seeing “Mantel” (or more formally “Mantel Operations Pty Ltd”) on Reveal’s website, and in other communications including invoices from Paddle, our payment provider.&lt;/p>
&lt;p>Back in 2022, Itty Bitty Apps (the makers of Reveal) were acquired by Mantel (&lt;a href="https://mantelgroup.com.au/">https://mantelgroup.com.au/&lt;/a>) — this acquisition included Reveal.&lt;/p>
&lt;p>I want to reassure you that it’s the same team working on Reveal, and aside from the change of name, we don’t expect there will be any other changes that you’ll notice. &lt;strong>Mantel continues to invest in and support Reveal&lt;/strong>, just as Itty Bitty Apps did before it.&lt;/p></content:encoded></item><item><title>Introducing Insights, and new pricing</title><link>https://revealapp.com/news/introducing-insights-and-new-pricing/</link><pubDate>Mon, 16 Oct 2023 14:09:01 +1100</pubDate><dc:creator>Tony Arnold</dc:creator><guid>https://revealapp.com/news/introducing-insights-and-new-pricing/</guid><description>&lt;p>I have two announcements to share with you today:&lt;/p>
&lt;p>First up, &lt;strong>I&amp;rsquo;m proud to &lt;a href="#introducing-insights">introduce Insights&lt;/a>, a brand new workspace for Reveal&lt;/strong>. Insights runs a powerful, accessibility-focused audit of your app. &lt;strong>Instantly&lt;/strong>. It will save you time and guide you to build better apps, for everyone.&lt;/p>
&lt;p>Second, &lt;strong>starting from November 14th, 2023 we&amp;rsquo;re simplifying our pricing model by unifying the Personal and Team subscription plans and &lt;a href="#new-pricing">introducing a single price point of $179 USD per year&lt;/a>&lt;/strong>.&lt;/p></description><content:encoded>&lt;p>I have two announcements to share with you today:&lt;/p>
&lt;p>First up, &lt;strong>I&amp;rsquo;m proud to &lt;a href="#introducing-insights">introduce Insights&lt;/a>, a brand new workspace for Reveal&lt;/strong>. Insights runs a powerful, accessibility-focused audit of your app. &lt;strong>Instantly&lt;/strong>. It will save you time and guide you to build better apps, for everyone.&lt;/p>
&lt;p>Second, &lt;strong>starting from November 14th, 2023 we&amp;rsquo;re simplifying our pricing model by unifying the Personal and Team subscription plans and &lt;a href="#new-pricing">introducing a single price point of $179 USD per year&lt;/a>&lt;/strong>.&lt;/p>
&lt;p>Read on for more detail.&lt;/p>
&lt;h2 id="introducing-insights">Introducing Insights&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/introducing-insights-and-new-pricing/screenshot.png"
alt="Reveal&amp;rsquo;s new Insights workspace.">&lt;figcaption>
&lt;p>Reveal&amp;rsquo;s new Insights workspace.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>The Reveal team have spent more than a year building the new Insights workspace, working with industry experts and organisations to encode their expertise into more than 130 rules that pinpoint areas of improvement for your app. These rules are based on a combination of industry and platform-specific guidelines, best practices and over a decade of our own experience developing apps.&lt;/p>
&lt;p>Insights runs a powerful, accessibility-focused audit of your app using information extracted from both the visual and accessible user interfaces of your app. This combination of the accessible and visual user interfaces is unique to Reveal, and allows us to provide a level of insight that is more powerful than anything else available for iOS, iPadOS and tvOS.&lt;/p>
&lt;p>This new functionality takes Reveal from a passive developer tool, where you need to know what to look for in order to identify issues, to one that proactively surfaces problems along with suggestions on how to fix them. This radically improves developer efficiency and allows you to see and address issues you may never have know existed in your apps.&lt;/p>
&lt;p>If Reveal has saved you even a handful of hours of debugging or testing over the years, you&amp;rsquo;ll love the power of Insights and the productivity it provides.&lt;/p>
&lt;p>You can see an early version of Insights in action in Chris &amp;amp; Tony&amp;rsquo;s talk from /dev/world/2023 earlier this year, &lt;a href="https://youtu.be/xcwWZaWTlrk?si=c1SUZb5DxEDcnPXs">Bridging the Accessibility Gap&lt;/a>:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/xcwWZaWTlrk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="Bridging the Accessibility Gap">&lt;/iframe>
&lt;/div>
&lt;h2 id="new-pricing">New Pricing&lt;/h2>
&lt;p>Today, we&amp;rsquo;re announcing that we&amp;rsquo;re simplifying our pricing model by unifying the Personal and Team subscription plans, and introducing a single price point of $179 USD per year. This new pricing will come in to effect from 14th November, but if you purchase Reveal before then you&amp;rsquo;ll be able to take advantage of our $119 USD introductory offer on your first year subscription.&lt;/p>
&lt;p>Over the past two years Reveal has delivered major new functionality, including our groundbreaking Accessibility tools, and now, the directed checking, guidance and education provided by the new Insights workspace.&lt;/p>
&lt;p>Every year Reveal is updated to support new features and properties that Apple introduce in their operating systems, frameworks and hardware. We also track major new features and improvements in Apple&amp;rsquo;s macOS releases to ensure Reveal is polished to look great and run smoothly on the latest Macs. It&amp;rsquo;s a big job, and we&amp;rsquo;re proud to have kept pace with Apple&amp;rsquo;s releases over the years.&lt;/p>
&lt;p>All of these features and updates deliver incredible value, and we believe our new pricing reflects the amazing capabilities that Reveal provides. With your support we plan to continue to build groundbreaking new functionality in to Reveal that help you build better apps more effectively.&lt;/p>
&lt;p>&lt;em>Note that we&amp;rsquo;ll continue to provide a 30% discount to staff and students of qualifying education institutions. For information on educational pricing, please contact &lt;a href="mailto:sales@revealapp.com">sales@revealapp.com&lt;/a>.&lt;/em>&lt;/p></content:encoded></item><item><title>Introducing the Accessibility Workspace</title><link>https://revealapp.com/news/introducing-the-accessibility-workspace/</link><pubDate>Wed, 25 May 2022 06:30:00 +1100</pubDate><dc:creator>Chris Kolbu</dc:creator><guid>https://revealapp.com/news/introducing-the-accessibility-workspace/</guid><description>&lt;p>Since its release almost ten years ago, Reveal has improved the workflow of thousands of developers, saving what we estimate to be years of developer time. We love being able to provide a tool that is meaningful and useful to you, our peers in the developer community.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/introducing-the-accessibility-workspace/layout_workspace.png"
alt="The Reveal you know and love today.">&lt;figcaption>
&lt;p>The Reveal you know and love today.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>We created Reveal because we wanted something like it to exist; because we &lt;strong>needed&lt;/strong> it for our work. That same desire to &lt;strong>inspect, modify, and debug&lt;/strong> with ease — to build better apps, faster — has driven us to develop a brand new, defining feature of Reveal.&lt;/p></description><content:encoded>&lt;p>Since its release almost ten years ago, Reveal has improved the workflow of thousands of developers, saving what we estimate to be years of developer time. We love being able to provide a tool that is meaningful and useful to you, our peers in the developer community.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/introducing-the-accessibility-workspace/layout_workspace.png"
alt="The Reveal you know and love today.">&lt;figcaption>
&lt;p>The Reveal you know and love today.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>We created Reveal because we wanted something like it to exist; because we &lt;strong>needed&lt;/strong> it for our work. That same desire to &lt;strong>inspect, modify, and debug&lt;/strong> with ease — to build better apps, faster — has driven us to develop a brand new, defining feature of Reveal.&lt;/p>
&lt;h1 id="inspect-experience-verify">Inspect. Experience. Verify.&lt;/h1>
&lt;p>With this release, we&amp;rsquo;ve made fundamental changes.&lt;/p>
&lt;p>The Reveal you know is now Reveal&amp;rsquo;s &lt;strong>Layout Workspace&lt;/strong>.&lt;/p>
&lt;p>The all-new &lt;strong>Accessibility Workspace&lt;/strong> gives you the tools to &lt;strong>inspect, experience and verify&lt;/strong> that your app is accessible to all your users — by putting the accessible user interfaces of your app front and center.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/introducing-the-accessibility-workspace/accessibility_workspace_voiceover.png"
alt="The all-new Accessibility Workspace, featuring a suite of tools in Reveal to help you inspect, experience and verify your app across a variety of accessibility modes.">&lt;figcaption>
&lt;p>The all-new Accessibility Workspace, featuring a suite of tools in Reveal to help you inspect, experience and verify your app across a variety of accessibility modes.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;h1 id="accessibility-workspace-features">Accessibility Workspace Features&lt;/h1>
&lt;figure>&lt;img src="https://revealapp.com/news/introducing-the-accessibility-workspace/accessibility_workspace_contrast_mode.png"
alt="Inspecting Soundstagram’s accessible elements in the Accessibility Workspace&amp;rsquo;s WCAG 2.1 AA color contrast mode.">&lt;figcaption>
&lt;p>Inspecting Soundstagram’s accessible elements in the Accessibility Workspace&amp;rsquo;s WCAG 2.1 AA color contrast mode.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;h2 id="instant-insight">Instant Insight&lt;/h2>
&lt;p>The Accessibility Workspace is &lt;strong>fast&lt;/strong>. It loads in fractions of a second and provides at-a-glance, actionable information about every onscreen element.&lt;/p>
&lt;h2 id="swiftui">SwiftUI&lt;/h2>
&lt;p>The Accessibility Workspace has full support for SwiftUI apps.&lt;/p>
&lt;h2 id="effortless-sharing">Effortless Sharing&lt;/h2>
&lt;p>Accessibility data is now included in Reveal snapshots. For an even easier way to share, you can export an image of the current canvas.&lt;/p>
&lt;h2 id="detailed-inspectors">Detailed Inspectors&lt;/h2>
&lt;p>Rich information about your accessible elements is at your fingertips, with support for newer APIs like &lt;code>AXCustomContent&lt;/code>.&lt;/p>
&lt;h2 id="capable-navigator">Capable Navigator&lt;/h2>
&lt;p>Use it to filter elements by description, &lt;code>UIAccessibilityTraits&lt;/code>, or both.&lt;/p>
&lt;h2 id="composable-canvas">Composable Canvas&lt;/h2>
&lt;p>Reveal&amp;rsquo;s Canvas shows your primary user interface overlaid with its accessible user interfaces.&lt;/p>
&lt;p>Experience your app as your users with common genetic color vision deficiencies would using Reveal&amp;rsquo;s best-in-class simulations.&lt;/p>
&lt;h2 id="visual-voiceover">Visual VoiceOver&lt;/h2>
&lt;p>See all of the frames or custom paths for your app’s elements laid out on the canvas.&lt;/p>
&lt;p>Use the Navigator to quickly read the spoken descriptions of your elements in the order that VoiceOver will traverse them.&lt;/p>
&lt;h2 id="voice-control">Voice Control&lt;/h2>
&lt;p>Instantly see how users would interact with your screen using their voice or keyboard.&lt;/p>
&lt;p>Use the Navigator to see the Number and Labels of your elements.&lt;/p>
&lt;h2 id="wcag-21-contrast-checks">WCAG 2.1 Contrast Checks&lt;/h2>
&lt;p>Verify your app’s use of colour and contrast against the &lt;a href="https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html">AA&lt;/a> and &lt;a href="https://www.w3.org/WAI/WCAG21/Understanding/contrast-enhanced">AAA&lt;/a> guidelines using Reveal&amp;rsquo;s sophisticated tools.&lt;/p>
&lt;p>Using deep knowledge of your app&amp;rsquo;s interfaces, Reveal provides useful and detailed information, including partial text contrast.&lt;/p>
&lt;p>Use the Navigator to see which elements have contrast issues.&lt;/p>
&lt;h1 id="a-first-step">A First Step&lt;/h1>
&lt;p>We are releasing the Accessibility Workspace as a public beta because we recognize that accessibility testing is complex, and that there is so much more we can — and want to — do.&lt;/p>
&lt;p>&lt;a href="https://twitter.com/reveal_app">Talk to us&lt;/a>. Tell us how you’re using it, and how you &lt;strong>want&lt;/strong> to use it.&lt;/p>
&lt;p>&lt;a href="https://support.revealapp.com/hc/en-us/requests/new?subject=Reveal%27s%20Accessibility%20Workspace&amp;amp;type=Feedback">We’re listening&lt;/a>.&lt;/p></content:encoded></item><item><title>Redesign, Revealed</title><link>https://revealapp.com/news/redesign-revealed/</link><pubDate>Tue, 26 Oct 2021 00:00:01 +1100</pubDate><dc:creator>Carlos Melegrito</dc:creator><guid>https://revealapp.com/news/redesign-revealed/</guid><description>&lt;p>Last year, Apple announced macOS 11 “Big Sur” — featuring an all-new look and feel, with refreshed UI elements and icons. It’s the most significant update to the platform since OS X Yosemite. And once again, Apple continues to bring the Mac&amp;rsquo;s design language even closer to iOS.&lt;/p>
&lt;p>&lt;img src="01-Big_Sur.jpg" alt="Big Sur">&lt;/p>
&lt;p>So what’s new? A lot. Everything’s been updated, from the app icons down to the controls. The refreshed look sports more minimal, “unified” toolbars, more vibrancy and blur effects, SF Symbols, plus an overall more friendly and rounded look. System apps like Mail, Messages, Maps (and even Xcode) have also been updated to be in line with the new design patterns.&lt;/p></description><content:encoded>&lt;p>Last year, Apple announced macOS 11 “Big Sur” — featuring an all-new look and feel, with refreshed UI elements and icons. It’s the most significant update to the platform since OS X Yosemite. And once again, Apple continues to bring the Mac&amp;rsquo;s design language even closer to iOS.&lt;/p>
&lt;p>&lt;img src="01-Big_Sur.jpg" alt="Big Sur">&lt;/p>
&lt;p>So what’s new? A lot. Everything’s been updated, from the app icons down to the controls. The refreshed look sports more minimal, “unified” toolbars, more vibrancy and blur effects, SF Symbols, plus an overall more friendly and rounded look. System apps like Mail, Messages, Maps (and even Xcode) have also been updated to be in line with the new design patterns.&lt;/p>
&lt;p>It’s a big refresh, and makes the Mac feel even more modern and refined. Big Sur — and as of this year, macOS Monterey — sets up a whole new era of design for Mac apps. And consequently, sets up a whole new chapter for Reveal.&lt;/p>
&lt;h1 id="interface-off">Interface-Off&lt;/h1>
&lt;p>The new UI changes in macOS are many, and they add up. Apps still work the same, and adopting the new look could be as simple as updating icons, buttons and controls. But to make an app appear like it truly belongs requires a lot of re-thinking and re-work.&lt;/p>
&lt;p>In order to bring Reveal into this new era of design for the Mac, we decided to completely redesign it.&lt;/p>
&lt;h2 id="the-outline">The Outline&lt;/h2>
&lt;p>We started with the Outline sidebar. Reveal’s Outline shows a beautiful, legible list of an app’s views. It&amp;rsquo;s easy to scan, highlights views as you hover over them in the Canvas, and it&amp;rsquo;s buttery-smooth to scroll through. It has a bespoke and unrivalled design, and is one of Reveal’s most valued and powerful features.&lt;/p>
&lt;p>The challenge we faced was trying to reconcile macOS’ newer, yet more sparse (and sometimes, illegible) vibrant sidebar, with our own. Given this was the direction the Mac was headed, we decided to adopt as much of it as we could, while tweaking it to keep our original design intent.&lt;/p>
&lt;p>&lt;img src="02-The_Outline.jpg" alt="The Outline">&lt;/p>
&lt;p>We ended up with a whole new Outline that’s been completely re-engineered, aimed at keeping the utility and performance of the previous design — while making it feel like it fits right in.&lt;/p>
&lt;h2 id="the-toolbar">The Toolbar&lt;/h2>
&lt;p>Up next was the toolbar. Reveal’s toolbar provides information about the current app, and is the primary way to navigate between connections. Because of the updated, more prominent sidebar, our original design had to be overhauled to take advantage of the new layout. We used this as an opportunity to re-think the way it worked and to come up with a totally new design.&lt;/p>
&lt;p>&lt;img src="03-The_Toolbar.jpg" alt="The Toolbar">&lt;/p>
&lt;p>To redesign the toolbar, we took the minimal intent of the new macOS toolbar style and applied it to our own. Connection details now recede into the toolbar itself, allowing a more generous app icon preview. And the main navigation controls have been moved up, to a more convenient and prominent location in the toolbar.&lt;/p>
&lt;h2 id="the-canvas">The Canvas&lt;/h2>
&lt;p>The interactive 3D canvas is the centrepiece of Reveal — it’s gorgeous, powerful and iconic — and something we didn’t want to change too much. Therefore, the only updates we made involved increasing the sizes and legibility of the controls. The scope bar is now centre-aligned, and with the rest of the controls, floats over the canvas using a subtle background blur.&lt;/p>
&lt;p>&lt;img src="04-The_Canvas.jpg" alt="The Canvas">&lt;/p>
&lt;h2 id="the-icons">The Icons&lt;/h2>
&lt;p>Apple’s SF Symbols now permeate the rest of macOS, and give buttons a bolder and more rounded look and feel. And since they all inherit from the same set, toolbar icons across apps have a consistent appearance and visual meaning.&lt;/p>
&lt;p>&lt;img src="05-SF_Symbols.jpg" alt="SF Symbols">&lt;/p>
&lt;p>Although the set offered by Apple is extensive, there aren&amp;rsquo;t enough of them to convey the many kinds of UIViews and elements that Reveal can expose. On top of this, SF Symbols aren’t pixel-hinted and we didn’t want a set of blurry icons in an otherwise sharp interface. As a result, we decided to re-draw all of Reveal’s in-app iconography.&lt;/p>
&lt;p>&lt;img src="06-Reveal_Iconography_Grid.jpg" alt="Reveal Iconography">&lt;/p>
&lt;p>Every detail has been carefully considered, from keeping the original visual meaning of each glyph, down to the alignment of the 1.5pt strokes for @2x screens, and 1pt strokes for @1x screens. Even the alpha values have been set in a way such that similar-looking icons are distinguishable enough even if viewed without colour.&lt;/p>
&lt;p>&lt;img src="07-Reveal_Iconography.jpg" alt="Reveal Iconography">&lt;/p>
&lt;h2 id="the-connections-dialog">The Connections Dialog&lt;/h2>
&lt;p>Another updated design pattern in macOS is its new take on modality. App-Modal Dialogs have been established as the Mac’s convention to prompt opening, saving or selecting documents. And now, rather than opening as sheets that unfurl under an app’s toolbar, App-Modal Dialogs are presented as a more elegant window, detached from the app.&lt;/p>
&lt;p>&lt;img src="08-The_Connections_Dialog.jpg" alt="The Connections Dialog">&lt;/p>
&lt;p>Given a lot of the restructuring we’ve made to Reveal’s layout, to keep it aligned with the new conventions in macOS, it made sense for us to do the same with Connections. The Connections “Sheet” and “Welcome Screen” have been combined into one, simpler modal dialog with a refreshed look and feel.&lt;/p>
&lt;h2 id="more-ui-updates">More UI Updates&lt;/h2>
&lt;p>While there was a lot that we did change to adopt the new look of macOS, the Inspector was the only thing we decided to leave untouched— for now. Reveal’s Inspector still stands the test of time, but we’ve got a lot planned for it in the future.&lt;/p>
&lt;p>We&amp;rsquo;re continuing to shift away from our custom UI towards adopting more system controls and conventions — and it&amp;rsquo;s been paying off. With this new redesign, we&amp;rsquo;re leaning in to that even more, to take advantage of everything macOS can offer. This means that we can spend less time fixing and maintaining customised controls and focus on delivering features.&lt;/p>
&lt;p>On the whole, Reveal&amp;rsquo;s UI has been completely redesigned and re-engineered for this next era of design on the Mac. This is one of the biggest changes we’ve made to the interface since version two, and sets up the foundation for Reveal’s future.&lt;/p>
&lt;p>&lt;img src="09-Reveal.jpg" alt="Reveal">&lt;/p>
&lt;h1 id="thinking-outside-the-app-icon-box">Thinking Outside the App Icon Box&lt;/h1>
&lt;p>A redesigned app isn’t complete without a new icon to go along with it.&lt;/p>
&lt;p>As a part of the Big Sur release, Apple announced a new suite of app icons for the Mac. The new set is now more consistent with iOS, and takes on its rounded, “squircle” icon shape. The only distinction they’ve made to — “make it more Mac” — is an added layer of depth and dimension using gorgeous 3D-rendered objects that can extend beyond the edges of the base.&lt;/p>
&lt;p>&lt;img src="10-Big_Sur_Icons.jpg" alt="Big Sur Icons">&lt;/p>
&lt;p>Conforming to this new style posed a hefty challenge for us with Reveal. Our iconic chatterbox had a unique silhouette, and it stood out against other icons on the dock. Shrinking it down to fit within the base wouldn’t have just diluted the impact of our icon, but seemed like an easy way out. And so, much like our revamped interface, we used this opportunity to explore a new design.&lt;/p>
&lt;h2 id="explorations">Explorations&lt;/h2>
&lt;p>What is Reveal? How do we distill such an abstract concept into a simple illustration? Should we start from scratch, and throw away a much-beloved and recognised logo? — These were the questions we discussed over and over, deep within many threads across the whole Itty Bitty Apps team.&lt;/p>
&lt;p>&lt;img src="11-Icon_Explorations.jpg" alt="Icon Explorations">&lt;/p>
&lt;p>We explored a few directions and tried to resurrect older ideas — but in the end, decided to go all-in on the chatterbox. This meant that our next challenge was to figure out how to take our existing brand, and make it appear like it belongs next to Apple’s own apps. Eventually, the approach we landed on was to re-draw the chatterbox in 3D.&lt;/p>
&lt;h2 id="modelling-in-3d">Modelling in 3D&lt;/h2>
&lt;p>Many hours were spent modelling an origami chatterbox in Blender. Although tedious upfront, modelling in 3D made it easier to compose the final scene. The chatterbox could be rotated and moved; the lighting could be adjusted; and the virtual camera’s settings could be set up on the fly. All it takes is a bit of set up, the push of a button, then a few minutes of rendering, until we get a couple of potential variations of the chatterbox in 3D.&lt;/p>
&lt;p>&lt;img src="12-Chatterboxes.jpg" alt="Chatterboxes">&lt;/p>
&lt;p>Once the model was set up, it then came down to the styling. The lighting was set to give the chatterbox its recognisable shadows and sharp lines. Within the scene, the chatterbox was then placed on a platform to bounce the light and provide a subtle reflection under the model. And finally, the textures on the chatterbox were manually hand-painted with a digital, watercolour brush (our goal was to make it look like it came straight out of a &lt;em>Pixar&lt;/em> film).&lt;/p>
&lt;p>&lt;img src="13-Reveal_App_Icons.jpg" alt="Reveal App Icons">&lt;/p>
&lt;p>And above is the end result. Our iconic chatterbox, re-modelled and re-textured in 3D — while staying true to the iterations before it.&lt;/p>
&lt;h1 id="reveals-next-chapter">Reveal’s Next Chapter&lt;/h1>
&lt;p>It took a lot of re-thinking and re-engineering, but we’re really proud of where we landed with Reveal today. There’s a level of design, care, and attention to detail that people love about Reveal — and we hope to have met that with this new design.&lt;/p>
&lt;p>But it doesn’t stop there. Although it’s going to be one of the biggest changes we’ll make to the app in a while, we’ll keep evolving, growing and refining Reveal over time. This major redesign sets up a whole new chapter for Reveal, and we’re very excited to show you what we’ve got lined up next.&lt;/p></content:encoded></item><item><title>Free Tutorial: Debugging UIKit Views with Reveal</title><link>https://revealapp.com/news/free-tutorial-debugging-uikit-views-with-reveal/</link><pubDate>Wed, 15 Sep 2021 00:00:01 +0000</pubDate><dc:creator>Tony Arnold</dc:creator><guid>https://revealapp.com/news/free-tutorial-debugging-uikit-views-with-reveal/</guid><description>&lt;p>Over the years, we’ve seen that many developers only scratch the surface of Reveal’s capabilities, so we’ve partnered with &lt;a href="https://kodeco.com/">Kodeco&lt;/a> to create &lt;a href="https://www.kodeco.com/21462794-debugging-uikit-views-with-reveal">a video course that shows you how to use Reveal&lt;/a>, as well as how to find (and fix!) common layout and rendering problems in your UIKit apps.&lt;/p>
&lt;p>The tutorials work through a series of practical examples using &lt;a href="https://github.com/jdisho/Papr">Joan Disho’s “Papr” app for iOS&lt;/a>. These real world examples help to guide you on a detailed walk-through of Reveal’s features. Our hope is that this course will help you to solve problems in your apps that you may not even know that you have!&lt;/p></description><content:encoded>&lt;p>Over the years, we’ve seen that many developers only scratch the surface of Reveal’s capabilities, so we’ve partnered with &lt;a href="https://kodeco.com/">Kodeco&lt;/a> to create &lt;a href="https://www.kodeco.com/21462794-debugging-uikit-views-with-reveal">a video course that shows you how to use Reveal&lt;/a>, as well as how to find (and fix!) common layout and rendering problems in your UIKit apps.&lt;/p>
&lt;p>The tutorials work through a series of practical examples using &lt;a href="https://github.com/jdisho/Papr">Joan Disho’s “Papr” app for iOS&lt;/a>. These real world examples help to guide you on a detailed walk-through of Reveal’s features. Our hope is that this course will help you to solve problems in your apps that you may not even know that you have!&lt;/p>
&lt;p>You can &lt;a href="https://www.kodeco.com/21462794-debugging-uikit-views-with-reveal">access the course for free on Kodeco’s site&lt;/a>.&lt;/p>
&lt;p>(Note: this article has been updated to reflect the rebrand of raywenderlich.com to Kodeco.)&lt;/p></content:encoded></item><item><title>Reveal 29: Huge Sur</title><link>https://revealapp.com/news/reveal-29-huge-sur/</link><pubDate>Wed, 02 Jun 2021 00:00:01 +0000</pubDate><dc:creator>Tony Arnold</dc:creator><guid>https://revealapp.com/news/reveal-29-huge-sur/</guid><description>&lt;h2 id="whats-new-in-reveal-v29">What’s new in Reveal v29?&lt;/h2>
&lt;p>Once every 5 years or so, Apple completely redesigns the visuals of their operating systems. Last year at their Worldwide Developer’s Conference (WWDC), Apple unveiled a major update to macOS — version 11, or “Big Sur” — that features a brand new look and feel. You can &lt;a href="https://www.apple.com/macos/big-sur/">read more about macOS 11 on Apple’s site&lt;/a>.&lt;/p>
&lt;p>All macOS apps need a bit of tweaking to look right when major operating system updates are released — we’ve taken this opportunity to rework our user interface from the ground up. These changes have not only affected the way Reveal looks when running on macOS 11, but also &lt;em>how&lt;/em> it runs. We&amp;rsquo;ve been able to simplify, optimize, and streamline many of our controls and views to improve responsiveness, and make some workflows dramatically faster.&lt;/p></description><content:encoded>&lt;h2 id="whats-new-in-reveal-v29">What’s new in Reveal v29?&lt;/h2>
&lt;p>Once every 5 years or so, Apple completely redesigns the visuals of their operating systems. Last year at their Worldwide Developer’s Conference (WWDC), Apple unveiled a major update to macOS — version 11, or “Big Sur” — that features a brand new look and feel. You can &lt;a href="https://www.apple.com/macos/big-sur/">read more about macOS 11 on Apple’s site&lt;/a>.&lt;/p>
&lt;p>All macOS apps need a bit of tweaking to look right when major operating system updates are released — we’ve taken this opportunity to rework our user interface from the ground up. These changes have not only affected the way Reveal looks when running on macOS 11, but also &lt;em>how&lt;/em> it runs. We&amp;rsquo;ve been able to simplify, optimize, and streamline many of our controls and views to improve responsiveness, and make some workflows dramatically faster.&lt;/p>
&lt;p>As with every release, we&amp;rsquo;ve fixed the most frequent crashes and memory leaks to make Reveal even more reliable.&lt;/p>
&lt;p>We hope that you really enjoy using this release, and that it continues to bring fast, accurate visual debugging to your workflow!&lt;/p>
&lt;p>You can &lt;a href="https://revealapp.com/updates/29/">download Reveal v29 and read the release notes here&lt;/a>.&lt;/p>
&lt;h2 id="recent-improvements">Recent improvements&lt;/h2>
&lt;p>Version 28 focused on providing full support for Reveal to run natively on Apple’s speedy new M1-based Macs. These new machines are significantly faster for most tasks than previous generations and Reveal has been optimised to take advantage of these performance gains.&lt;/p>
&lt;p>Saved document snapshots also load faster in this release. Reveal allows users to save a “snapshot” of their iOS or tvOS app’s UI to disk as a document. This document can then be sent to other Reveal users (such as the team’s designer, or a QA person) to review and comment on.&lt;/p>
&lt;p>You can read the &lt;a href="https://revealapp.com/updates/28/">Reveal v28 release notes here&lt;/a>.&lt;/p>
&lt;h2 id="coming-soon">Coming soon&lt;/h2>
&lt;p>Many developers only scratch the surface of Reveal’s capabilities, so for this release, we’re partnering with &lt;a href="https://www.raywenderlich.com/">Ray Wenderlich&lt;/a> to create a series of video tutorials that demonstrate real world applications of Reveal, and how to get the most out of it.&lt;/p>
&lt;p>The tutorials will be available shortly.&lt;/p>
&lt;h2 id="its-not-a-popularity-contest-but">It&amp;rsquo;s not a popularity contest, but…&lt;/h2>
&lt;p>Thousands of iOS developers around the world use Reveal to improve their developer workflow. We were thrilled to see the results of the 2020 iOS Developer Community Survey showing Reveal was voted &lt;a href="https://iosdevsurvey.com/2020/07-developer-tools/#q49">the most used debugging tool after Apple’s own tooling&lt;/a>!&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal-29-huge-sur/2020-debugging-tools-results.png"
alt="Results of the 2020 iOS Developer Community Survey debugging tools question">&lt;figcaption>
&lt;p>Results of the 2020 iOS Developer Community Survey debugging tools question&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;h2 id="whats-next">What’s next?&lt;/h2>
&lt;p>Development of the next big release of Reveal is under way, and we’ve got some exciting things in the pipeline that we can’t wait to share with the rest of the iOS developer community later in the year.&lt;/p></content:encoded></item><item><title>Reveal 25 Announcement</title><link>https://revealapp.com/news/reveal-25-announcement/</link><pubDate>Tue, 12 May 2020 00:00:01 +0000</pubDate><dc:creator>Sean Woodhouse</dc:creator><guid>https://revealapp.com/news/reveal-25-announcement/</guid><description>&lt;p>In light of everything that&amp;rsquo;s going on in the world at the moment, new software releases can seem a little inconsequential. Our focus over the past few weeks has been the health and safety of our staff, family and friends and we hope that you are keeping well in these unprecedented times.&lt;/p>
&lt;hr>
&lt;p>Since 2013, Reveal has become an important part of the development and debug workflow for thousands of iOS developers around the world. Over the years we have continued to improve the product, adding new features and tracking changes in iOS to allow you to inspect apps accurately and easily.&lt;/p></description><content:encoded>&lt;p>In light of everything that&amp;rsquo;s going on in the world at the moment, new software releases can seem a little inconsequential. Our focus over the past few weeks has been the health and safety of our staff, family and friends and we hope that you are keeping well in these unprecedented times.&lt;/p>
&lt;hr>
&lt;p>Since 2013, Reveal has become an important part of the development and debug workflow for thousands of iOS developers around the world. Over the years we have continued to improve the product, adding new features and tracking changes in iOS to allow you to inspect apps accurately and easily.&lt;/p>
&lt;p>Today we are announcing the release of Reveal 25. &lt;a href="https://revealapp.com/updates/25/">In addition to the usual new features, bug fixes and improvements&lt;/a>, Reveal 25 marks an important transition in the way the product is licensed. Going forward, Reveal will be licensed as a 12 month subscription, and you will need an active subscription in order to use the software. Alongside this change we have also created a &lt;a href="https://account.revealapp.com/">new account portal&lt;/a> which allows self-serve management of licenses and subscription plans.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal-25-announcement/portal.jpg"
alt="You can now view and manage all your licenses over at https://account.revealapp.com/">&lt;figcaption>
&lt;p>You can now view and manage all your licenses over at &lt;a href="https://account.revealapp.com/">https://account.revealapp.com/&lt;/a>&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>We have also simplified the licensing of Reveal by removing the distinction between Personal and Commercial licenses and adding features to help organisations manage their licenses with our new Team Plan. The Team Plan allows organisations to manage team members and licenses with the convenience of consolidated billing.&lt;/p>
&lt;p>Licenses for Reveal 2 to 24 will continue to work under the terms of the license agreement at the time of purchase, and those who bought Reveal within the last year will continue to receive updates to the end of their 12 month support period and will gain access to the account portal to manage their license activations and linked devices.&lt;/p>
&lt;p>We look forward to delivering many new features and improvements under this new licensing model and hope the community will continue to support the sustainable development of &lt;a href="https://iosdevsurvey.com/2019/11-developer-tools/#q71">one of the most widely appreciated iOS development tools on the market&lt;/a>. If you have any questions or feedback please reach out from within Reveal (see “Help → Submit Feedback”), or &lt;a href="https://support.revealapp.com/hc/en-us/requests/new">via support&lt;/a>.&lt;/p></content:encoded></item><item><title>A Lovely Gesture</title><link>https://revealapp.com/news/a-lovely-gesture/</link><pubDate>Wed, 31 Oct 2018 00:00:00 +0000</pubDate><dc:creator>Tony Arnold</dc:creator><guid>https://revealapp.com/news/a-lovely-gesture/</guid><description>&lt;p>A new release of Reveal (v19) is available to all users with a current license, and as a 14-day trial.&lt;/p>
&lt;h2 id="new-features">New Features&lt;/h2>
&lt;ul>
&lt;li>Inspect gesture recognizers attached to your view hierarchy - we&amp;rsquo;ve added full support for viewing and inspecting gestures in the outline view.&lt;/li>
&lt;li>Broken layout constraints now provide more information about what is broken, and by how much.&lt;/li>
&lt;li>Support for Xcode 10.1 has been added.&lt;/li>
&lt;li>Added support for the following new properties:
&lt;ul>
&lt;li>&lt;code>UILabel.enablesMarqueeWhenAncestorFocused&lt;/code> on tvOS&lt;/li>
&lt;li>&lt;code>UITextInputTraits.passwordRules&lt;/code> on iOS/tvOS&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="bug-fixes">Bug Fixes&lt;/h2>
&lt;ul>
&lt;li>Performance when saving a Reveal snapshot has been significantly improved.&lt;/li>
&lt;li>Performance when resizing the view hierarchy outline view has been significantly improved.&lt;/li>
&lt;li>Disabled serialization of Display P3 images for Simulator targets. It turns out that the Simulator does not render P3 images at all - this should speed up loading and reloading, as non-P3 images are smaller in size.&lt;/li>
&lt;li>Fixes to visual problems that occurred under Mojave&amp;rsquo;s dark mode, including light scrollbars being shown in the outline under the light appearance (even though the content is always dark).&lt;/li>
&lt;li>Fixed an issue where &lt;code>nil&lt;/code> enumeration values did not show appropriate values in the enumeration and mask inspectors.&lt;/li>
&lt;li>Fixed an issue that was letting the transformation inspector fields grow too wide when displaying long values.&lt;/li>
&lt;li>Bitcode is now properly enabled for RevealServer when targeting devices - it is not included for Simulator builds.&lt;/li>
&lt;/ul>
&lt;h2 id="minimum-system-requirements">Minimum System Requirements&lt;/h2>
&lt;ul>
&lt;li>macOS 10.13.4&lt;/li>
&lt;li>iOS 8&lt;/li>
&lt;li>tvOS 9&lt;/li>
&lt;li>Xcode 8&lt;/li>
&lt;/ul>
&lt;h3 id="support">Support&lt;/h3>
&lt;p>Please report any problems you experience or give us feedback from within Reveal (see &amp;ldquo;Help → Submit Feedback&amp;rdquo;), or via &lt;a href="https://support.revealapp.com/hc/requests/new">our support forum&lt;/a>.&lt;/p></description><content:encoded>&lt;p>A new release of Reveal (v19) is available to all users with a current license, and as a 14-day trial.&lt;/p>
&lt;h2 id="new-features">New Features&lt;/h2>
&lt;ul>
&lt;li>Inspect gesture recognizers attached to your view hierarchy - we&amp;rsquo;ve added full support for viewing and inspecting gestures in the outline view.&lt;/li>
&lt;li>Broken layout constraints now provide more information about what is broken, and by how much.&lt;/li>
&lt;li>Support for Xcode 10.1 has been added.&lt;/li>
&lt;li>Added support for the following new properties:
&lt;ul>
&lt;li>&lt;code>UILabel.enablesMarqueeWhenAncestorFocused&lt;/code> on tvOS&lt;/li>
&lt;li>&lt;code>UITextInputTraits.passwordRules&lt;/code> on iOS/tvOS&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="bug-fixes">Bug Fixes&lt;/h2>
&lt;ul>
&lt;li>Performance when saving a Reveal snapshot has been significantly improved.&lt;/li>
&lt;li>Performance when resizing the view hierarchy outline view has been significantly improved.&lt;/li>
&lt;li>Disabled serialization of Display P3 images for Simulator targets. It turns out that the Simulator does not render P3 images at all - this should speed up loading and reloading, as non-P3 images are smaller in size.&lt;/li>
&lt;li>Fixes to visual problems that occurred under Mojave&amp;rsquo;s dark mode, including light scrollbars being shown in the outline under the light appearance (even though the content is always dark).&lt;/li>
&lt;li>Fixed an issue where &lt;code>nil&lt;/code> enumeration values did not show appropriate values in the enumeration and mask inspectors.&lt;/li>
&lt;li>Fixed an issue that was letting the transformation inspector fields grow too wide when displaying long values.&lt;/li>
&lt;li>Bitcode is now properly enabled for RevealServer when targeting devices - it is not included for Simulator builds.&lt;/li>
&lt;/ul>
&lt;h2 id="minimum-system-requirements">Minimum System Requirements&lt;/h2>
&lt;ul>
&lt;li>macOS 10.13.4&lt;/li>
&lt;li>iOS 8&lt;/li>
&lt;li>tvOS 9&lt;/li>
&lt;li>Xcode 8&lt;/li>
&lt;/ul>
&lt;h3 id="support">Support&lt;/h3>
&lt;p>Please report any problems you experience or give us feedback from within Reveal (see &amp;ldquo;Help → Submit Feedback&amp;rdquo;), or via &lt;a href="https://support.revealapp.com/hc/requests/new">our support forum&lt;/a>.&lt;/p></content:encoded></item><item><title>Our Darkest Release Yet!</title><link>https://revealapp.com/news/our-darkest-release-yet/</link><pubDate>Thu, 20 Sep 2018 00:00:00 +0000</pubDate><dc:creator>Tony Arnold</dc:creator><guid>https://revealapp.com/news/our-darkest-release-yet/</guid><description>&lt;p>A new release of Reveal (v18) is available to all users with a current license, and as a 14-day trial.&lt;/p>
&lt;h2 id="features">Features&lt;/h2>
&lt;ul>
&lt;li>Reveal now supports macOS 10.14 Mojave&amp;rsquo;s Dark Mode.&lt;/li>
&lt;li>Significant performance improvements to rendering and interaction with the canvas. This should be most noticeable with large view hierarchies.&lt;/li>
&lt;li>Visual improvements to how filter matches are displayed. Only the elements that have been filtered upon will be highlighted.&lt;/li>
&lt;li>Filtering by properties of a view&amp;rsquo;s backing layer is now possible.&lt;/li>
&lt;/ul>
&lt;h2 id="fixes">Fixes&lt;/h2>
&lt;ul>
&lt;li>Changing the &lt;code>zPosition&lt;/code> and &lt;code>transform&lt;/code> properties on UIView instances will now properly update the canvas.&lt;/li>
&lt;li>Fixed a bug in rendering order calculations that could cause the z-ordering of views to become incorrect when rendered in the canvas.&lt;/li>
&lt;li>Modifying layer properties on &lt;code>UIImageView&lt;/code> instances will no longer cause the view&amp;rsquo;s image to disappear in the canvas.&lt;/li>
&lt;li>Fixes to filtering of matched ancestors.&lt;/li>
&lt;li>The string enumeration inspector will now respond to all selection changes.&lt;/li>
&lt;li>The &lt;code>UIScreen&lt;/code> property inspectors have been rearranged so that the Layout tab is not empty.&lt;/li>
&lt;/ul>
&lt;p>Please note that &lt;strong>macOS 10.13.4 or later is now required to run Reveal&lt;/strong>.&lt;/p></description><content:encoded>&lt;p>A new release of Reveal (v18) is available to all users with a current license, and as a 14-day trial.&lt;/p>
&lt;h2 id="features">Features&lt;/h2>
&lt;ul>
&lt;li>Reveal now supports macOS 10.14 Mojave&amp;rsquo;s Dark Mode.&lt;/li>
&lt;li>Significant performance improvements to rendering and interaction with the canvas. This should be most noticeable with large view hierarchies.&lt;/li>
&lt;li>Visual improvements to how filter matches are displayed. Only the elements that have been filtered upon will be highlighted.&lt;/li>
&lt;li>Filtering by properties of a view&amp;rsquo;s backing layer is now possible.&lt;/li>
&lt;/ul>
&lt;h2 id="fixes">Fixes&lt;/h2>
&lt;ul>
&lt;li>Changing the &lt;code>zPosition&lt;/code> and &lt;code>transform&lt;/code> properties on UIView instances will now properly update the canvas.&lt;/li>
&lt;li>Fixed a bug in rendering order calculations that could cause the z-ordering of views to become incorrect when rendered in the canvas.&lt;/li>
&lt;li>Modifying layer properties on &lt;code>UIImageView&lt;/code> instances will no longer cause the view&amp;rsquo;s image to disappear in the canvas.&lt;/li>
&lt;li>Fixes to filtering of matched ancestors.&lt;/li>
&lt;li>The string enumeration inspector will now respond to all selection changes.&lt;/li>
&lt;li>The &lt;code>UIScreen&lt;/code> property inspectors have been rearranged so that the Layout tab is not empty.&lt;/li>
&lt;/ul>
&lt;p>Please note that &lt;strong>macOS 10.13.4 or later is now required to run Reveal&lt;/strong>.&lt;/p>
&lt;h2 id="minimum-system-requirements">Minimum System Requirements&lt;/h2>
&lt;ul>
&lt;li>macOS 10.13.4&lt;/li>
&lt;li>iOS 8&lt;/li>
&lt;li>tvOS 9&lt;/li>
&lt;li>Xcode 8&lt;/li>
&lt;/ul>
&lt;h3 id="support">Support&lt;/h3>
&lt;p>Please report any problems you experience or give us feedback from within Reveal (see &amp;ldquo;Help → Submit Feedback&amp;rdquo;), or via &lt;a href="https://support.revealapp.com/hc/requests/new">our support forum&lt;/a>.&lt;/p></content:encoded></item><item><title>Inspector Updates</title><link>https://revealapp.com/news/inspector-updates/</link><pubDate>Tue, 07 Aug 2018 00:00:00 +0000</pubDate><dc:creator>Vlas Voloshin</dc:creator><guid>https://revealapp.com/news/inspector-updates/</guid><description>&lt;p>A new release of Reveal (v17) is available to all users with a current license, and as a 14-day trial.&lt;/p>
&lt;h2 id="inspectors">Inspectors&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/inspector-updates/inspectors.jpg"
alt="Reveal inspector panel showing new editable properties of CAShapeLayer">&lt;figcaption>
&lt;p>Reveal inspector panel showing new editable properties of CAShapeLayer&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;ul>
&lt;li>&lt;em>Attributes Inspector&lt;/em> for Core Animation layers now supports 32 new properties across several classes.&lt;/li>
&lt;li>Several layer properties with string enum types (e.g. &lt;code>CAShapeLayer.lineCap&lt;/code>) are now displayed correctly in the inspectors and can be modified.&lt;/li>
&lt;li>&lt;em>Attributes Inspector&lt;/em> for &lt;code>UITextField&lt;/code>, &lt;code>UITextView&lt;/code> and &lt;code>UISearchBar&lt;/code> classes now supports &lt;code>textContentType&lt;/code> property.&lt;/li>
&lt;li>&lt;em>Attributes Inspector&lt;/em> now displays properties of MapKit views when inspecting tvOS apps.&lt;/li>
&lt;/ul>
&lt;h2 id="layout-constraints">Layout Constraints&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/inspector-updates/constraints.jpg"
alt="Reveal participating constraints inspector showing an annotation for a system constraint and descriptions for autoresizing mask constraints">&lt;figcaption>
&lt;p>Reveal participating constraints inspector showing an annotation for a system constraint and descriptions for autoresizing mask constraints&lt;/p></description><content:encoded>&lt;p>A new release of Reveal (v17) is available to all users with a current license, and as a 14-day trial.&lt;/p>
&lt;h2 id="inspectors">Inspectors&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/inspector-updates/inspectors.jpg"
alt="Reveal inspector panel showing new editable properties of CAShapeLayer">&lt;figcaption>
&lt;p>Reveal inspector panel showing new editable properties of CAShapeLayer&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;ul>
&lt;li>&lt;em>Attributes Inspector&lt;/em> for Core Animation layers now supports 32 new properties across several classes.&lt;/li>
&lt;li>Several layer properties with string enum types (e.g. &lt;code>CAShapeLayer.lineCap&lt;/code>) are now displayed correctly in the inspectors and can be modified.&lt;/li>
&lt;li>&lt;em>Attributes Inspector&lt;/em> for &lt;code>UITextField&lt;/code>, &lt;code>UITextView&lt;/code> and &lt;code>UISearchBar&lt;/code> classes now supports &lt;code>textContentType&lt;/code> property.&lt;/li>
&lt;li>&lt;em>Attributes Inspector&lt;/em> now displays properties of MapKit views when inspecting tvOS apps.&lt;/li>
&lt;/ul>
&lt;h2 id="layout-constraints">Layout Constraints&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/inspector-updates/constraints.jpg"
alt="Reveal participating constraints inspector showing an annotation for a system constraint and descriptions for autoresizing mask constraints">&lt;figcaption>
&lt;p>Reveal participating constraints inspector showing an annotation for a system constraint and descriptions for autoresizing mask constraints&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;ul>
&lt;li>Reveal can now describe the purpose of many system-managed layout constraints. These annotations are available in:
&lt;ul>
&lt;li>&lt;em>Participating Constraints&lt;/em> inspector, by clicking the &lt;strong>&lt;code>i&lt;/code>&lt;/strong> button that appears when hovering the mouse pointer over a system constraint;&lt;/li>
&lt;li>&lt;em>Layout Report&lt;/em> section of a system constraint&amp;rsquo;s &lt;em>Layout Inspector&lt;/em>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Clicking a warning icon that appears next to broken constraints in the &lt;em>Participating Constraints&lt;/em> inspector now displays the description of the warning in a popover, instead of selecting that constraint immediately.&lt;/li>
&lt;li>Outline and &lt;em>Participating Constraints&lt;/em> inspector now display descriptions for autoresizing mask layout constraints instead of treating them as unknown.&lt;/li>
&lt;/ul>
&lt;h2 id="menus">Menus&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Navigate&lt;/strong> menu now includes &lt;strong>Select Next Issue&lt;/strong> and &lt;strong>Select Previous Issue&lt;/strong> commands for quick navigation to the Outline items with detected layout issues (i.e. views with ambiguous layout and broken layout constraints).&lt;/li>
&lt;li>Hierarchy navigation commands in the &lt;strong>Navigate&lt;/strong> menu (e.g. &lt;strong>Select Parent&lt;/strong>) have been updated to better support layout constraints, layout guides and layers.&lt;/li>
&lt;li>&lt;strong>Edit&lt;/strong> → &lt;strong>Copy&lt;/strong> command now allows copying a debugger expression corresponding to the currently selected item.&lt;/li>
&lt;li>Several commands and options in the &lt;strong>Canvas&lt;/strong> and &lt;strong>Navigate&lt;/strong> menus have been renamed to better reflect their current functionality, e.g. layer inspection support.&lt;/li>
&lt;/ul>
&lt;h2 id="miscellaneous-improvements">Miscellaneous Improvements&lt;/h2>
&lt;ul>
&lt;li>Outline items for &lt;code>CATextLayer&lt;/code> objects now include the text displayed by those layers.&lt;/li>
&lt;li>Views from Google Maps SDK (&lt;code>GMSMapView&lt;/code> and &lt;code>GMSPanoramaView&lt;/code>) are now collapsed in the Outline and Canvas by default, similarly to &lt;code>MKMapView&lt;/code>.&lt;/li>
&lt;li>Several under-the-hood changes in preparation for Dark Mode support on macOS 10.14 Mojave.&lt;/li>
&lt;/ul>
&lt;h2 id="bugs-fixed">Bugs Fixed&lt;/h2>
&lt;ul>
&lt;li>Collapsing some items containing layout guides is now animated correctly in the Canvas.&lt;/li>
&lt;li>Canvas now correctly positions items with miniscule intersection, instead of needlessly separating them. This mainly affected inspecting apps displayed on 3× screens.&lt;/li>
&lt;li>Inspectors of option set (bitmask) properties no longer include a superfluous checkbox for &amp;ldquo;None&amp;rdquo; (zero) option.&lt;/li>
&lt;li>View hierarchies that contain objects overriding &lt;code>isEqual:&lt;/code> method (e.g. layers from Google Maps SDK) can now be inspected correctly.&lt;/li>
&lt;li>Fixed the &lt;em>Layout Report&lt;/em> inspector not appearing if a change to a view&amp;rsquo;s or constraint&amp;rsquo;s attribute introduced a layout issue.&lt;/li>
&lt;li>Launching Soundstagram should now succeed if &lt;code>DEVELOPER_DIR&lt;/code> environment variable points to the root of Xcode app bundle instead of the &lt;code>Developer&lt;/code> directory inside it.&lt;/li>
&lt;li>Launching Soundstagram should no longer fail to create a new Simulator instance if an appropriate one does not exist yet.&lt;/li>
&lt;/ul>
&lt;h2 id="minimum-system-requirements">Minimum System Requirements&lt;/h2>
&lt;ul>
&lt;li>macOS 10.12&lt;/li>
&lt;li>iOS 8&lt;/li>
&lt;li>tvOS 9&lt;/li>
&lt;li>Xcode 8.0&lt;/li>
&lt;/ul>
&lt;h3 id="support">Support&lt;/h3>
&lt;p>Please report any problems you experience or give us feedback from within Reveal (see &amp;ldquo;Help → Submit Feedback&amp;rdquo;), or via &lt;a href="https://support.revealapp.com/hc/requests/new">our support forum&lt;/a>.&lt;/p></content:encoded></item><item><title>Inspecting Xcode Playgrounds Live Views</title><link>https://revealapp.com/news/inspecting-xcode-playgrounds-live-views/</link><pubDate>Tue, 07 Aug 2018 00:00:00 +0000</pubDate><dc:creator>Vlas Voloshin</dc:creator><guid>https://revealapp.com/news/inspecting-xcode-playgrounds-live-views/</guid><description>&lt;p>Xcode Playgrounds is a great way to rapidly prototype and run an isolated piece of Swift code: an algorithm implementation, type architecture, or even an interactive view hierarchy – with support for live views. The iterative nature of playgrounds enables experimenting with and fixing issues quickly, but sometimes it may not be clear what actually &lt;em>causes&lt;/em> an undesired behaviour or an incorrect layout. Traditionally developers rely on debuggers to examine the runtime state of their program at a particular point in time without having to modify and restart it, but aside from timeline previews, this sort of functionality is not currently available in playgrounds. This includes the View Debugger, which means that diagnosing obscure layout issues in custom live views requires resorting to trial and error… unless of course you have Reveal!&lt;/p></description><content:encoded>&lt;p>Xcode Playgrounds is a great way to rapidly prototype and run an isolated piece of Swift code: an algorithm implementation, type architecture, or even an interactive view hierarchy – with support for live views. The iterative nature of playgrounds enables experimenting with and fixing issues quickly, but sometimes it may not be clear what actually &lt;em>causes&lt;/em> an undesired behaviour or an incorrect layout. Traditionally developers rely on debuggers to examine the runtime state of their program at a particular point in time without having to modify and restart it, but aside from timeline previews, this sort of functionality is not currently available in playgrounds. This includes the View Debugger, which means that diagnosing obscure layout issues in custom live views requires resorting to trial and error… unless of course you have Reveal!&lt;/p>
&lt;h2 id="integration">Integration&lt;/h2>
&lt;p>With just a few steps you can integrate the support library into your iOS or tvOS playground and inspect live views using Reveal 2 or newer:&lt;/p>
&lt;ol>
&lt;li>Download &lt;a href="https://download.revealapp.com/posts/RevealSupport.playground.zip">this template playground&lt;/a> (compatible with Xcode 8 or newer).&lt;/li>
&lt;li>If you would like to enable Reveal on an existing playground that you have, copy the code from this template (including, most importantly, &lt;code>RevealServer.swift&lt;/code> auxiliary source) into your playground and reopen it. Otherwise, you can simply rename the template and use it as a starting point.&lt;/li>
&lt;li>In Reveal, use &lt;strong>Help&lt;/strong> → &lt;strong>Show Reveal Library in Finder&lt;/strong> menu to open the location of &lt;code>RevealServer.framework&lt;/code> corresponding to the platform you’re targeting.&lt;/li>
&lt;li>Copy this framework to a location accessible by the playground, which is either:
&lt;ul>
&lt;li>Playground’s own &lt;code>Resources&lt;/code> group in its Project navigator, or&lt;/li>
&lt;li>&lt;code>~/Documents/Shared Playground Data&lt;/code> folder – this option allows you to skip this step for other playgrounds next time.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>And that’s it! Run your playground in Xcode, and once the live view becomes visible, it should also appear in Reveal as if it was an app running in Simulator. The comments in the template code provide a bit more information, and can be removed whenever you like.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/inspecting-xcode-playgrounds-live-views/playground.jpg"
alt="Reveal main window showing a live view from Xcode playground running alongside it">&lt;figcaption>
&lt;p>Reveal main window showing a live view from Xcode playground running alongside it&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;h2 id="how-does-it-work">How does it work?&lt;/h2>
&lt;p>Xcode Playgrounds with live views indeed run in an automatically managed Simulator instance. Xcode generates and installs a stub application into this Simulator and uses it as a host. What you see as an interactive live view in Xcode is actually a framed &amp;ldquo;window&amp;rdquo; into the Simulator screen.&lt;/p>
&lt;p>Reveal, on the other hand, communicates with the inspected app via the local network. Dynamically loading Reveal Server framework into the playground’s process enables this communication, and that’s exactly what &lt;code>RevealServer.swift&lt;/code> does.&lt;/p>
&lt;p>The framework itself, however, needs to be placed in one of the predefined locations due to playgrounds’ sandboxing rules: they’re stricter than for normal Simulators, and don’t even allow &lt;em>reading&lt;/em> (let alone executing) from arbitrary locations on your machine, including &lt;code>/Applications&lt;/code>, where you’d usually have Reveal installed. Placing the framework in playgrounds’ &lt;code>Resources&lt;/code> is a straightforward option, and allows sharing Reveal-instrumented playground more easily, but at a price of increased size. Taking advantage of &lt;code>Shared Playground Data&lt;/code> folder, on the other hand, may be more convenient when instrumenting multiple playgrounds, but the framework needs to be placed in that location on every machine where the playground would be inspected. Fortunately, the line of code that attempts loading the framework can be easily changed to fail silently in order to allow the playground to run without Reveal support.&lt;/p>
&lt;h2 id="caveats-and-limitations">Caveats and limitations&lt;/h2>
&lt;p>Because the Reveal support library needs to be provided to the playground explicitly, there are limitations on how much of the integration can be automated:&lt;/p>
&lt;ul>
&lt;li>Whenever you update Reveal, you’ll likely need to manually update &lt;code>RevealServer.framework&lt;/code> in your playgrounds’ &lt;code>Resources&lt;/code> or &lt;code>Shared Playground Data&lt;/code> folder. Otherwise, the version mismatch would prevent Reveal from communicating with the playground.&lt;/li>
&lt;li>&lt;code>RevealServer.framework&lt;/code> versions for iOS and tvOS are different, which means that you’ll need to manually swap it if you inspect playgrounds of both platforms and use &lt;code>Shared Playground Data&lt;/code> as the framework location.&lt;/li>
&lt;li>And finally, Swift Playgrounds on iPad are unfortunately not supported by this integration method due to even stricter sandboxing (or, more precisely, binary code signing) rules.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>We hope that using Reveal in Xcode Playgrounds will make experimenting with live views and layout even faster and easier for you than before. If you have feedback or suggestions about this use case, please let us know on &lt;a href="https://support.revealapp.com/hc/requests/new">our support forum&lt;/a>. Happy playing!&lt;/p></content:encoded></item><item><title>Like parfait, it has layers! 🍰</title><link>https://revealapp.com/news/like-parfait-it-has-layers/</link><pubDate>Wed, 30 May 2018 00:00:00 +0000</pubDate><dc:creator>Vlas Voloshin</dc:creator><guid>https://revealapp.com/news/like-parfait-it-has-layers/</guid><description>&lt;p>A new release of Reveal (v15) is available to all users with a current license, and as a 14-day trial.&lt;/p>
&lt;h2 id="layer-inspection-support-beta">Layer Inspection Support (Beta)&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/like-parfait-it-has-layers/concepts-full-window.png"
alt="Reveal main window showing a CALayer selected and being inspected">&lt;figcaption>
&lt;p>Reveal main window showing a CALayer selected and being inspected&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Reveal now supports inspecting custom Core Animation layer hierarchies. Sublayers manually added into views&amp;rsquo; backing layers now show up in the &lt;em>Sublayers&lt;/em> group in the Outline, and are displayed as selectable items in the Canvas.&lt;/p></description><content:encoded>&lt;p>A new release of Reveal (v15) is available to all users with a current license, and as a 14-day trial.&lt;/p>
&lt;h2 id="layer-inspection-support-beta">Layer Inspection Support (Beta)&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/like-parfait-it-has-layers/concepts-full-window.png"
alt="Reveal main window showing a CALayer selected and being inspected">&lt;figcaption>
&lt;p>Reveal main window showing a CALayer selected and being inspected&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Reveal now supports inspecting custom Core Animation layer hierarchies. Sublayers manually added into views&amp;rsquo; backing layers now show up in the &lt;em>Sublayers&lt;/em> group in the Outline, and are displayed as selectable items in the Canvas.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/like-parfait-it-has-layers/scope-bar.png"
alt="Reveal inspector panel showing the new View/Layer scope bar">&lt;figcaption>
&lt;p>Reveal inspector panel showing the new View/Layer scope bar&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Layer properties, previously combined into a single &lt;em>Layer Inspector&lt;/em>, are now separated into the familiar &lt;em>Identity&lt;/em>, &lt;em>Attributes&lt;/em> and &lt;em>Layout&lt;/em> inspectors. When a view is selected, you can use a scope bar to switch these inspectors between showing properties of that view and its backing layer.&lt;/p>
&lt;p>Layer inspection support is currently in beta - there are known issues that we&amp;rsquo;re working on, and we&amp;rsquo;re very open to input on this feature, so please &lt;a href="https://support.revealapp.com/hc/requests/new">get in contact if you have any feedback&lt;/a>.&lt;/p>
&lt;p>Thanks to &lt;a href="https://concepts.tophatch.com/en/">Concepts&lt;/a> for letting us use their &lt;em>amazing&lt;/em> color wheel to debug and demo this feature!&lt;/p>
&lt;h3 id="known-issues">Known issues&lt;/h3>
&lt;ul>
&lt;li>Content outside of layer&amp;rsquo;s bounds is not rendered in the Canvas, even if the layer has &lt;code>masksToBounds&lt;/code> disabled. This makes layers with zero bounds size effectively invisible.&lt;/li>
&lt;li>Some properties of &lt;code>CALayer&lt;/code> and its subclasses (e.g. those defined in &lt;code>CAMediaTiming&lt;/code> protocol) are missing from inspectors, while other properties are not editable and/or displayed as a string.&lt;/li>
&lt;li>Filtering by name, address or class of a view&amp;rsquo;s backing layer produces no results.&lt;/li>
&lt;/ul>
&lt;h2 id="layout-constraints-inspection-improvements">Layout Constraints Inspection Improvements&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/like-parfait-it-has-layers/participating-constraints.png"
alt="Reveal inspector panel showing the revised participating constraints">&lt;figcaption>
&lt;p>Reveal inspector panel showing the revised participating constraints&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;ul>
&lt;li>Optional constraints are now rendered as dashed lines in the Canvas.&lt;/li>
&lt;li>Optional constraints now include their priority in labels displayed in the Outline and &lt;em>Participating Constraints&lt;/em> inspector.
&lt;ul>
&lt;li>This means that you can now also use the Filter to find constraints with a specific priority – or any non-required priority. Simply use the &lt;code>@&lt;/code> character in the filter field: it will match the desciption of optional constraints.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;em>Participating Constraints&lt;/em> inspector is now divided in two groups: &lt;em>Participating Constraints Affecting Layout&lt;/em> and &lt;em>Other Participating Constraints&lt;/em>. As the names suggest, the first group includes constraints that directly affect position or size of the selected view or layout guide, while the remaining constraints connected to that item show up in the second group.&lt;/li>
&lt;li>Constraints displayed in the &lt;em>Participating Constraints&lt;/em> inspector are now sorted by layout attributes, relation and other properties. As a result, constraints displayed for different views or layout guides follow a consistent order, regardless of the order in which they were originally added into the view hierarchy.&lt;/li>
&lt;li>Labels of constraints diplayed in the &lt;em>Participating Constraints&lt;/em> are now more context-aware and shorten items such as &lt;code>superview&lt;/code> (for views) and &lt;code>owningView&lt;/code> (for layout guides).&lt;/li>
&lt;li>More kinds of constraints are now classified as &amp;ldquo;system&amp;rdquo; and use blue colour for icons and Canvas lines. For example, this includes constraints managed internally by &lt;code>UIStackView&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h2 id="bugs-fixed">Bugs Fixed&lt;/h2>
&lt;ul>
&lt;li>Inspector for the &lt;code>directionalLayoutMargins&lt;/code> property is now displayed correctly.&lt;/li>
&lt;li>Added missing inspectors for properties declared in &lt;code>UITextDraggable&lt;/code> protocol: &lt;code>textDragActive&lt;/code>, &lt;code>textDropActive&lt;/code>, &lt;code>textDragOptions&lt;/code>.&lt;/li>
&lt;li>&lt;em>Participating Constraints&lt;/em> inspector now correctly includes descriptions of &lt;code>firstBaseline&lt;/code> and margin-related layout attributes.&lt;/li>
&lt;li>Changes to the list of windows on the screen are now detected correctly when the view hierarchy is modified using inspectors.&lt;/li>
&lt;li>Precise ordering of windows that share the same level is now preserved in the Outline and Canvas.&lt;/li>
&lt;li>If a view goes offscreen but is not deallocated while Reveal is collecting snapshot images (e.g. due to an animation completion), it is now captured correctly instead of showing up empty.&lt;/li>
&lt;li>Layout guide items in the Outline are now updated correctly when their identifier changes.&lt;/li>
&lt;li>Fixed a crash occurring when inspecting applications running in Simulator with views larger than 16384 pixels in size.&lt;/li>
&lt;li>New snapshots of applications running on devices and simulators with non-P3 displays will no longer appear &amp;ldquo;over-exposed&amp;rdquo; in the Canvas when running High Sierra.&lt;/li>
&lt;li>Timeout for launching Soundstagram has been increased to avoid failing due to simulator environment taking a long time to initialise.&lt;/li>
&lt;li>Fixed Soundstagram failing to launch in some environments with lots of simulators.&lt;/li>
&lt;/ul>
&lt;h2 id="minimum-system-requirements">Minimum System Requirements&lt;/h2>
&lt;ul>
&lt;li>macOS 10.12&lt;/li>
&lt;li>iOS 8&lt;/li>
&lt;li>tvOS 9&lt;/li>
&lt;li>Xcode 8.0&lt;/li>
&lt;/ul>
&lt;h3 id="support">Support&lt;/h3>
&lt;p>Please report any problems you experience or give us feedback from within Reveal (see &amp;ldquo;Help → Submit Feedback&amp;rdquo;), or via &lt;a href="https://support.revealapp.com/hc/requests/new">our support forum&lt;/a>.&lt;/p></content:encoded></item><item><title>This one goes all the way to eleven</title><link>https://revealapp.com/news/this-one-goes-all-the-way-to-eleven/</link><pubDate>Mon, 18 Sep 2017 00:00:00 +0000</pubDate><dc:creator>Tony Arnold</dc:creator><guid>https://revealapp.com/news/this-one-goes-all-the-way-to-eleven/</guid><description>&lt;p>A new release of Reveal (v11) is available to all users with a current license, and as a 14-day trial.&lt;/p>
&lt;p>We&amp;rsquo;ve turned the dials to eleven with this release - just in time for Apple&amp;rsquo;s big round of releases: &lt;strong>Reveal now supports tvOS 11, iOS 11 and Xcode 9&lt;/strong>.&lt;/p>
&lt;p>We&amp;rsquo;ve gone through and added support for over 35 new inspectable properties, including:&lt;/p>
&lt;ul>
&lt;li>CALayer
&lt;ul>
&lt;li>maskedCorners&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>MKMapView
&lt;ul>
&lt;li>region&lt;/li>
&lt;li>centerCoordinate&lt;/li>
&lt;li>visibleMapRect&lt;/li>
&lt;li>showsCompass&lt;/li>
&lt;li>showsScale&lt;/li>
&lt;li>showsTraffic&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIAccessibilityContentSizeCategoryImageAdjusting (conformed to by UIButton, UIImageView)
&lt;ul>
&lt;li>adjustsImageSizeForAccessibilityContentSizeCategory&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIApplication
&lt;ul>
&lt;li>alternateIconName&lt;/li>
&lt;li>supportsAlternateIcons&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIBarPositioning (conformed to by UINavigationBar, UISearchBar, UIToolbar)
&lt;ul>
&lt;li>barPosition&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UICollectionView
&lt;ul>
&lt;li>dragInteractionEnabled&lt;/li>
&lt;li>hasUncommittedUpdates&lt;/li>
&lt;li>reorderingCadence&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIContentSizeCategoryAdjusting (conformed to by UITextField, UITextLabel, UITextView)
&lt;ul>
&lt;li>adjustsFontForContentSizeCategory&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIImageView
&lt;ul>
&lt;li>masksFocusEffectToContents&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIScreen
&lt;ul>
&lt;li>maximumFramesPerSecond&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UISegmentedControl
&lt;ul>
&lt;li>springLoaded&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIScrollView
&lt;ul>
&lt;li>contentInsetAdjustmentBehavior&lt;/li>
&lt;li>adjustedContentInset&lt;/li>
&lt;li>indexDisplayMode&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UISpringLoadedInteractionSupporting (conformed to by UIButton, UISegmentedControl, UICollectionView)
&lt;ul>
&lt;li>isSpringLoaded&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UITableView
&lt;ul>
&lt;li>separatorInsetReference&lt;/li>
&lt;li>insetsContentViewsToSafeArea&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UITextDraggable (conformed to by UITextField, UITextView)
&lt;ul>
&lt;li>textDragActive&lt;/li>
&lt;li>textDropActive&lt;/li>
&lt;li>textDragOptions&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UITextInputTraits (conformed to by UISearchBar, UITextField, UITextView)
&lt;ul>
&lt;li>smartQuotesType&lt;/li>
&lt;li>smartDashesType&lt;/li>
&lt;li>smartInsertDeleteType&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIView
&lt;ul>
&lt;li>accessibilityContainerType&lt;/li>
&lt;li>accessibilityIgnoresInvertColors&lt;/li>
&lt;li>directionalLayoutMargins&lt;/li>
&lt;li>insetsLayoutMarginsFromSafeArea&lt;/li>
&lt;li>safeAreaInsets&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>We&amp;rsquo;ve also improved a couple of the property inspectors:&lt;/p></description><content:encoded>&lt;p>A new release of Reveal (v11) is available to all users with a current license, and as a 14-day trial.&lt;/p>
&lt;p>We&amp;rsquo;ve turned the dials to eleven with this release - just in time for Apple&amp;rsquo;s big round of releases: &lt;strong>Reveal now supports tvOS 11, iOS 11 and Xcode 9&lt;/strong>.&lt;/p>
&lt;p>We&amp;rsquo;ve gone through and added support for over 35 new inspectable properties, including:&lt;/p>
&lt;ul>
&lt;li>CALayer
&lt;ul>
&lt;li>maskedCorners&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>MKMapView
&lt;ul>
&lt;li>region&lt;/li>
&lt;li>centerCoordinate&lt;/li>
&lt;li>visibleMapRect&lt;/li>
&lt;li>showsCompass&lt;/li>
&lt;li>showsScale&lt;/li>
&lt;li>showsTraffic&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIAccessibilityContentSizeCategoryImageAdjusting (conformed to by UIButton, UIImageView)
&lt;ul>
&lt;li>adjustsImageSizeForAccessibilityContentSizeCategory&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIApplication
&lt;ul>
&lt;li>alternateIconName&lt;/li>
&lt;li>supportsAlternateIcons&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIBarPositioning (conformed to by UINavigationBar, UISearchBar, UIToolbar)
&lt;ul>
&lt;li>barPosition&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UICollectionView
&lt;ul>
&lt;li>dragInteractionEnabled&lt;/li>
&lt;li>hasUncommittedUpdates&lt;/li>
&lt;li>reorderingCadence&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIContentSizeCategoryAdjusting (conformed to by UITextField, UITextLabel, UITextView)
&lt;ul>
&lt;li>adjustsFontForContentSizeCategory&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIImageView
&lt;ul>
&lt;li>masksFocusEffectToContents&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIScreen
&lt;ul>
&lt;li>maximumFramesPerSecond&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UISegmentedControl
&lt;ul>
&lt;li>springLoaded&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIScrollView
&lt;ul>
&lt;li>contentInsetAdjustmentBehavior&lt;/li>
&lt;li>adjustedContentInset&lt;/li>
&lt;li>indexDisplayMode&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UISpringLoadedInteractionSupporting (conformed to by UIButton, UISegmentedControl, UICollectionView)
&lt;ul>
&lt;li>isSpringLoaded&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UITableView
&lt;ul>
&lt;li>separatorInsetReference&lt;/li>
&lt;li>insetsContentViewsToSafeArea&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UITextDraggable (conformed to by UITextField, UITextView)
&lt;ul>
&lt;li>textDragActive&lt;/li>
&lt;li>textDropActive&lt;/li>
&lt;li>textDragOptions&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UITextInputTraits (conformed to by UISearchBar, UITextField, UITextView)
&lt;ul>
&lt;li>smartQuotesType&lt;/li>
&lt;li>smartDashesType&lt;/li>
&lt;li>smartInsertDeleteType&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>UIView
&lt;ul>
&lt;li>accessibilityContainerType&lt;/li>
&lt;li>accessibilityIgnoresInvertColors&lt;/li>
&lt;li>directionalLayoutMargins&lt;/li>
&lt;li>insetsLayoutMarginsFromSafeArea&lt;/li>
&lt;li>safeAreaInsets&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>We&amp;rsquo;ve also improved a couple of the property inspectors:&lt;/p>
&lt;ul>
&lt;li>Bit mask options are now presented as checkboxes for types such as &lt;code>UIViewAutoresizing&lt;/code>.&lt;/li>
&lt;li>An improved representation for &lt;code>CGAffineTransform&lt;/code> properties.&lt;/li>
&lt;/ul>
&lt;p>I hope you enjoy the improvements we&amp;rsquo;ve made! If there are any additional properties that you&amp;rsquo;d like to see us support, please start a discussion about it in &lt;a href="https://support.revealapp.com/hc/requests/new">our support forum&lt;/a>.&lt;/p>
&lt;h3 id="minimum-system-requirements">Minimum System Requirements&lt;/h3>
&lt;ul>
&lt;li>macOS 10.11&lt;/li>
&lt;li>iOS 8&lt;/li>
&lt;li>tvOS 9&lt;/li>
&lt;li>Xcode 7.3&lt;/li>
&lt;/ul>
&lt;h3 id="support">Support&lt;/h3>
&lt;p>Please report any problems you experience or give us feedback from within Reveal (see &amp;ldquo;Help → Submit Feedback&amp;rdquo;), or via &lt;a href="https://support.revealapp.com/hc/requests/new">our support forum&lt;/a>.&lt;/p></content:encoded></item><item><title>Layout Guides and the Touch Bar</title><link>https://revealapp.com/news/layout-guides-and-the-touch-bar/</link><pubDate>Wed, 22 Feb 2017 00:00:00 +0000</pubDate><dc:creator>Tony Arnold</dc:creator><guid>https://revealapp.com/news/layout-guides-and-the-touch-bar/</guid><description>&lt;p>A new release of Reveal (v7) is available to all users with a current license, and as a &lt;a href="https://revealapp.com/download/">14-day trial&lt;/a>.&lt;/p>
&lt;p>You thought that after the huge set of new features we released last month we&amp;rsquo;d slow down and take a breather? No, Sir! We&amp;rsquo;ve got two great, chunky new features and a light dusting of bug fixes ready to go:&lt;/p>
&lt;p>Reveal 7 adds &lt;strong>support for inspecting Auto Layout guides&lt;/strong>, as well supporting &lt;strong>dynamic, context-specific keyboard shortcuts on the Touch Bar&lt;/strong> of Apple&amp;rsquo;s new MacBook Pro.&lt;/p></description><content:encoded>&lt;p>A new release of Reveal (v7) is available to all users with a current license, and as a &lt;a href="https://revealapp.com/download/">14-day trial&lt;/a>.&lt;/p>
&lt;p>You thought that after the huge set of new features we released last month we&amp;rsquo;d slow down and take a breather? No, Sir! We&amp;rsquo;ve got two great, chunky new features and a light dusting of bug fixes ready to go:&lt;/p>
&lt;p>Reveal 7 adds &lt;strong>support for inspecting Auto Layout guides&lt;/strong>, as well supporting &lt;strong>dynamic, context-specific keyboard shortcuts on the Touch Bar&lt;/strong> of Apple&amp;rsquo;s new MacBook Pro.&lt;/p>
&lt;h2 id="auto-layout-guides">Auto Layout Guides&lt;/h2>
&lt;p>New in this month&amp;rsquo;s release of Reveal is support for Auto Layout guides.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/layout-guides-and-the-touch-bar/reveal_feat_layoutguides.jpg">
&lt;/figure>
&lt;p>Being able to inspect layout guides is useful when debugging layout issues in views like &lt;code>UIStackView&lt;/code> which use &lt;code>UILayoutGuide&lt;/code> to implement their internal layout. For example, if a constraint attached to a layout guide gets broken by Auto Layout, inspecting your app in Reveal will highlight that constraint with a layout error, and now Reveal will also show which layout guide the constraint is related to, and visualize it in the Canvas.&lt;/p>
&lt;p>You can read about this feature in-depth in &lt;a href="#">Vlas&amp;rsquo; introductory blog post&lt;/a>.&lt;/p>
&lt;h2 id="touch-bar-support">Touch Bar Support&lt;/h2>
&lt;p>If you&amp;rsquo;re lucky enough to have one of Apple&amp;rsquo;s new MacBook Pro notebooks, we now support dynamic, context-specific hotkeys in the Touch Bar for:&lt;/p>
&lt;ul>
&lt;li>Connecting to your iOS and tvOS apps&lt;/li>
&lt;li>Controlling the canvas and outline view, including:
&lt;ul>
&lt;li>Filtering the view hierarchy&lt;/li>
&lt;li>Refreshing the currently focused app&lt;/li>
&lt;li>Toggling auto layout, system windows and hidden view display&lt;/li>
&lt;li>Zooming the canvas&lt;/li>
&lt;li>Controlling the display options of the canvas, including perspective (2D/3D) and the render mode (&amp;ldquo;Frames&amp;rdquo;, &amp;ldquo;Content&amp;rdquo; or &amp;ldquo;Frames and Content&amp;rdquo;)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;figure>&lt;img src="https://revealapp.com/news/layout-guides-and-the-touch-bar/reveal_feat_touchbar.jpg">
&lt;/figure>
&lt;p>We&amp;rsquo;d love &lt;a href="http://support.revealapp.com/discussion/new">your feedback on this feature&lt;/a>!&lt;/p>
&lt;h2 id="bug-fixes">Bug Fixes&lt;/h2>
&lt;ul>
&lt;li>Fixed: The position and size of the frontmost document window is remembered across launches.&lt;/li>
&lt;li>Fixed: RevealServer.framework&amp;rsquo;s &lt;code>CFBundleShortVersionString&lt;/code> is now the same as the version of Reveal that bundles it.&lt;/li>
&lt;/ul>
&lt;h2 id="minimum-system-requirements">Minimum System Requirements&lt;/h2>
&lt;ul>
&lt;li>macOS 10.11&lt;/li>
&lt;li>iOS 8&lt;/li>
&lt;li>tvOS 9&lt;/li>
&lt;li>Xcode 7.3&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Note:&lt;/strong> The &lt;code>RevealServer.framework&lt;/code> has changed. Please remember to update your projects to link to the new framework version.&lt;/p>
&lt;h3 id="support">Support&lt;/h3>
&lt;p>If you have a question, or would like to give us feedback, you can do so from within Reveal (see &amp;ldquo;Help → Submit Feedback&amp;rdquo;), or via &lt;a href="https://support.revealapp.com/hc/requests/new">our support forum&lt;/a>.&lt;/p></content:encoded></item><item><title>Introduction to Auto Layout Guides</title><link>https://revealapp.com/news/introduction-to-auto-layout-guides/</link><pubDate>Wed, 22 Feb 2017 00:00:00 +0000</pubDate><dc:creator>Vlas Voloshin</dc:creator><guid>https://revealapp.com/news/introduction-to-auto-layout-guides/</guid><description>&lt;p>New in this month&amp;rsquo;s release of Reveal is support for Auto Layout guides. Represented by the &lt;code>UILayoutGuide&lt;/code> class, layout guides have been introduced to UIKit as an efficient replacement for &amp;ldquo;dummy views&amp;rdquo;, and can be used as spacing between views or to help implement a complex layout. Built-in views like &lt;code>UIStackView&lt;/code> use &lt;code>UILayoutGuide&lt;/code> internally to implement their layout behavior, while several UIKit classes expose special guides to allow access to specific layout features.&lt;/p></description><content:encoded>&lt;p>New in this month&amp;rsquo;s release of Reveal is support for Auto Layout guides. Represented by the &lt;code>UILayoutGuide&lt;/code> class, layout guides have been introduced to UIKit as an efficient replacement for &amp;ldquo;dummy views&amp;rdquo;, and can be used as spacing between views or to help implement a complex layout. Built-in views like &lt;code>UIStackView&lt;/code> use &lt;code>UILayoutGuide&lt;/code> internally to implement their layout behavior, while several UIKit classes expose special guides to allow access to specific layout features.&lt;/p>
&lt;h2 id="uikit-support">UIKit support&lt;/h2>
&lt;p>&lt;code>UILayoutGuide&lt;/code> defines a rectangular area inside its owning view which interacts with Auto Layout, but does not provide any content. You can create layout guides manually to implement advanced constraint configurations: for example, creating equal or proportional spacing between views. &lt;code>UIStackView&lt;/code> provides similar functionality (and it&amp;rsquo;s implemented using layout guides too), but it&amp;rsquo;s great to have an efficient tool for implementing such layout manually.&lt;/p>
&lt;p>UIKit also provides focus guides (&lt;code>UIFocusGuide&lt;/code>). These can be used on tvOS to define an invisible area that redirects focus to some other view. And because they inherit all properties of layout guides, they participate in Auto Layout in the same way.&lt;/p>
&lt;p>In addition to supporting custom layout guides, UIKit also provides several &amp;ldquo;standard&amp;rdquo; guides:&lt;/p>
&lt;ul>
&lt;li>&lt;code>UIView.layoutMarginsGuide&lt;/code>: a portion of the view&amp;rsquo;s bounds inside its layout margins.&lt;/li>
&lt;li>&lt;code>UIView.readableContentGuide&lt;/code>: an area of the view which has width optimized for reading text without moving one&amp;rsquo;s head.&lt;/li>
&lt;li>&lt;code>UIViewController.topLayoutGuide&lt;/code> and &lt;code>UIViewController.bottomLayoutGuide&lt;/code>: define the highest and the lowest visible extents of the view controller&amp;rsquo;s view. &lt;a href="#the-curious-case-of-view-controllers-guides">These are not always represented by &lt;code>UILayoutGuide&lt;/code>&lt;/a>.&lt;/li>
&lt;li>&lt;code>UIImageView.focusedFrameGuide&lt;/code> (tvOS only): represents the visible frame of an image view when it&amp;rsquo;s focused.&lt;/li>
&lt;/ul>
&lt;h2 id="reveal-support">Reveal support&lt;/h2>
&lt;p>In Reveal, layout guides appear in the Outline view, the Inspectors, and the Canvas – just like views and constraints.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/introduction-to-auto-layout-guides/screenshot1.jpg">
&lt;/figure>
&lt;p>In the Outline, layout guides owned by a view are inside that view&amp;rsquo;s &amp;ldquo;Layout Guides&amp;rdquo; group. In the Canvas, layout guides are visualized as wireframes with their own unique color. Note that layout guides are rendered &amp;ldquo;hollow&amp;rdquo; in the Canvas: this reflects the fact that they don&amp;rsquo;t render any content themselves. To select a layout guide in the Canvas, click on its &lt;em>wireframe&lt;/em>.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/introduction-to-auto-layout-guides/screenshot2.jpg">
&lt;/figure>
&lt;p>Just like views, layout guides in Reveal support features such as:&lt;/p>
&lt;ul>
&lt;li>Participating constraints in the Layout inspector,&lt;/li>
&lt;li>&lt;a href="./reveal-6.html#auto-layout-errors--warnings">Layout ambiguity warnings&lt;/a>,&lt;/li>
&lt;li>&lt;a href="./reveal-6.html#improved-view-hierarchy-filtering">Advanced view hierarchy filtering&lt;/a> (by identifier and class name).&lt;/li>
&lt;/ul>
&lt;p>And just like constraints, layout guides can be hidden from the Outline view and the Canvas using the &amp;ldquo;Constraints and Guides&amp;rdquo; toggle in the bottom-left corner of the Canvas.&lt;/p>
&lt;p>Being able to inspect layout guides is useful when debugging issues in views like &lt;code>UIStackView&lt;/code> which use &lt;code>UILayoutGuide&lt;/code> to implement their internal layout. For example, if a constraint attached to a layout guide gets broken by Auto Layout, inspecting your app in Reveal will highlight that constraint with a layout error, and now, Reveal will also show which layout guide the constraint is related to, and visualize it in the Canvas.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/introduction-to-auto-layout-guides/screenshot3.jpg">
&lt;/figure>
&lt;p>Even if you don&amp;rsquo;t have any layout issues, having the information about all layout participants gives you an insight into how the layout is implemented in system-provided views. On tvOS, this also has the added benefit of being able to see the invisible focus guides that you or the system have created – and to check that their size and position match your expectations.&lt;/p>
&lt;p>You can find an example of using layout guides and focus guides – and see how Reveal visualizes them – on the new &amp;ldquo;Auto Layout Guides&amp;rdquo; page of the &lt;a href="https://github.com/revealapp/Revert">Revert project&lt;/a>.&lt;/p>
&lt;h2 id="the-curious-case-of-view-controllers-guides">The curious case of view controllers&amp;rsquo; guides&lt;/h2>
&lt;p>As mentioned above, &lt;code>UIViewController&lt;/code> provides two built-in layout guides: &lt;code>topLayoutGuide&lt;/code> and &lt;code>bottomLayoutGuide&lt;/code>. However, these are not &lt;em>always&lt;/em> &lt;code>UILayoutGuide&lt;/code> objects.&lt;/p>
&lt;p>While &lt;code>UILayoutGuide&lt;/code> appeared in iOS 9, top/bottom layout guides API was introduced back in iOS 7. Thus, the underlying implementation of these guides in iOS 7 and 8 always used hidden views with a private class &lt;code>_UILayoutGuide&lt;/code> (note the underscore). I wouldn&amp;rsquo;t be surprised to learn that &lt;code>UILayoutGuide&lt;/code> were already in the plans during that time frame, because both these properties are exposed using a special &lt;code>UILayoutSupport&lt;/code> protocol instead of having an explicit class. This was a convenient foresight, as it may have allowed UIKit engineers to seamlessly replace the implementation without changing the API.&lt;/p>
&lt;p>Even in iOS 9 and 10, the situation is still complicated. When inspecting your apps, you may find that in some cases top and bottom layout guides are now &lt;em>actual&lt;/em> layout guides (represented by a private class &lt;code>_UILayoutSpacer&lt;/code>), whereas in other situations they are still &lt;code>_UILayoutGuide&lt;/code> views. For example, view controllers decoded from a storyboard tend to use view-based implementation, while those instantiated and embedded manually usually have &lt;code>_UILayoutSpacer&lt;/code> as their top and bottom layout guides.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/introduction-to-auto-layout-guides/screenshot4.jpg">
&lt;/figure>
&lt;p>In Reveal, &lt;code>_UILayoutGuide&lt;/code> objects show up among views, but have the same icon and Canvas color as layout guides. This reflects the duality of these objects: technically, they are views (and are listed as their owners&amp;rsquo; subviews), but conceptually, they are used as guides.&lt;/p>
&lt;p>Fortunately, as API users we don&amp;rsquo;t usually have to worry about this difference: UIKit takes care of hiding this abstraction from us. But it is still important to keep in mind, &lt;a href="https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/">as per The Law of Leaky Abstractions&lt;/a>, all non-trivial abstractions, to some degree, are leaky. And when problems (like layout issues) occur, the more you know about the abstraction, the better. So next time you&amp;rsquo;re wondering how view controllers in &lt;em>your&lt;/em> app implement their layout guides, just inspect it in Reveal!&lt;/p></content:encoded></item><item><title>Introducing Layout Errors and Warnings</title><link>https://revealapp.com/news/introducing-layout-errors-and-warnings/</link><pubDate>Wed, 18 Jan 2017 00:00:00 +0000</pubDate><dc:creator>Tony Arnold</dc:creator><guid>https://revealapp.com/news/introducing-layout-errors-and-warnings/</guid><description>&lt;p>A new release of Reveal (v6) is available to all users with a current license, and as a &lt;a href="https://revealapp.com/download/">14-day trial&lt;/a>.&lt;/p>
&lt;p>We&amp;rsquo;re excited about this update! Reveal 6 introduces support for Auto Layout errors &amp;amp; warnings, improved filtering, and a decent helping of smaller features and bug fixes.&lt;/p>
&lt;p>Let&amp;rsquo;s get to it!&lt;/p>
&lt;h2 id="auto-layout-errors--warnings">Auto Layout Errors &amp;amp; Warnings&lt;/h2>
&lt;p>Reveal now highlights views that have ambiguous layout, and constraints that have been broken due to an unsatisfiable layout using warning icons in the outline view. Clicking on the warning icon jumps straight to the Layout inspector, where you can find more information about the issue.&lt;/p></description><content:encoded>&lt;p>A new release of Reveal (v6) is available to all users with a current license, and as a &lt;a href="https://revealapp.com/download/">14-day trial&lt;/a>.&lt;/p>
&lt;p>We&amp;rsquo;re excited about this update! Reveal 6 introduces support for Auto Layout errors &amp;amp; warnings, improved filtering, and a decent helping of smaller features and bug fixes.&lt;/p>
&lt;p>Let&amp;rsquo;s get to it!&lt;/p>
&lt;h2 id="auto-layout-errors--warnings">Auto Layout Errors &amp;amp; Warnings&lt;/h2>
&lt;p>Reveal now highlights views that have ambiguous layout, and constraints that have been broken due to an unsatisfiable layout using warning icons in the outline view. Clicking on the warning icon jumps straight to the Layout inspector, where you can find more information about the issue.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/introducing-layout-errors-and-warnings/ambiguous.jpg">
&lt;/figure>
&lt;p>Layout ambiguity is an Auto Layout problem where a view that&amp;rsquo;s laid out using constraints doesn&amp;rsquo;t have a fully defined position or size (or content size in case of scroll views). As a consequence, such views and their subviews might be laid out in an unexpected manner, and the layout may even change between launches of the app! If you&amp;rsquo;re using Interface Builder, ambiguity is usually caught early, but at runtime it may be caused by missing constraints, or by inequality constraints that are ambiguous. Reveal will now describe what kind of ambiguity it detects, and what dimensions are ambiguous.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/introducing-layout-errors-and-warnings/broken.jpg">
&lt;/figure>
&lt;p>If a constraint configuration cannot be fully satisfied, Auto Layout is forced to break one of the constraints so that your app continues to function (at least partially). Correct layout cannot be guaranteed by the system in such a case, and if this happens while you&amp;rsquo;re debugging your app the Debug Console log will show the dreaded &amp;ldquo;Unable to simultaneously satisfy constraints&amp;rdquo; message. Now, if you inspect your app in Reveal after receiving such message in the log, you&amp;rsquo;ll be able to see which constraints have been broken – both in the outline view and in the Participating Constraints inspector. Broken constraints are coloured red in the Canvas.&lt;/p>
&lt;h2 id="improved-view-hierarchy-filtering">Improved View Hierarchy Filtering&lt;/h2>
&lt;p>The &lt;strong>view hierarchy can now be filtered by specific view properties&lt;/strong>, such as:&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/introducing-layout-errors-and-warnings/filter-options.jpg">
&lt;/figure>
&lt;ul>
&lt;li>Class or superclass name&lt;/li>
&lt;li>Accessibility information such as the identifier, value and label&lt;/li>
&lt;li>Constraint identifier&lt;/li>
&lt;li>UIView tag&lt;/li>
&lt;li>Object memory address&lt;/li>
&lt;/ul>
&lt;p>The outline view also shows the matched property along with its value to indicate &lt;em>why&lt;/em> a view or constraint matched a particular property.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/introducing-layout-errors-and-warnings/filter.jpg">
&lt;/figure>
&lt;p>Clicking on the icon next to the filter field shows the filtering modes that you can select. You can also &lt;strong>switch to a filtering mode by typing its keyword right into the filter field!&lt;/strong> For example, to switch to the &amp;ldquo;Class Name&amp;rdquo; mode, type &lt;code>class:&lt;/code> &lt;em>and press Return&lt;/em>. You can also abbreviate all keywords, so for example &lt;code>i:&lt;/code>, &lt;code>id:&lt;/code> and &lt;code>ident:&lt;/code> are all the same as &lt;code>identifier:&lt;/code>. To switch to the default filtering mode, simply press Delete key in an empty filter field.&lt;/p>
&lt;p>Here&amp;rsquo;s a list of all available keywords:&lt;/p>
&lt;ul>
&lt;li>&lt;code>class:&lt;/code> for Class Name&lt;/li>
&lt;li>&lt;code>accessibility:&lt;/code> or &lt;code>ax:&lt;/code> for Accessibility&lt;/li>
&lt;li>&lt;code>identifier:&lt;/code> for Identifier&lt;/li>
&lt;li>&lt;code>tag:&lt;/code> for View Tag&lt;/li>
&lt;li>&lt;code>memory:&lt;/code> or &lt;code>address:&lt;/code> for Memory Address&lt;/li>
&lt;/ul>
&lt;h2 id="other-new-features">Other New Features&lt;/h2>
&lt;ul>
&lt;li>We&amp;rsquo;ve &lt;strong>added a &amp;ldquo;Reset View&amp;rdquo; button to the canvas&lt;/strong> in the lower right-hand corner. This will re-orient and reset the zoom level on the canvas so that the presented view hierarchy is centered and visible. It&amp;rsquo;s really useful when you zoom or scroll too far.&lt;/li>
&lt;li>Tooltips have been added to, or improved for many controls.&lt;/li>
&lt;/ul>
&lt;h2 id="bug-fixes">Bug Fixes&lt;/h2>
&lt;ul>
&lt;li>Fixed: Descriptions of participating constraints in the layout inspector had incorrectly formatted labels.&lt;/li>
&lt;li>Fixed: Changing selection in the outline view to an item that&amp;rsquo;s currently collapsed did not expand parent items.&lt;/li>
&lt;li>Fixed: RevealServer.framework had simulator platforms listed in its Info.plist.&lt;/li>
&lt;li>Fixed: Integration scripts will no longer copy RevealServer.framework inside an already present copy of the framework.&lt;/li>
&lt;li>Fixed: Reveal Server no longer requires the &lt;code>CFBundleName&lt;/code>, &lt;code>CFBundleVersion&lt;/code> and &lt;code>CFBundleShortVersionString&lt;/code> to be present your iOS application&amp;rsquo;s Info.plist.&lt;/li>
&lt;li>Fixed: Potential race conditions in the Reveal LLDB script commands.&lt;/li>
&lt;/ul>
&lt;h2 id="minimum-system-requirements">Minimum System Requirements&lt;/h2>
&lt;ul>
&lt;li>macOS 10.11&lt;/li>
&lt;li>iOS 8&lt;/li>
&lt;li>tvOS 9&lt;/li>
&lt;li>Xcode 7.3&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Note:&lt;/strong> The &lt;code>RevealServer.framework&lt;/code> has changed. Please remember to update your projects to link to the new framework version.&lt;/p>
&lt;h3 id="support">Support&lt;/h3>
&lt;p>If you have a question, or would like to give us feedback, you can do so from within Reveal (see &amp;ldquo;Help → Submit Feedback&amp;rdquo;), or via &lt;a href="https://support.revealapp.com/hc/requests/new">our support forum&lt;/a>.&lt;/p></content:encoded></item><item><title>Reveal LLDB Commands</title><link>https://revealapp.com/news/reveal-lldb-commands/</link><pubDate>Wed, 14 Dec 2016 00:00:00 +0000</pubDate><dc:creator>Oliver Jones</dc:creator><guid>https://revealapp.com/news/reveal-lldb-commands/</guid><description>&lt;p>With the latest release of Reveal (v5), we now provide a set of debugger commands accessible from the LLDB console (including Xcode&amp;rsquo;s &lt;strong>Debug Console&lt;/strong>). These commands allow you to easily load and control the Reveal Server framework in your current debug session with either the LLDB console command line or breakpoint commands.&lt;/p>
&lt;h2 id="installation">Installation&lt;/h2>
&lt;p>To make the Reveal Server commands available to your debugging sessions, open Reveal&amp;rsquo;s &lt;strong>Help&lt;/strong> menu and click &lt;strong>Install Debugger Commands…&lt;/strong>&lt;/p></description><content:encoded>&lt;p>With the latest release of Reveal (v5), we now provide a set of debugger commands accessible from the LLDB console (including Xcode&amp;rsquo;s &lt;strong>Debug Console&lt;/strong>). These commands allow you to easily load and control the Reveal Server framework in your current debug session with either the LLDB console command line or breakpoint commands.&lt;/p>
&lt;h2 id="installation">Installation&lt;/h2>
&lt;p>To make the Reveal Server commands available to your debugging sessions, open Reveal&amp;rsquo;s &lt;strong>Help&lt;/strong> menu and click &lt;strong>Install Debugger Commands…&lt;/strong>&lt;/p>
&lt;p>Confirming the installation will add the following lines into your &lt;code>~/.lldbinit&lt;/code> file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">### Reveal LLDB commands support - DO NOT MODIFY&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>command script &lt;span style="color:#f92672">import&lt;/span> &lt;span style="color:#f92672">/&lt;/span>Applications&lt;span style="color:#f92672">/&lt;/span>Reveal&lt;span style="color:#f92672">.&lt;/span>app&lt;span style="color:#f92672">/&lt;/span>Contents&lt;span style="color:#f92672">/&lt;/span>SharedSupport&lt;span style="color:#f92672">/&lt;/span>Scripts&lt;span style="color:#f92672">/&lt;/span>RevealServerCommands&lt;span style="color:#f92672">.&lt;/span>py
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">###&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The above snippet imports a Python script bundled with Reveal into all your debug sessions. The python script implements functionality required to load, start and stop Reveal Server in the Simulator and on device.&lt;/p>
&lt;p>Note that the command directly references your Reveal installation path — if you move Reveal to a different location, Reveal will offer to correct your &lt;code>~/.lldbinit&lt;/code> file on launch.&lt;/p>
&lt;h2 id="removal">Removal&lt;/h2>
&lt;p>To remove the Reveal Server commands from your debugger, open Reveal&amp;rsquo;s &lt;strong>Help&lt;/strong> menu again and click &lt;strong>Remove Debugger Commands…&lt;/strong> This will remove the snippet previously inserted in your &lt;code>~/.lldbinit&lt;/code> file.&lt;/p>
&lt;h2 id="available-commands">Available commands&lt;/h2>
&lt;p>The easiest way to take advantage of the Reveal Server debugger commands is to follow the instructions in our &lt;a href="https://support.revealapp.com/hc/en-us/articles/360022477972">breakpoint-based integration guide&lt;/a>.&lt;/p>
&lt;p>The following commands are exposed to the LLDB console command line, allowing you to control the Reveal Server during debugging:&lt;/p>
&lt;h3 id="reveal-load">&lt;code>reveal load&lt;/code>&lt;/h3>
&lt;p>Loads the Reveal Server framework in the current debug session. If you&amp;rsquo;re debugging in the iOS or tvOS Simulator, this command will use the framework bundled with Reveal directly. When debugging on device, the command will look for &lt;code>RevealServer.framework&lt;/code> package in your app&amp;rsquo;s resources. If you&amp;rsquo;ve followed the instructions in the &lt;strong>Debugging on device&lt;/strong> section of the &lt;a href="https://support.revealapp.com/hc/en-us/articles/360022477972">integration guide&lt;/a>, your app will already contain that resource.&lt;/p>
&lt;p>To start Reveal Server automatically after loading it, use the &lt;code>--autostart&lt;/code> (or &lt;code>-a&lt;/code>) flag, e.g. &lt;code>reveal load --autostart&lt;/code>.&lt;/p>
&lt;h3 id="reveal-start">&lt;code>reveal start&lt;/code>&lt;/h3>
&lt;p>Starts Reveal Server. Normally this happens automatically if the Server is loaded during application startup (e.g. in &lt;code>UIApplicationMain&lt;/code> breakpoint), and also every time your app becomes active. However, if you would like to load and control Reveal Server manually, you can use this command to start it easily after you load it using &lt;code>reveal load&lt;/code> command or by other means.&lt;/p>
&lt;h3 id="reveal-stop">&lt;code>reveal stop&lt;/code>&lt;/h3>
&lt;p>Stops Reveal Server, if it was previously started. You can restart it later using &lt;code>reveal start&lt;/code> command.&lt;/p>
&lt;h3 id="reveal-status">&lt;code>reveal status&lt;/code>&lt;/h3>
&lt;p>Prints the current status of Reveal Server — whether it&amp;rsquo;s loaded and running, and also its protocol version.&lt;/p>
&lt;h2 id="getting-help">Getting Help&lt;/h2>
&lt;p>If you have any problems, questions or feedback about using Reveal Server LLDB commands with your app, &lt;a href="http://support.revealapp.com">head over to our support site&lt;/a> and let us know.&lt;/p></content:encoded></item><item><title>Improved Debugger Integration and More</title><link>https://revealapp.com/news/improved-debugger-integration-and-more/</link><pubDate>Wed, 14 Dec 2016 00:00:00 +0000</pubDate><dc:creator>Oliver Jones</dc:creator><guid>https://revealapp.com/news/improved-debugger-integration-and-more/</guid><description>&lt;p>A new release of Reveal (v5) is available to all users with a current license, and as a &lt;a href="https://revealapp.com/download/">14-day trial&lt;/a>.&lt;/p>
&lt;p>This release brings &lt;strong>improved debugger integration&lt;/strong> and a smattering of &lt;strong>new features&lt;/strong>, &lt;strong>bug fixes&lt;/strong> and &lt;strong>performance improvements&lt;/strong>.&lt;/p>
&lt;h2 id="improved-debugger-integration">Improved Debugger Integration&lt;/h2>
&lt;p>Reveal now has tighter integration with the LLDB debugger. This makes using the breakpoint-based Reveal Server injection method easier and gives developers Reveal-oriented commands to use in LLDB&amp;rsquo;s debug console. See the associated &lt;a href="https://revealapp.com/news/reveal-lldb-commands">blog post for more details&lt;/a>.&lt;/p></description><content:encoded>&lt;p>A new release of Reveal (v5) is available to all users with a current license, and as a &lt;a href="https://revealapp.com/download/">14-day trial&lt;/a>.&lt;/p>
&lt;p>This release brings &lt;strong>improved debugger integration&lt;/strong> and a smattering of &lt;strong>new features&lt;/strong>, &lt;strong>bug fixes&lt;/strong> and &lt;strong>performance improvements&lt;/strong>.&lt;/p>
&lt;h2 id="improved-debugger-integration">Improved Debugger Integration&lt;/h2>
&lt;p>Reveal now has tighter integration with the LLDB debugger. This makes using the breakpoint-based Reveal Server injection method easier and gives developers Reveal-oriented commands to use in LLDB&amp;rsquo;s debug console. See the associated &lt;a href="https://revealapp.com/news/reveal-lldb-commands">blog post for more details&lt;/a>.&lt;/p>
&lt;h3 id="new-features">New Features&lt;/h3>
&lt;ul>
&lt;li>Using Force Click on a view in the canvas will now focus on that view hierarchy sub-tree.&lt;/li>
&lt;li>A new &lt;code>IBARevealServerDisableAutoStart&lt;/code> user default that can be specified at iOS application start up to stop the Reveal Server from automatically starting. See &lt;a href="https://support.revealapp.com/hc/en-us/articles/360022668551">RevealServer Configuration Options&lt;/a> documentation for more details.&lt;/li>
&lt;/ul>
&lt;h3 id="performance-improvements">Performance Improvements&lt;/h3>
&lt;p>A handful of performance improvements were made in this release. In particular Reveal now prefers to use OpenGL over Metal on Intel GPUs on macOS Sierra (due to bugs with Metal on Sierra).&lt;/p>
&lt;h3 id="bugs-fixed">Bugs Fixed&lt;/h3>
&lt;ul>
&lt;li>Fixed: Crashes when interacting with the view hierarchy/focus history path during refresh.&lt;/li>
&lt;li>Fixed: Issues with the representation and serialisation of very large, very small, or out of bounds numeric values (NaN, Infinity, etc).&lt;/li>
&lt;li>Fixed: &lt;code>UIView semanticContentAttribute&lt;/code> inspector was showing incorrect values.&lt;/li>
&lt;li>Fixed: Restoring a machine image from a Time Machine backup could lead to Reveal showing inaccurate activation dialogs.&lt;/li>
&lt;li>Fixed: Reveal now recognises Reveal 1.x &lt;code>RevealLicense&lt;/code> files and offers upgrade advice.&lt;/li>
&lt;li>Fixed: Colours on Macs with wide gamut (P3) displays were not displayed correctly.&lt;/li>
&lt;/ul>
&lt;h3 id="minimum-system-requirements">Minimum System Requirements&lt;/h3>
&lt;ul>
&lt;li>macOS 10.11&lt;/li>
&lt;li>iOS 8&lt;/li>
&lt;li>tvOS 9&lt;/li>
&lt;li>Xcode 7.3&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Note:&lt;/strong> The &lt;code>RevealServer.framework&lt;/code> has changed. Please remember to update your projects to link to the new framework version.&lt;/p>
&lt;h3 id="support">Support&lt;/h3>
&lt;p>Please report any problems you experience or give us feedback from within Reveal (see &amp;ldquo;Help → Submit Feedback&amp;rdquo;), or via &lt;a href="https://support.revealapp.com/hc/requests/new">our support site&lt;/a>.&lt;/p></content:encoded></item><item><title>Taking Revert to tvOS</title><link>https://revealapp.com/news/taking-revert-to-tvos/</link><pubDate>Thu, 13 Oct 2016 00:00:00 +0000</pubDate><dc:creator>Brunno Ferreira</dc:creator><guid>https://revealapp.com/news/taking-revert-to-tvos/</guid><description>&lt;p>To make sure we take support for tvOS on &lt;a href="http://revealapp.com">Reveal&lt;/a> even further, we recently updated &lt;a href="https://github.com/revealapp/Revert">Revert&lt;/a>, adding compatibility with this new Apple platform.&lt;/p>
&lt;p>As explained on &lt;a href="https://revealapp.com/news/announcing-revert">the Reveal.app blog&lt;/a>, Revert is an open source project that comprises a series of common and edge case scenarios that help us optimize &lt;a href="http://revealapp.com">Reveal&lt;/a> and ensure its quality with every update, making sure there are no regressions being introduced.&lt;/p>
&lt;p>Coming from the iOS and macOS worlds, here’s what we learned from working with tvOS:&lt;/p></description><content:encoded>&lt;p>To make sure we take support for tvOS on &lt;a href="http://revealapp.com">Reveal&lt;/a> even further, we recently updated &lt;a href="https://github.com/revealapp/Revert">Revert&lt;/a>, adding compatibility with this new Apple platform.&lt;/p>
&lt;p>As explained on &lt;a href="https://revealapp.com/news/announcing-revert">the Reveal.app blog&lt;/a>, Revert is an open source project that comprises a series of common and edge case scenarios that help us optimize &lt;a href="http://revealapp.com">Reveal&lt;/a> and ensure its quality with every update, making sure there are no regressions being introduced.&lt;/p>
&lt;p>Coming from the iOS and macOS worlds, here’s what we learned from working with tvOS:&lt;/p>
&lt;h3 id="focus-engine">Focus Engine&lt;/h3>
&lt;p>This is probably the most noticeable change when starting tvOS development. Interface elements aren’t meant to be pointed at with a mouse or touched with your fingers, but are instead focused on a TV across the room according to movements on a touch surface on the Siri Remote.&lt;/p>
&lt;p>Focusing a view brings it forward, making it more prominent. Only a single object can be focused at a time. Previously, the only focusable objects were views, but &lt;a href="https://developer.apple.com/library/prerelease/content/releasenotes/General/WhatsNewinTVOS/Articles/tvOS10.html#//apple_ref/doc/uid/TP40017259-SW1">support for this has been extended to non-view items on tvOS 10&lt;/a>.&lt;/p>
&lt;p>So just like you would use the arrow keys on your computer keyboard to move selection between different files or folders, you now bring a button into focus on your TV and make it the frontmost element. In both cases, you know that that’s the item you will be interacting with when proceeding with the default selection action — be it a key press or a tap on the Siri Remote.&lt;/p>
&lt;figure class="screenshot">&lt;img src="https://revealapp.com/news/taking-revert-to-tvos/sprite-kit-example.jpeg"
alt="Yes, please do check out the SpriteKit example!">&lt;figcaption>
&lt;p>Yes, please do check out the SpriteKit example!&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>When using most of the controls available on tvOS you get that behavior for free, since they come with sensible defaults that make the focus engine change their appearance automatically. But that is not the same when using standard UICollectionViewCells.&lt;/p>
&lt;p>So, let’s say you are a very attentive iOS developer and noticed most of the apps on the TV have UIs that resemble collection views. That seems like a good starting point, right? Thus, you quickly set up a project with a simple collection view and default cells to start playing with the OS and nothing gets focused.&lt;/p>
&lt;p>It turns out that is the expected behavior, since collection view cells are composed of ordinary views. You need to use the &lt;a href="https://developer.apple.com/library/tvos/documentation/UIKit/Reference/UICollectionViewDelegate_protocol/index.html">collection view delegate&lt;/a> to update the look of each cell when adding or removing focus. Or, as an easy way around that, design your cells using UIImageViews. By default, they will animate their images in and out of focus when placed as subviews of focusable elements.&lt;/p>
&lt;p>If you’d like to get more technical details about the focus engine and what is possible, the Airbnb developers have some great material &lt;a href="http://nerds.airbnb.com/tvos-focus-engine/">here&lt;/a>.&lt;/p>
&lt;h3 id="sideways-not-downwardsupwards">Sideways, not Downwards/Upwards&lt;/h3>
&lt;p>&lt;a href="undefined">Michael Flarup&lt;/a> said it best on &lt;a href="https://medium.com/@flarup/designing-for-the-apple-tv-5992c3aab1e4#.93ybrn3sy">Designing for the Apple TV&lt;/a>: the natural interaction on tvOS is moving the selection around elements — as opposed to smartphone touch screens where entire views get scrolled.&lt;/p>
&lt;p>When more content needs to come up or down as a result of a vertical gesture, the whole interface might need to get redrawn, which means the user could potentially get disoriented for a moment while trying to get acquainted with the changes on the screen. Horizontal gestures, on the other hand, usually require redrawing just the related elements that sit side by side.&lt;/p>
&lt;p>Based on that approach, we built Revert based on a split view with categories on the master view and test scenarios on the detail view. Scrolling up and down on the list to the left refreshes all the entries to the right — but browsing a single category to the right does not change anything else on the screen. Additionally we need to test tvOS split views with Reveal.&lt;/p>
&lt;figure class="screenshot">&lt;img src="https://revealapp.com/news/taking-revert-to-tvos/master-detail.jpeg"
alt="Vertical scrolling on the master view refreshes the whole detail view">&lt;figcaption>
&lt;p>Vertical scrolling on the master view refreshes the whole detail view&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;h3 id="remote-coordinates-system">Remote Coordinates System&lt;/h3>
&lt;p>The Siri Remote (as well as game controllers connected to the Apple TV) can handle touches in windowing mode or interpret their absolute values.&lt;/p>
&lt;p>To read absolute touch points (where exactly the user touched on the touch surface) we need to use the GCMicroGamepad profile, signaling that the remote will be used as a game controller. Otherwise tvOS defaults to windowing mode, like what happens on the SpriteKit example in Revert.&lt;/p>
&lt;p>When using windowing, initial touches on the Siri Remote are always considered the origin (0, 0). So it does not really matter if the gesture starts on the bottom left corner or on the top right corner of the touch surface on the remote. We just start reading finger movement from there.&lt;/p>
&lt;p>Unlike on iOS, where the user directly manipulates the interface, on tvOS the user interacts with the Siri Remote — which is one level removed from the interface on screen. This means the user is likely not facing the interaction controls, and thus the concept of the initial touch being “flexible” and gestures starting from there becomes fundamental for building a good user experience.&lt;/p>
&lt;h3 id="missing-controls-and-frameworks">Missing Controls and Frameworks&lt;/h3>
&lt;p>Everyone has been making quite a fuss about the absence of UIWebView (or WKWebView) and the Safari View Controller, but there’s more stuff from iOS that didn’t make it to tvOS, like UIToolbars, UIPickerViews, UISliders and UISteppers. MapKit was also absent at launch, but was subsequently included in tvOS 9.2 and is already a part of Revert — check it out to see where all of us here at Itty Bitty Apps come from.&lt;/p>
&lt;figure class="screenshot">&lt;img src="https://revealapp.com/news/taking-revert-to-tvos/mapkit.png"
alt="That’s us!">&lt;figcaption>
&lt;p>That’s us!&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>&lt;a href="https://developer.apple.com/library/tvos/releasenotes/General/tvOS90APIDiffs/index.html">Many frameworks are not included in tvOS&lt;/a>, although many of them do not make much sense anyway because the Apple TV lacks the hardware required.&lt;/p>
&lt;p>So if you plan on porting an iOS app to tvOS, it is worth checking if all the components you require are either available or can be replicated in some fashion. As an example, Apple implements the language selector in the Settings app (a common use for pickers) as a UIAlertController with many options.&lt;/p>
&lt;figure class="screenshot">&lt;img src="https://revealapp.com/news/taking-revert-to-tvos/revealed-language-selector.png"
alt="Language selector in tvOS 9.2 inspected on Reveal: UIAlertController with many, many options">&lt;figcaption>
&lt;p>Language selector in tvOS 9.2 inspected on Reveal: UIAlertController with many, many options&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;h3 id="reuse-code-not-storyboards">Reuse Code, Not Storyboards&lt;/h3>
&lt;p>If you’re porting an iOS app to tvOS and have got at least a few non-trivial views, this is probably one of the biggest pain points in your endeavor. Storyboards are not interchangeable, and you can’t even copy and paste specific elements between the platforms.&lt;/p>
&lt;p>After screaming, crying and flipping a few tables, it is hard not to agree at least in part with that decision though. Since not all the controls from iOS are available on tvOS, it makes sense to have storyboards specific to each platform.&lt;/p>
&lt;h3 id="local-storage">Local Storage&lt;/h3>
&lt;p>Most people will say there is no local storage for a tvOS app, but that is not really the case. Here’s what Apple says about it:&lt;/p>
&lt;blockquote>
&lt;p>(…) your app can only access 500 KB of persistent storage that is local to the device (using the NSUserDefaults class).&lt;/p>&lt;/blockquote>
&lt;p>So there is local storage available, but it is limited to what can be done with the NSUserDefaults class. If your needs go beyond that, then saying there is no local storage is accurate.&lt;/p>
&lt;p>And in that case, doing it online is the only way to go. Be it CloudKit or any other cloud service.&lt;/p>
&lt;h3 id="binary-size">Binary Size&lt;/h3>
&lt;p>There’s also a limit on app binaries. They can’t go over 200 MB, which means using the on-demand resources API &lt;a href="https://developer.apple.com/videos/play/wwdc2015/214/">introduced on iOS 9&lt;/a> for anything that can’t get bundled in the app.&lt;/p>
&lt;p>Since, as mentioned previously, there’s no local storage for anything other than NSUserDefaults, this also means you might need to keep fetching assets every time the app is run. Apple makes this clear:&lt;/p>
&lt;blockquote>
&lt;p>The maximum size of an Apple TV app is limited to 200 MB. (…) all other data must be purgeable by the operating system when space is low.&lt;/p>&lt;/blockquote>
&lt;h3 id="top-shelf">Top Shelf&lt;/h3>
&lt;p>Apps placed on the top row on tvOS can take advantage of the &lt;a href="https://developer.apple.com/tvos/human-interface-guidelines/#top-shelf">top shelf&lt;/a> — a TV Extensions Service that allows exposing contents of the app on the home screen.&lt;/p>
&lt;p>Content presented on the top shelf is a combination of a static banner used as the background and dynamic items that can be interacted with by users. You have no control over where your app icon is placed on the user’s home screen, so every app has to be prepared for being placed on the top row:&lt;/p>
&lt;blockquote>
&lt;p>At a minimum, every app must supply a single, static top shelf image that can be displayed when your app is in the top row of the Home screen and in focus.&lt;/p>&lt;/blockquote>
&lt;figure class="screenshot">&lt;img src="https://revealapp.com/news/taking-revert-to-tvos/top-shelf.jpeg"
alt="Top shelf is an effective way to bring attention to your app.">&lt;figcaption>
&lt;p>Top shelf is an effective way to bring attention to your app.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;h3 id="overscan">&lt;strong>Overscan&lt;/strong>&lt;/h3>
&lt;p>Last, but definitely not least, there’s &lt;a href="https://en.wikipedia.org/wiki/Overscan">overscan&lt;/a>. This can be a gigantic issue if not considered initially or, even worse, completely neglected.&lt;/p>
&lt;p>Surprisingly, there hasn’t been much mention of overscan when people talk about tvOS. But the truth is, there should be. iOS and macOS developers are used to knowing where their apps are going to be run and how that hardware behaves. That simply isn’t the case with tvOS.&lt;/p>
&lt;p>Although Apple TVs may work the same and only differ in storage capacity, there is no way of telling what kind of TVs will be displaying your app. Some may have overscan enabled, some may not. Some may allow disabling overscan, some may not. And having overscan enabled means you should not be using the whole screen estate do draw your app. Never place important content too close to the edges.&lt;/p>
&lt;p>If you are coming from the game console world, it may be natural to consider the &lt;a href="https://en.wikipedia.org/wiki/Safe_area_(television)">TV Safe Area&lt;/a> when thinking about your visual design. But as iOS developers, we don’t expect our layout to be simply clipped at the edges of the display.&lt;/p>
&lt;p>Different TVs have different levels of overscan — so testing your app in a few models might not be enough, and there’s currently no way for tvOS to query them for the amount of overscan being used. So the safest route you can go is using industry standards to account for that. &lt;a href="https://developer.apple.com/tvos/human-interface-guidelines/visual-design/">Apple recommends placing your layout in a box that sits 90 pixels from side edges and 60 pixels from top and bottom edges&lt;/a>.&lt;/p>
&lt;p>&lt;em>So if we were only allowed to take one lesson from the whole project, this would probably be it: account for overscan, and do so right at the beginning.&lt;/em> It won’t be fun gathering everyone around to show your fresh new app only to find out the aggressive overscan on the TV breaks your layout. It also won’t be fun refactoring a potentially massive storyboard, if you went with that option.&lt;/p>
&lt;figure class="screenshot">&lt;img src="https://revealapp.com/news/taking-revert-to-tvos/overscan-is-bad.jpeg"
alt="How Revert could look without thinking about overscan, ouch!">&lt;figcaption>
&lt;p>How Revert could look without thinking about overscan, ouch!&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>&lt;em>As mentioned in the beginning of this post, Revert helps us optimize and improve Reveal in every update. So if you are a Reveal user (thanks! 🎉) and find yourself with an example that doesn’t work quite right, please &lt;a href="https://github.com/revealapp/Revert">fork Revert on GitHub&lt;/a> and submit us a pull request with your edge case so we can make Reveal even more useful to you in the future!&lt;/em>&lt;/p></content:encoded></item><item><title>Reveal 2</title><link>https://revealapp.com/news/reveal-2/</link><pubDate>Tue, 13 Sep 2016 00:00:00 +0000</pubDate><dc:creator>Sean Woodhouse</dc:creator><guid>https://revealapp.com/news/reveal-2/</guid><description>&lt;p>Today we&amp;rsquo;re thrilled to announce the release of Reveal 2. This release delivers a host of new features and an all-new design that make Reveal even more powerful and easy to use. Here&amp;rsquo;s a summary of some of the major new features.&lt;/p>
&lt;h2 id="usb-connection-support">USB connection support&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal-2/reveal_front_usb.jpg">
&lt;/figure>
&lt;p>Ever need to inspect an app on device in a corporate environment but the networks are locked down and Bonjour doesn&amp;rsquo;t work? We have, and it&amp;rsquo;s a pain. Reveal will now discover applications running on devices connected by USB, making inspection easier and more reliable.&lt;/p></description><content:encoded>&lt;p>Today we&amp;rsquo;re thrilled to announce the release of Reveal 2. This release delivers a host of new features and an all-new design that make Reveal even more powerful and easy to use. Here&amp;rsquo;s a summary of some of the major new features.&lt;/p>
&lt;h2 id="usb-connection-support">USB connection support&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal-2/reveal_front_usb.jpg">
&lt;/figure>
&lt;p>Ever need to inspect an app on device in a corporate environment but the networks are locked down and Bonjour doesn&amp;rsquo;t work? We have, and it&amp;rsquo;s a pain. Reveal will now discover applications running on devices connected by USB, making inspection easier and more reliable.&lt;/p>
&lt;h2 id="inspect-app-extensions">Inspect app extensions&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal-2/reveal_front_extensions.jpg">
&lt;/figure>
&lt;p>Inspect messages extensions, notification extensions, custom keyboard extensions, today extensions and many more. With Reveal you can inspect and debug issues that even Xcode can&amp;rsquo;t see.&lt;/p>
&lt;h2 id="filtering">Filtering&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal-2/reveal_front_filtering.jpg">
&lt;/figure>
&lt;p>Reveal now allows you to filter views and constraints by name and memory address making it even easier to find and fix problems in your view hierarchy.&lt;/p>
&lt;h2 id="all-new-design">All-new design&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal-2/reveal_front_design.jpg">
&lt;/figure>
&lt;p>We&amp;rsquo;ve streamlined the interface, made the inspectors more compact, and polished every nook and cranny of the app. Navigate faster and see more information at a glance with a more refined experience.&lt;/p>
&lt;h2 id="versioning-and-licensing">Versioning and Licensing&lt;/h2>
&lt;p>With this release we&amp;rsquo;re changing the way Reveal is versioned and licensed. We&amp;rsquo;re switching to a model where we release features as they are ready rather than holding them back for major paid upgrades. We&amp;rsquo;re also moving to a simpler version strategy. This release is version 2, the next will be version 3, and so on.&lt;/p>
&lt;p>Licenses now include a year of updates, after which you can continue to use the last version of Reveal released within those 12 months. To continue to receive updates after the included 12 months, you will need to renew your license.&lt;/p>
&lt;p>For more information and an FAQ on these changes to our licensing please &lt;!-- raw HTML omitted -->visit the Reveal Purchase Page&lt;!-- raw HTML omitted -->.&lt;/p>
&lt;h2 id="upgrades--pricing">Upgrades &amp;amp; Pricing&lt;/h2>
&lt;p>Instead of offering upgrade pricing for Reveal 2 &lt;strong>we have lowered the price for all new and existing users. Personal licenses are now USD$59 (down from $89) and Commercial Seat licenses are USD$119 (down from USD$179).&lt;/strong>&lt;/p>
&lt;p>Customers who bought Reveal on or after 9th June 2016 will receive a free Reveal 2 license. We will be in contact with these customers shortly with more information.&lt;/p>
&lt;p>For information on educational discounts, site and enterprise licenses, please &lt;a href="mailto:sales@revealapp.com">contact Reveal Sales&lt;/a>.&lt;/p>
&lt;h2 id="how-to-get-it">How to get it&lt;/h2>
&lt;p>You can &lt;!-- raw HTML omitted -->download Reveal 2&lt;!-- raw HTML omitted --> directly from our web site.&lt;/p>
&lt;h2 id="feedback">Feedback&lt;/h2>
&lt;p>If you have any questions or would like to provide feedback, please &lt;a href="http://support.revealapp.com">head over to our support site&lt;/a> and leave a comment.&lt;/p></content:encoded></item><item><title>Announcing Revert</title><link>https://revealapp.com/news/announcing-revert/</link><pubDate>Thu, 19 Nov 2015 00:00:00 +0000</pubDate><dc:creator>Tony Arnold</dc:creator><guid>https://revealapp.com/news/announcing-revert/</guid><description>&lt;figure>&lt;img src="https://revealapp.com/news/announcing-revert/icon.jpg">
&lt;/figure>
&lt;p>Revert (REVEal Rendering Test) is an iOS project we&amp;rsquo;ve built to help test the performance and accuracy of &lt;a href="https://revealapp.com/">Reveal&lt;/a>, our runtime view hierarchy inspection tool. It contains a number of examples which highlight both common and edge case scenarios, and helps us to ensure that we don&amp;rsquo;t regress or introduce rendering and serialization bugs when updating Reveal.&lt;/p>
&lt;p>We&amp;rsquo;re releasing Revert so that:&lt;/p>
&lt;ol>
&lt;li>The community can compare the features and accuracy of the various view debuggers on the market using a simple, attractive example.&lt;/li>
&lt;li>The developers of other view debuggers on the market have access to a standard reference suite of tests to check the accuracy of their own products.&lt;/li>
&lt;/ol>
&lt;p>&lt;a href="http://github.com/revealapp/Revert/">Get it now from GitHub&lt;/a>.&lt;/p></description><content:encoded>&lt;figure>&lt;img src="https://revealapp.com/news/announcing-revert/icon.jpg">
&lt;/figure>
&lt;p>Revert (REVEal Rendering Test) is an iOS project we&amp;rsquo;ve built to help test the performance and accuracy of &lt;a href="https://revealapp.com/">Reveal&lt;/a>, our runtime view hierarchy inspection tool. It contains a number of examples which highlight both common and edge case scenarios, and helps us to ensure that we don&amp;rsquo;t regress or introduce rendering and serialization bugs when updating Reveal.&lt;/p>
&lt;p>We&amp;rsquo;re releasing Revert so that:&lt;/p>
&lt;ol>
&lt;li>The community can compare the features and accuracy of the various view debuggers on the market using a simple, attractive example.&lt;/li>
&lt;li>The developers of other view debuggers on the market have access to a standard reference suite of tests to check the accuracy of their own products.&lt;/li>
&lt;/ol>
&lt;p>&lt;a href="http://github.com/revealapp/Revert/">Get it now from GitHub&lt;/a>.&lt;/p>
&lt;h2 id="accuracy-as-a-goal">Accuracy as a goal&lt;/h2>
&lt;p>Reveal communicates with a small HTTP server embedded in your iOS application to retrieve information about the view hierarchy at runtime. This information includes the structure of the view hierarchy, bitmaps that represent those views and all properties of the views. Once retrieved, Reveal presents the information hierarchically in an outline view, as well as graphically on a central canvas.&lt;/p>
&lt;p>The way in which Reveal interprets this information visually is critically important for users who rely on our app to present an accurate reflection of their application&amp;rsquo;s state. We go to great lengths to ensure that Reveal renders as accurately as possible, and this focus on accuracy has influenced our approach in a number of areas.&lt;/p>
&lt;p>The canvas in Reveal takes one of two divergent rendering paths to ensure that what you see in Reveal reflects what you see in your app:&lt;/p>
&lt;ul>
&lt;li>The 3D canvas mode approximates how the iOS runtime lays out views.&lt;/li>
&lt;li>The 2D canvas mode grabs a composited screenshot of the inspected component directly from the iOS runtime, rather than approximating how things might be laid out.&lt;/li>
&lt;/ul>
&lt;p>The end result is that what you see on screen in Reveal is much more accurate to what&amp;rsquo;s actually visible on your device or simulator.&lt;/p>
&lt;h2 id="examples">Examples&lt;/h2>
&lt;p>Using Revert&amp;rsquo;s test suite as an example, it&amp;rsquo;s pretty easy to see how much more accurate Reveal is than the Xcode view debugger:&lt;/p>
&lt;h3 id="mapkit">MapKit&lt;/h3>
&lt;figure>&lt;img src="https://revealapp.com/news/announcing-revert/comparison1.jpg">
&lt;/figure>
&lt;p>&lt;code>MKMapView&lt;/code> displays the origin of Itty Bitty Apps employees. All the annotations are linked together by an &lt;code>MKPolygon&lt;/code>.&lt;/p>
&lt;h3 id="transformed-views">Transformed Views&lt;/h3>
&lt;figure>&lt;img src="https://revealapp.com/news/announcing-revert/comparison2.jpg">
&lt;/figure>
&lt;p>A selection of transformed views with embedded subviews showing both the transformed and identity (non-transformed) positions:&lt;/p>
&lt;ul>
&lt;li>Translate: A view that has been translated (-20, 20).&lt;/li>
&lt;li>Rotate: A view that has been rotated 15°.&lt;/li>
&lt;li>Scale: A view that has been scaled by 50%.&lt;/li>
&lt;/ul>
&lt;p>The behaviour when mixing constraints and transforms changed between iOS 7 and 8. We published a breakdown of these changes in a &lt;a href="https://revealapp.com/news/constraints-and-transforms">previous blog post&lt;/a>.&lt;/p>
&lt;h3 id="bounds-and-anchor-point-changes">Bounds and Anchor Point Changes&lt;/h3>
&lt;figure>&lt;img src="https://revealapp.com/news/announcing-revert/comparison3.jpg">
&lt;/figure>
&lt;p>Shows the effects of bounds and anchor point changes.&lt;/p>
&lt;hr>
&lt;p>Reveal&amp;rsquo;s accuracy is the result of a huge amount of development work. The examples above present a few specific scenarios that highlight the care we take, and the level of detail we pursue when developing Reveal.&lt;/p>
&lt;h2 id="downloading-revert">Downloading Revert&lt;/h2>
&lt;p>We&amp;rsquo;ve made Revert &lt;a href="http://github.com/revealapp/Revert/">available on GitHub&lt;/a> under a &lt;!-- raw HTML omitted -->BSD 3-Clause License&lt;!-- raw HTML omitted -->.&lt;/p>
&lt;p>We&amp;rsquo;ve tried to include as many scenarios as possible, but if you&amp;rsquo;d like to add your own or suggest one that should be supported, please feel free to &lt;a href="http://github.com/revealapp/Revert/pulls/">create a pull request&lt;/a> or &lt;a href="https://support.revealapp.com/">contact us directly via our online support&lt;/a>.&lt;/p></content:encoded></item><item><title>Reveal 1.6.2</title><link>https://revealapp.com/news/reveal-1.6.2/</link><pubDate>Thu, 05 Nov 2015 00:00:00 +0000</pubDate><dc:creator>Barry Scott</dc:creator><guid>https://revealapp.com/news/reveal-1.6.2/</guid><description>&lt;p>Last week Apple shipped the new Apple TV to the public. Like everyone else we were excited to get our hands on it, because, you guessed it - we ​&lt;em>love&lt;/em>​ Crossy Road. Seriously though, we’re keen to show off what we actually ​_have_​ been doing with the new Apple TV, and that is using Reveal to inspect tvOS apps. Version 1.6.2 of Reveal which you can ​&lt;a href="https://revealapp.com/download/#direct">download now&lt;/a>​, will let you pull apart your widescreen view hierarchy on both device and simulator.&lt;/p></description><content:encoded>&lt;p>Last week Apple shipped the new Apple TV to the public. Like everyone else we were excited to get our hands on it, because, you guessed it - we ​&lt;em>love&lt;/em>​ Crossy Road. Seriously though, we’re keen to show off what we actually ​_have_​ been doing with the new Apple TV, and that is using Reveal to inspect tvOS apps. Version 1.6.2 of Reveal which you can ​&lt;a href="https://revealapp.com/download/#direct">download now&lt;/a>​, will let you pull apart your widescreen view hierarchy on both device and simulator.&lt;/p>
&lt;p>&lt;a href="https://revealapp.com/news/reveal-1-6-0">Find out all about the great new features in Reveal 1.6 here&lt;/a>&lt;/p>
&lt;h2 id="whats-new-in-162">What&amp;rsquo;s new in 1.6.2?&lt;/h2>
&lt;ul>
&lt;li>A new tvOS specific framework has been added to allow inspection of tvOS projects both in the simulator and on an Apple TV device.&lt;/li>
&lt;li>A new podspec has been created for the tvOS library. Add &amp;ldquo;Reveal-tvOS-SDK&amp;rdquo; to your Podfile and run pod update to include it in your project.&lt;/li>
&lt;li>The integration guide has been updated to show how to add the tvOS library.&lt;/li>
&lt;/ul>
&lt;h2 id="how-to-get-it">How to get it&lt;/h2>
&lt;p>You can download Reveal 1.6.2 directly from our web site &lt;a href="https://revealapp.com/download/#direct">here&lt;/a>. If you already have a previous version of Reveal installed you can update it by selecting &amp;lsquo;Check for Updates&amp;hellip;&amp;rsquo; from the Reveal menu.&lt;/p>
&lt;h2 id="feedback">Feedback&lt;/h2>
&lt;p>If you have any questions or would like to provide feedback, please head over to &lt;a href="http://support.revealapp.com">our support site&lt;/a> and leave a comment.&lt;/p></content:encoded></item><item><title>Inspecting watchOS</title><link>https://revealapp.com/news/inspecting-watchos/</link><pubDate>Wed, 04 Nov 2015 00:00:00 +0000</pubDate><dc:creator>Vlas Voloshin</dc:creator><guid>https://revealapp.com/news/inspecting-watchos/</guid><description>&lt;p>Greetings, Apple Watch tinkerers! Today we&amp;rsquo;ll cover the ways you can use Reveal to take a peek inside apps running on watchOS 2 – made by you or Apple – and see how they &lt;em>tick&lt;/em>.&lt;/p>
&lt;p>Let&amp;rsquo;s quickly review the moving parts of a WatchKit app:&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/inspecting-watchos/watchkit_architecture.jpg">
&lt;/figure>
&lt;ul>
&lt;li>WatchKit Extension contains code that developers write and debug.&lt;/li>
&lt;li>Watch App is a wrapper that contains the Extension and most of the resources used to construct the UI, like Storyboards and graphical assets. It also contains code that communicates with the Extension and renders the app&amp;rsquo;s UI as a UIKit view hierarchy.&lt;/li>
&lt;/ul>
&lt;p>As of watchOS 2, these two parts run in separate sandboxes right on the watch, but developers still have no control over the Watch App counterpart. This makes it difficult to inspect an application’s user interface, since the extension doesn&amp;rsquo;t manipulate the objects rendered on screen directly. WatchKit applications don’t “own” their UI in the way iOS apps do, instead they use &lt;code>WKInterfaceObject&lt;/code> instances, which provide a &amp;ldquo;write-only&amp;rdquo; proxy interface. Due to sandboxing, it&amp;rsquo;s currently impossible to inspect an app that&amp;rsquo;s running on device without jailbreaking or performing other modifications. Today we will focus on inspecting apps running in the watchOS simulator.&lt;/p></description><content:encoded>&lt;p>Greetings, Apple Watch tinkerers! Today we&amp;rsquo;ll cover the ways you can use Reveal to take a peek inside apps running on watchOS 2 – made by you or Apple – and see how they &lt;em>tick&lt;/em>.&lt;/p>
&lt;p>Let&amp;rsquo;s quickly review the moving parts of a WatchKit app:&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/inspecting-watchos/watchkit_architecture.jpg">
&lt;/figure>
&lt;ul>
&lt;li>WatchKit Extension contains code that developers write and debug.&lt;/li>
&lt;li>Watch App is a wrapper that contains the Extension and most of the resources used to construct the UI, like Storyboards and graphical assets. It also contains code that communicates with the Extension and renders the app&amp;rsquo;s UI as a UIKit view hierarchy.&lt;/li>
&lt;/ul>
&lt;p>As of watchOS 2, these two parts run in separate sandboxes right on the watch, but developers still have no control over the Watch App counterpart. This makes it difficult to inspect an application’s user interface, since the extension doesn&amp;rsquo;t manipulate the objects rendered on screen directly. WatchKit applications don’t “own” their UI in the way iOS apps do, instead they use &lt;code>WKInterfaceObject&lt;/code> instances, which provide a &amp;ldquo;write-only&amp;rdquo; proxy interface. Due to sandboxing, it&amp;rsquo;s currently impossible to inspect an app that&amp;rsquo;s running on device without jailbreaking or performing other modifications. Today we will focus on inspecting apps running in the watchOS simulator.&lt;/p>
&lt;h2 id="injecting-the-reveal-library">Injecting the Reveal library&lt;/h2>
&lt;p>To inspect a view hierarchy with Reveal, we need to inject the Reveal library into the process that owns that hierarchy. In our case, we&amp;rsquo;re not compiling or running the process in Xcode, so we&amp;rsquo;re limited to Dynamic Loading: a technique similar to what&amp;rsquo;s described in the &lt;a href="https://support.revealapp.com/hc/en-us/articles/360022666651">Reveal Integration Guide&lt;/a>. We&amp;rsquo;ll start by demonstrating how to use this technique to inspect apps built into the watchOS 2 Simulator, since it&amp;rsquo;s actually easier than inspecting your own apps.&lt;/p>
&lt;p>First, launch Xcode and open a watchOS project. Then open the watchOS simulator and ensure the watch face is visible.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/inspecting-watchos/initial1.jpg">
&lt;/figure>
&lt;p>Apple&amp;rsquo;s own apps do not follow the WatchKit two-process architecture; instead, each app is run in a single process, similar to iOS apps. In order to attach to one of these apps we need to find out the name of the process. This involves some trial and error, but the watch face and the rest of Apple Watch home screen is rendered by a process called &lt;code>Carousel&lt;/code>.&lt;/p>
&lt;p>Attach the LLDB debugger to the &lt;code>Carousel&lt;/code> process using &lt;em>Debug → Attach to Process by PID or Name…&lt;/em> menu in Xcode. Type &lt;code>Carousel&lt;/code> in &lt;em>PID or Process Name&lt;/em> field of the dialog and click &lt;em>Attach&lt;/em>.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/inspecting-watchos/attachcarousel.jpg">
&lt;/figure>
&lt;p>In a few moments, &lt;code>Carousel&lt;/code> will appear in Debug Area toolbar, indicating that the debugger has been successfully attached. Click the &lt;em>Pause&lt;/em> button there to pause execution of the process and give you control over it via the debugger’s console. You&amp;rsquo;ll notice that the watch’s second hand has stopped.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/inspecting-watchos/pause.jpg">
&lt;/figure>
&lt;p>Now we can inject the Reveal dynamic library into the process. Paste this into the Debugger Console and press Return:&lt;/p>
&lt;pre tabindex="0">&lt;code>expr (Class)NSClassFromString(@&amp;#34;IBARevealLoader&amp;#34;) == nil ? (void *)dlopen(&amp;#34;/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib&amp;#34;, 0x2) : ((void*)0); [(NSNotificationCenter*)[NSNotificationCenter defaultCenter] postNotificationName:@&amp;#34;IBARevealRequestStart&amp;#34; object:nil];
&lt;/code>&lt;/pre>&lt;p>This command instructs the process to load Reveal’s dynamic library and start the Reveal server, assuming you have Reveal installed at &lt;code>/Applications/Reveal.app&lt;/code>. This approach is documented in the &lt;a href="https://support.revealapp.com/hc/en-us/articles/360022477972">Reveal Integration Guide&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Note&lt;/strong>: Instead of pasting this long command every time you want to manually inject Reveal into a process, you can use an LLDB macro. Check out &lt;a href="http://blog.ittybittyapps.com/blog/2013/11/07/integrating-reveal-without-modifying-your-xcode-project/">this blog post&lt;/a> to learn more.&lt;/p>
&lt;p>Now, click the &lt;em>Continue&lt;/em> button in the debugger’s toolbar to allow the process to continue execution. You&amp;rsquo;ll notice the watch’s second hand moving again. At this point, you can launch Reveal. If you have enabled automatic connection to Simulator, Reveal will connect to &lt;code>Carousel&lt;/code> immediately. Otherwise, you can use &lt;em>File → Connect to → Carousel on Apple Watch Simulator&lt;/em> menu in Reveal to select it as you would with any other instrumented app.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/inspecting-watchos/reveal1.jpg">
&lt;/figure>
&lt;p>&lt;code>Carousel&lt;/code> has a fairly complex view hierarchy as it also hosts other apps&amp;rsquo; UI, similar to the &lt;code>SpringBoard&lt;/code> process on iOS. Feel free to explore and experiment with it!&lt;/p>
&lt;h2 id="inspecting-your-own-apps">Inspecting your own apps&lt;/h2>
&lt;p>As we&amp;rsquo;ve covered previously, third-party WatchKit apps are executed as two processes running in concert: a WatchKit Extension and a Watch App. When you&amp;rsquo;re running your own WatchKit app in Xcode, the debugger attaches to the Extension, not the App. In order to inspect the view hierarchy, we&amp;rsquo;ll need to attach to the App counterpart manually.&lt;/p>
&lt;p>Start by opening your WatchKit project and running it in the Watch Simulator.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/inspecting-watchos/watchapp.jpg">
&lt;/figure>
&lt;p>This time, instead of using &lt;em>Debug → Attach to Process by PID or Name…&lt;/em> dialog, we&amp;rsquo;ll use &lt;em>Debug → Attach to Process → …&lt;/em> menu. You&amp;rsquo;ll see two processes in the &lt;em>Likely Targets&lt;/em> section of the list: an App and an Extension. Select the &lt;em>WatchKit App&lt;/em>.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/inspecting-watchos/targets.jpg">
&lt;/figure>
&lt;p>This will attach the debugger to the WatchKit App and allow you to perform the same steps as covered previously to inject the Reveal dynamic library into it: click &lt;em>Pause&lt;/em>, paste the injection command, click &lt;em>Continue&lt;/em>. You&amp;rsquo;ll then be able to select &lt;em>&amp;lt;YourAppName&amp;gt; WatchKit App on Apple Watch Simulator&lt;/em> in Reveal.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/inspecting-watchos/reveal2.jpg">
&lt;/figure>
&lt;p>It&amp;rsquo;s actually possible to edit most UIKit properties of your WatchKit app&amp;rsquo;s view hierarchy as you would expect from an iOS app – and see these changes live in Simulator. Of course, you won&amp;rsquo;t be able to reproduce some of these changes from your WatchKit Extension, but it can still be useful to try out, for example, different font sizes or colours. Keep in mind that WatchKit apps don&amp;rsquo;t use Auto Layout, so changing a label&amp;rsquo;s font size won&amp;rsquo;t change its bounds automatically.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/inspecting-watchos/reveal3.jpg">
&lt;/figure>
&lt;h2 id="conclusions">Conclusions&lt;/h2>
&lt;p>Using the LLDB debugger, it&amp;rsquo;s possible to inject the Reveal library into watchOS Simulator apps – both built-in and the ones you develop. It currently requires some manual steps, but it&amp;rsquo;s a great way to experiment and learn, or just to find out how all these cogs and springs bring the Apple Watch user interface to life.&lt;/p>
&lt;p>Some advanced techniques exist which produce similar results on actual Apple Watch hardware (for example, patching the Watch App stub used by Xcode for your apps), but we&amp;rsquo;ll leave that as an exercise for you, dear reader.&lt;/p>
&lt;h3 id="sample-snapshot-documents">Sample Snapshot Documents&lt;/h3>
&lt;p>We&amp;rsquo;ve included a variety of snapshots below for you to play with.
You&amp;rsquo;ll need &lt;a href="https://revealapp.com/download#direct">Reveal 1.6&lt;/a> or greater to view these files.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://images.revealapp.com.s3.amazonaws.com/watchOS_snapshots/ChronographWatchFace.zip">Chronograph Watch Face&lt;/a> (1.1 MB)&lt;/li>
&lt;li>&lt;a href="http://images.revealapp.com.s3.amazonaws.com/watchOS_snapshots/ColorWatchFace.zip">Color Watch Face&lt;/a> (1.1 MB)&lt;/li>
&lt;li>&lt;a href="http://images.revealapp.com.s3.amazonaws.com/watchOS_snapshots/SolarWatchFace.zip">Solar Watch Face&lt;/a> (803 KB)&lt;/li>
&lt;li>&lt;a href="http://images.revealapp.com.s3.amazonaws.com/watchOS_snapshots/WatchFaceChooser.zip">Watch Face Chooser&lt;/a> (2.1 MB)&lt;/li>
&lt;li>&lt;a href="http://images.revealapp.com.s3.amazonaws.com/watchOS_snapshots/Reveal%20is%20Great.zip">Reveal is Great App&lt;/a> (247 KB)&lt;/li>
&lt;li>&lt;a href="http://images.revealapp.com.s3.amazonaws.com/watchOS_snapshots/WatchSettings.zip">Settings App&lt;/a> (659 KB)&lt;/li>
&lt;li>&lt;a href="http://images.revealapp.com.s3.amazonaws.com/watchOS_snapshots/AppScreen.zip">App Launcher&lt;/a> (417 KB)&lt;/li>
&lt;/ul></content:encoded></item><item><title>Reveal常用技巧</title><link>https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/</link><pubDate>Thu, 22 Oct 2015 00:00:00 +0000</pubDate><dc:creator>Long Sun</dc:creator><guid>https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/</guid><description>&lt;p>&lt;em>以下基于Reveal 1.6。&lt;/em>&lt;/p>
&lt;h2 id="用于快速上手的内置应用">用于快速上手的内置应用&lt;/h2>
&lt;p>刚刚下载Reveal，啥都还没配置呢，想先随便玩玩看，怎么办？&lt;/p>
&lt;p>我们花了不少时间开发这个复杂程度类似与实际场景的Sample应用──Soundstagram（音频分享版的Instagram， ¯\_(ツ)_/¯），就是为了让大家能最快速地上手Reveal，尝试它的各种强大功能。&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/inspect-sample-app.png">
&lt;/figure>
&lt;p>在 &lt;em>Help&lt;/em> 菜单项中，点击 &lt;em>Inspect Sample App&lt;/em> ，稍微等一会，Reveal会将Soundstagram应用拷贝到你的iPhone模拟器中，并自动打开应用，自动连上开始Debug。一键搞定，你马上就会看到活的Reveal了。&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/soundstagram.png">
&lt;/figure>
&lt;h2 id="集成">集成&lt;/h2>
&lt;p>关于具体如何将Reveal集成到App中的各种方法，请参考&lt;a href="http://support.revealapp.com/kb/getting-started/integrating-reveal-with-your-ios-app-cn">官方的中文文档&lt;/a>，当中有非（guo）常（yu）详细的介绍。&lt;/p>
&lt;p>这里就啰嗦一句，对于专业的iOS工程师（可是连我们的设计师也毫不留情地采用了这种配置），我个人强烈推荐通过&lt;a href="http://support.revealapp.com/kb/getting-started/integrating-reveal-load-reveal-without-changing-your-xcode-project-cn">Xcode中加断点&lt;/a>的方式集成Reveal。一次配置，终生受益，无论到哪个项目，简直太方便了，有木有。（小缺陷，当你禁用断点时或者不用Xcode而用Appcode开发时，这个方式是不管用的。）&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/reveal-breakpoint.png">
&lt;/figure>
&lt;h2 id="常用的快捷键">常用的快捷键&lt;/h2>
&lt;p>&lt;em>这不是一个详细全面的快捷键列表，我只说点特别常用的。&lt;/em>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>快捷键&lt;/th>
&lt;th>作用&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>（在iPhone模拟器中按）⌘ ⇧ r&lt;/td>
&lt;td>切换到Reveal并刷新&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>⌘ → 和 ⌘ ←&lt;/td>
&lt;td>在View的选择历史中，前进后退&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>⌘ ⌥ 滚动&lt;/td>
&lt;td>3D视图时增大/缩小每层视图的间距&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>⌘ 4 和 ⌘ 5&lt;/td>
&lt;td>在2D和3D视图间切换&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>⌘ r&lt;/td>
&lt;td>刷新（强迫症必备）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>_重度快捷键用户，请到 &lt;em>Help&lt;/em> -&amp;gt; &lt;em>Keyboard Shortcuts&lt;/em> 中查看详细列表。&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/full-shortcuts.png">
&lt;/figure>
&lt;h2 id="自动布局的调试">自动布局的调试&lt;/h2>
&lt;p>自动布局（Auto Layout）已经越来越普遍的深入千家万户了，随着iOS设备分辨率的多(sui)样(pian)化，自动布局已慢慢成为了标准配置。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>你可能经常看到控制台输出类似这样的内容，而不知何处下手：&lt;/p>
&lt;p>{% highlight objective-c %}
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don&amp;rsquo;t want. Try this: (1) look at each constraint and try to figure out which you don&amp;rsquo;t expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you&amp;rsquo;re seeing NSAutoresizingMaskLayoutConstraints that you don&amp;rsquo;t understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
&amp;ldquo;&amp;lt;NSLayoutConstraint:0x7fc82d3e18a0 H:[UIView:0x7fc82aba1210(768)]&amp;gt;&amp;rdquo;,
&amp;ldquo;&amp;lt;NSLayoutConstraint:0x7fc82d6369e0 H:[UIView:0x7fc82aba1210]-(0)-| (Names: &amp;lsquo;|&amp;rsquo;:UIView:0x7fc82d6b9f80 )&amp;gt;&amp;rdquo;,
&amp;ldquo;&amp;lt;NSLayoutConstraint:0x7fc82d636a30 H:|-(0)-[UIView:0x7fc82aba1210] (Names: &amp;lsquo;|&amp;rsquo;:UIView:0x7fc82d6b9f80 )&amp;gt;&amp;rdquo;,
&amp;ldquo;&amp;lt;NSLayoutConstraint:0x7fc82d3e7fd0 &amp;lsquo;UIView-Encapsulated-Layout-Width&amp;rsquo; H:[UIView:0x7fc82d6b9f80(50)]&amp;gt;&amp;rdquo;
)&lt;/p></description><content:encoded>&lt;p>&lt;em>以下基于Reveal 1.6。&lt;/em>&lt;/p>
&lt;h2 id="用于快速上手的内置应用">用于快速上手的内置应用&lt;/h2>
&lt;p>刚刚下载Reveal，啥都还没配置呢，想先随便玩玩看，怎么办？&lt;/p>
&lt;p>我们花了不少时间开发这个复杂程度类似与实际场景的Sample应用──Soundstagram（音频分享版的Instagram， ¯\_(ツ)_/¯），就是为了让大家能最快速地上手Reveal，尝试它的各种强大功能。&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/inspect-sample-app.png">
&lt;/figure>
&lt;p>在 &lt;em>Help&lt;/em> 菜单项中，点击 &lt;em>Inspect Sample App&lt;/em> ，稍微等一会，Reveal会将Soundstagram应用拷贝到你的iPhone模拟器中，并自动打开应用，自动连上开始Debug。一键搞定，你马上就会看到活的Reveal了。&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/soundstagram.png">
&lt;/figure>
&lt;h2 id="集成">集成&lt;/h2>
&lt;p>关于具体如何将Reveal集成到App中的各种方法，请参考&lt;a href="http://support.revealapp.com/kb/getting-started/integrating-reveal-with-your-ios-app-cn">官方的中文文档&lt;/a>，当中有非（guo）常（yu）详细的介绍。&lt;/p>
&lt;p>这里就啰嗦一句，对于专业的iOS工程师（可是连我们的设计师也毫不留情地采用了这种配置），我个人强烈推荐通过&lt;a href="http://support.revealapp.com/kb/getting-started/integrating-reveal-load-reveal-without-changing-your-xcode-project-cn">Xcode中加断点&lt;/a>的方式集成Reveal。一次配置，终生受益，无论到哪个项目，简直太方便了，有木有。（小缺陷，当你禁用断点时或者不用Xcode而用Appcode开发时，这个方式是不管用的。）&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/reveal-breakpoint.png">
&lt;/figure>
&lt;h2 id="常用的快捷键">常用的快捷键&lt;/h2>
&lt;p>&lt;em>这不是一个详细全面的快捷键列表，我只说点特别常用的。&lt;/em>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>快捷键&lt;/th>
&lt;th>作用&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>（在iPhone模拟器中按）⌘ ⇧ r&lt;/td>
&lt;td>切换到Reveal并刷新&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>⌘ → 和 ⌘ ←&lt;/td>
&lt;td>在View的选择历史中，前进后退&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>⌘ ⌥ 滚动&lt;/td>
&lt;td>3D视图时增大/缩小每层视图的间距&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>⌘ 4 和 ⌘ 5&lt;/td>
&lt;td>在2D和3D视图间切换&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>⌘ r&lt;/td>
&lt;td>刷新（强迫症必备）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>_重度快捷键用户，请到 &lt;em>Help&lt;/em> -&amp;gt; &lt;em>Keyboard Shortcuts&lt;/em> 中查看详细列表。&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/full-shortcuts.png">
&lt;/figure>
&lt;h2 id="自动布局的调试">自动布局的调试&lt;/h2>
&lt;p>自动布局（Auto Layout）已经越来越普遍的深入千家万户了，随着iOS设备分辨率的多(sui)样(pian)化，自动布局已慢慢成为了标准配置。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>你可能经常看到控制台输出类似这样的内容，而不知何处下手：&lt;/p>
&lt;p>{% highlight objective-c %}
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don&amp;rsquo;t want. Try this: (1) look at each constraint and try to figure out which you don&amp;rsquo;t expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you&amp;rsquo;re seeing NSAutoresizingMaskLayoutConstraints that you don&amp;rsquo;t understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
&amp;ldquo;&amp;lt;NSLayoutConstraint:0x7fc82d3e18a0 H:[UIView:0x7fc82aba1210(768)]&amp;gt;&amp;rdquo;,
&amp;ldquo;&amp;lt;NSLayoutConstraint:0x7fc82d6369e0 H:[UIView:0x7fc82aba1210]-(0)-| (Names: &amp;lsquo;|&amp;rsquo;:UIView:0x7fc82d6b9f80 )&amp;gt;&amp;rdquo;,
&amp;ldquo;&amp;lt;NSLayoutConstraint:0x7fc82d636a30 H:|-(0)-[UIView:0x7fc82aba1210] (Names: &amp;lsquo;|&amp;rsquo;:UIView:0x7fc82d6b9f80 )&amp;gt;&amp;rdquo;,
&amp;ldquo;&amp;lt;NSLayoutConstraint:0x7fc82d3e7fd0 &amp;lsquo;UIView-Encapsulated-Layout-Width&amp;rsquo; H:[UIView:0x7fc82d6b9f80(50)]&amp;gt;&amp;rdquo;
)&lt;/p>
&lt;p>Will attempt to recover by breaking constraint
&amp;lt;NSLayoutConstraint:0x7fc82d3e18a0 H:[UIView:0x7fc82aba1210(768)]&amp;gt;&lt;/p>
&lt;p>Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in &amp;lt;UIKit/UIView.h&amp;gt; may also be helpful.
{% endhighlight %}&lt;/p>
&lt;/li>
&lt;li>
&lt;p>除了我们在编码时自己绑定到View上的约束条件(Constraints)之外，其实许多UIKit控件还会被&lt;strong>隐式地&lt;/strong>地设置上一些约束，而这些可能会带来一些意外的布局结果。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>也许曾经你需要使用&lt;code>LLDB&lt;/code>来一点点调试Auto Layouts：&lt;/p>
&lt;pre tabindex="0">&lt;code>(lldb) po 0x7731880
$0 = 124983424 &amp;lt;UIView: 0x7731880; frame = (90 -50; 80 100);
layer = &amp;lt;CALayer: 0x7731450&amp;gt;&amp;gt;
(lldb) po [0x7731880 superview]
$2 = 0x07730fe0 &amp;lt;UIView: 0x7730fe0; frame = (32 128; 259 604);
layer = &amp;lt;CALayer: 0x7731150&amp;gt;&amp;gt;
(lldb) po [[0x7731880 superview] recursiveDescription]
$3 = 0x07117ac0 &amp;lt;UIView: 0x7730fe0; frame = (32 128; 259 604); layer = &amp;lt;CALayer: 0x7731150&amp;gt;&amp;gt;
| &amp;lt;UIView: 0x7731880; frame = (90 -50; 80 100); layer = &amp;lt;CALayer: 0x7731450&amp;gt;&amp;gt;
| &amp;lt;UIView: 0x7731aa0; frame = (90 101; 80 100); layer = &amp;lt;CALayer: 0x7731c60&amp;gt;&amp;gt;
&lt;/code>&lt;/pre>&lt;p>有了Reveal，这就方便多了。Reveal对视图上的约束条件提供了相当丰富的检视与实时修改功能，具体看下面这张图，再自己摸索一下就好了。&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/auto-layout-ano.jpg">
&lt;/figure>
&lt;!-- raw HTML omitted -->
&lt;h2 id="实时修改view属性">实时修改View属性&lt;/h2>
&lt;p>Reveal不仅仅只是查看各种属性的工具，也支持实时的修改一些属性。如下图中的大部份属性，你都可以实时的在模拟器中看到修改后的效果。这省去了过去总是要修改代码，重新编译运行这个漫长的反馈流程。在和设计师一起尝试各种显示效果时，这个功能特别高效。&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/runtime-modify.jpg">
&lt;/figure>
&lt;h2 id="snapshot">Snapshot&lt;/h2>
&lt;p>Reveal还具有保存现场的功能（快捷键，⌘ s），它将保存应用的截图，所有View的层级结构和具体属性信息。换句话说，下次你打开这个Snapshot文件时，不需要启动iOS应用，也可以看到所有的视图信息。&lt;/p>
&lt;p>一些可能的使用场景：你可以在描述布局问题时，给其他团队成员分享Snapshot；还可以对不同大小的模拟器分别保存Snapshot，然后再做详细地比较，找出问题所在。&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/save.png">
&lt;/figure></content:encoded></item><item><title>Reveal 1.6</title><link>https://revealapp.com/news/reveal-1.6/</link><pubDate>Thu, 15 Oct 2015 00:00:00 +0000</pubDate><dc:creator>Sean Woodhouse</dc:creator><guid>https://revealapp.com/news/reveal-1.6/</guid><description>&lt;p>The team at Itty Bitty Apps is excited to announce the release of Reveal 1.6. This release delivers a bunch of new features and adds support for OS X 10.11, iOS 9 and tvOS. Here&amp;rsquo;s the rundown&amp;hellip;&lt;/p>
&lt;h2 id="multi-window-support">Multi-window support&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal-1.6/multi-window-support.jpg">
&lt;/figure>
&lt;p>You can now inspect more than one app at the same time. Using multiple windows you can compare snapshots of your application side by side to see how the structure of the view hierarchy has changed over time or across device types.&lt;/p></description><content:encoded>&lt;p>The team at Itty Bitty Apps is excited to announce the release of Reveal 1.6. This release delivers a bunch of new features and adds support for OS X 10.11, iOS 9 and tvOS. Here&amp;rsquo;s the rundown&amp;hellip;&lt;/p>
&lt;h2 id="multi-window-support">Multi-window support&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal-1.6/multi-window-support.jpg">
&lt;/figure>
&lt;p>You can now inspect more than one app at the same time. Using multiple windows you can compare snapshots of your application side by side to see how the structure of the view hierarchy has changed over time or across device types.&lt;/p>
&lt;h2 id="create-and-share-snapshots">Create and share snapshots&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal-1.6/saving-snapshots.jpg">
&lt;/figure>
&lt;p>Snapshots can be saved and loaded, allowing you to use them as a point-in-time reference during development or to share for educational and problem solving purposes.&lt;/p>
&lt;p>Loading a snapshot does not require the iOS application to be running in the simulator or device. Snapshots can be opened by any other Reveal 1.6 user.&lt;/p>
&lt;p>We even added Quick Look support so you can easily find the snapshot you&amp;rsquo;re looking for.&lt;/p>
&lt;h2 id="auto-connect">Auto-connect&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal-1.6/auto-connection.jpg">
&lt;/figure>
&lt;p>Reveal can automatically connect to instrumented apps running in the simulator. One less click we knew you&amp;rsquo;d appreciate.&lt;/p>
&lt;h2 id="bitcode">Bitcode&lt;/h2>
&lt;p>The Reveal 1.6 library includes a bitcode slice which fixes linking problems under Xcode 7.&lt;/p>
&lt;h2 id="platform-support">Platform support&lt;/h2>
&lt;figure>&lt;img src="https://revealapp.com/news/reveal-1.6/platform-support.jpg">
&lt;/figure>
&lt;p>Reveal now supports inspecting iOS 9 applications and includes custom editors for a number of new properties. You can also inspect tvOS applications seamlessly.&lt;/p>
&lt;p>We&amp;rsquo;ll be publishing a blog post shortly which will detail how to inspect Apple Watch applications. The process is a little convoluted, but we know many of you will be interested to see how things work under the covers.&lt;/p>
&lt;p>The Reveal desktop application now requires OS X 10.10 &amp;ldquo;Yosemite&amp;rdquo; to run and we&amp;rsquo;ve also bumped the minimum iOS version it&amp;rsquo;ll inspect to iOS 7.&lt;/p>
&lt;p>If you need to inspect iOS 6 applications you can download Reveal 1.5.1 &lt;a href="https://revealapp.com/download/#direct">here&lt;/a>.&lt;/p>
&lt;h2 id="bug-fixes">Bug fixes&lt;/h2>
&lt;p>Reveal 1.6 fixes a number of visual artefacts when running on OS X 10.11 &amp;ldquo;El Capitan&amp;rdquo; and includes many bug fixes and stability improvements.&lt;/p>
&lt;h2 id="how-to-get-it">How to get it&lt;/h2>
&lt;p>You can download Reveal 1.6 directly from our web site &lt;a href="https://revealapp.com/download/#direct">here&lt;/a>. If you already have a previous version of Reveal installed you can update it by selecting &amp;lsquo;Check for Updates&amp;hellip;&amp;rsquo; from the Reveal menu.&lt;/p>
&lt;h2 id="feedback">Feedback&lt;/h2>
&lt;p>If you have any questions or would like to provide feedback, please head over to &lt;a href="http://support.revealapp.com">our support site&lt;/a> and leave a comment.&lt;/p></content:encoded></item><item><title>Exploring accessibility</title><link>https://revealapp.com/news/exploring-accessibility/</link><pubDate>Tue, 06 Oct 2015 00:00:00 +0000</pubDate><dc:creator>Giovanni Lodi</dc:creator><guid>https://revealapp.com/news/exploring-accessibility/</guid><description>&lt;p>Making your app accessible for the visually impaired is not only a good service to humanity, but also brings the quality and attention to detail of your product to the next level.&lt;/p>
&lt;p>UIKit provides great support for implementing accessibility and Reveal makes it easy to debug by allowing you to inspect this information at runtime.&lt;/p>
&lt;h2 id="the-identity-inspector">The Identity Inspector&lt;/h2>
&lt;p>The Identity Inspector displays a host of information related to the selected view including the restoration identifier, class, memory address, and the associated View Controller.&lt;/p></description><content:encoded>&lt;p>Making your app accessible for the visually impaired is not only a good service to humanity, but also brings the quality and attention to detail of your product to the next level.&lt;/p>
&lt;p>UIKit provides great support for implementing accessibility and Reveal makes it easy to debug by allowing you to inspect this information at runtime.&lt;/p>
&lt;h2 id="the-identity-inspector">The Identity Inspector&lt;/h2>
&lt;p>The Identity Inspector displays a host of information related to the selected view including the restoration identifier, class, memory address, and the associated View Controller.&lt;/p>
&lt;p>It also displays a number of properties from the &lt;code>UIAccessibility&lt;/code> protocol that you might find useful when making your application accessible or when writing automated tests.&lt;/p>
&lt;p>&lt;strong>Pro Tip:&lt;/strong> Although some of the properties are editable, changes made through the Identity Inspector may not persist if the view has implemented the &lt;code>UIAccessibility&lt;/code> protocol methods to return hard-coded values.&lt;/p>
&lt;p>Let&amp;rsquo;s have a look at the accessibility information displayed in the Identity Inspector&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/exploring-accessibility/accessibility-menu.jpg">
&lt;/figure>
&lt;h3 id="enabled">Enabled&lt;/h3>
&lt;p>Indicates whether the view has accessibility enabled and responds to user interaction. If the view doesn&amp;rsquo;t have accessibility enabled then VoiceOver won&amp;rsquo;t &lt;em>read&lt;/em> it to the user, nor allow interaction with it by double-tapping.&lt;/p>
&lt;p>According to the Apple documentation, the only use case to not set this to &lt;code>true&lt;/code> is: &amp;ldquo;&lt;em>[&amp;hellip;] a view that merely serves as a container for other items that should be accessible. Such a view should implement the &lt;code>UIAccessibilityContainer&lt;/code> protocol and set this property to &lt;code>NO&lt;/code>.&lt;/em>&amp;rdquo;&lt;/p>
&lt;p>Corresponds to &lt;code>isAccessibilityElement&lt;/code>. &lt;strong>Pro Tip:&lt;/strong> when you hover over an inspector field name a tooltip will display the corresponding UIKit property name.&lt;/p>
&lt;h3 id="should-group-children">Should Group Children&lt;/h3>
&lt;p>By default &lt;a href="http://www.apple.com/au/accessibility/ios/voiceover/">VoiceOver&lt;/a>, Apple&amp;rsquo;s gesture based screen reader, will scan and read the UI left to right, top to bottom, regardless of the subviews hierarchy. This default mode might not be the best way to present certain kinds of content. Information could be organised in columns, for example, and the best way to read it would be column after column. In such cases setting the value of &lt;code>shouldGroupAccessibilityChildren&lt;/code> to &lt;code>true&lt;/code> will make VoiceOver group together the elements in the receiver, and read all of them before moving to the next element in the normal order.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/exploring-accessibility/should-group-accessibility-children-off.jpg">
&lt;/figure>
&lt;p>In the example above the container views are not set to group their children, and VoiceOver will read &amp;ldquo;1, 3, 2, 4&amp;rdquo;.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/exploring-accessibility/should-group-accessibility-children-on.jpg">
&lt;/figure>
&lt;p>With &lt;code>shouldGroupAccessibilityChildren&lt;/code> set to &lt;code>true&lt;/code> VoiceOver will read &amp;ldquo;1, 2, 3, 4&amp;rdquo; as intended.&lt;/p>
&lt;p>&lt;em>Note that if we had implemented the layout above using two instances of &lt;code>UICollectionView&lt;/code> we would have had the desired VoiceOver behaviour out of the box.&lt;/em>&lt;/p>
&lt;h3 id="traits">Traits&lt;/h3>
&lt;p>Corresponds to the &lt;code>accessibilityTraits&lt;/code> property and contains a mask that best characterizes the accessibility element, giving VoiceOver the context needed to read it properly.&lt;/p>
&lt;h3 id="activation-point">Activation Point&lt;/h3>
&lt;p>The activation point of a view is the point, expressed in screen coordinates, to which VoiceOver will send a touch event when the view is double-tapped.&lt;/p>
&lt;p>Corresponds to the &lt;code>accessibilityActivationPoint&lt;/code> property.&lt;/p>
&lt;h3 id="frame">Frame&lt;/h3>
&lt;p>The frame of the accessibility element, in screen coordinates, as set in the &lt;code>accessibilityFrame&lt;/code> property.&lt;/p>
&lt;p>All &lt;code>UIView&lt;/code> subclasses have this value set for them automatically but the value can be altered by overriding &lt;code>accessibilityFrame&lt;/code> in a subclass.&lt;/p>
&lt;p>&lt;strong>Pro Tip:&lt;/strong> don&amp;rsquo;t confuse this property with the frame of the view. It is set in screen coordinates and may not necessarily map to the position of the view&amp;rsquo;s frame.&lt;/p>
&lt;h3 id="label">Label&lt;/h3>
&lt;p>The &lt;code>accessibilityLabel&lt;/code> property is a short, localized label that succinctly identifies the element.&lt;/p>
&lt;h3 id="value">Value&lt;/h3>
&lt;p>The default value for this property is nil unless the receiver is a &lt;code>UIControl&lt;/code> subclass. In this case it represents the value of the control as a localized string if it differs from the label.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/exploring-accessibility/accessibility-value.jpg">
&lt;/figure>
&lt;h3 id="hint">Hint&lt;/h3>
&lt;p>For interactive elements the accessibility hint provides a way to briefly describe the expected result of the user interacting with the element.&lt;/p>
&lt;p>It corresponds to the &lt;code>accessibilityHint&lt;/code> property.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/exploring-accessibility/accessibility-hint.jpg">
&lt;/figure>
&lt;h3 id="identifier">Identifier&lt;/h3>
&lt;p>Unlike the rest of the accessibility information in the Identity Inspector, the identifier is not part of the &lt;code>UIAccessibility&lt;/code> protocol. It corresponds to the &lt;code>accessibilityIdentifier&lt;/code> property of the &lt;code>UIAccessibilityIdentification&lt;/code> protocol.&lt;/p>
&lt;p>This value is meant to be used to uniquely identify views in the context of UI tests, and is never read by VoiceOver.&lt;/p>
&lt;h3 id="language">Language&lt;/h3>
&lt;p>The language in which to speak the accessibility element&amp;rsquo;s label, value, and hint. Most of the time this field will be empty since &lt;code>nil&lt;/code> is the default value and correspond to the user&amp;rsquo;s current language settings.&lt;/p>
&lt;h3 id="view-is-modal">View is Modal&lt;/h3>
&lt;p>This value, corresponding to &lt;code>accessibilityViewIsModal&lt;/code>, represents whether VoiceOver should ignore the elements within views that are siblings of the receiver.&lt;/p>
&lt;p>This can be useful when displaying custom views that are presented modally.&lt;/p>
&lt;h3 id="elements-hidden">Elements Hidden&lt;/h3>
&lt;p>This value, corresponding to &lt;code>accessibilityElementsHidden&lt;/code>, represents whether the accessibility elements contained within the view should be ignored by VoiceOver.&lt;/p>
&lt;p>Apple&amp;rsquo;s documentation states &lt;em>&amp;ldquo;you might also use this property to hide a transient view that VoiceOver users don’t need to notice. For example, VoiceOver doesn’t need to describe the translucent view that appears when users adjust the volume on their devices, because the aural feedback of this action is sufficient.&amp;rdquo;&lt;/em>&lt;/p>
&lt;h2 id="pro-tip-turn-on-the-accessibility-inspector">Pro Tip: Turn on the Accessibility Inspector&lt;/h2>
&lt;p>Sometimes you might not see all the expected accessibility information appear in the Identity Inspector. This can happen because the information is only vended by the iOS application once the classes that implement accessibility have been dynamically loaded at runtime. You can see proof of this by looking at the Xcode 7 UI test execution output. Before any interaction starts the test runner says &lt;code>Waiting for accessibility to load&lt;/code>.&lt;/p>
&lt;p>To enable accessibility in the simulator you need to turn on the Accessibility Inspector.&lt;/p>
&lt;ol>
&lt;li>Go to the Settings app. You can background a running app by pressing Cmd + H, which simulates pressing on the Home button.&lt;/li>
&lt;li>Select the General options.&lt;/li>
&lt;li>Select Accessibility.&lt;/li>
&lt;li>Turn the Accessibility Inspector switch on.&lt;/li>
&lt;li>You should now see the Accessibility Inspector window and the accessibility information for applications you inspect with Reveal should now be visible in the Identity Inspector.&lt;/li>
&lt;/ol>
&lt;figure>&lt;img src="https://revealapp.com/news/exploring-accessibility/enable-inspector.gif">
&lt;/figure>
&lt;hr>
&lt;p>While we have shown how Reveal can help inspect the accessibility properties of your views, we&amp;rsquo;d love to hear how you&amp;rsquo;re using these features when it comes to implementing accessibility and writing automated tests. You can tweet us &lt;a href="https://twitter.com/reveal_app">@reveal_app&lt;/a> or &lt;a href="mailto:support@revealapp.com">email us&lt;/a> your feedback.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/exploring-accessibility/reveal-and-accessibility.png">
&lt;/figure></content:encoded></item><item><title>Revealed: Soundproof</title><link>https://revealapp.com/news/revealed-soundproof/</link><pubDate>Fri, 29 May 2015 00:00:00 +0000</pubDate><dc:creator>Sean Woodhouse</dc:creator><guid>https://revealapp.com/news/revealed-soundproof/</guid><description>&lt;p>At &lt;a href="https://vimeo.com/nsconf">NSConference 7&lt;/a> I was fortunate to meet Marc Palmer, an avid Reveal user and developer of Soundproof, a practice app for musicians. As I poured over the UI and we discussed the implementation, it became clear that this would be a great app to feature on Revealed.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/revealed-soundproof/phone.jpg">
&lt;/figure>
&lt;h3 id="marc-can-you-tell-me-a-little-bit-about-yourself-and-soundproof">Marc, can you tell me a little bit about yourself and Soundproof?&lt;/h3>
&lt;p>&lt;strong>Marc:&lt;/strong> I’ve been a programmer since I was 11, so that’s around 31 years ago now. I left school at 16 because I hated it, and persuaded my dad to employee me at his small software company in the music industry. At that time I was in the UK Atari ST demo scene coding graphics in 68000 assembly. It was much more interesting than working on DOS and early Windows 3.1 apps, although I loved Turbo/Object Pascal. After some Borland C++ pain I moved to Java web apps, Java 2 ME embedded apps, Java mobile phone games and then fell back to web apps for big brands and a lot of &lt;a href="http://grails.org">Grails&lt;/a> open source development.&lt;/p></description><content:encoded>&lt;p>At &lt;a href="https://vimeo.com/nsconf">NSConference 7&lt;/a> I was fortunate to meet Marc Palmer, an avid Reveal user and developer of Soundproof, a practice app for musicians. As I poured over the UI and we discussed the implementation, it became clear that this would be a great app to feature on Revealed.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/revealed-soundproof/phone.jpg">
&lt;/figure>
&lt;h3 id="marc-can-you-tell-me-a-little-bit-about-yourself-and-soundproof">Marc, can you tell me a little bit about yourself and Soundproof?&lt;/h3>
&lt;p>&lt;strong>Marc:&lt;/strong> I’ve been a programmer since I was 11, so that’s around 31 years ago now. I left school at 16 because I hated it, and persuaded my dad to employee me at his small software company in the music industry. At that time I was in the UK Atari ST demo scene coding graphics in 68000 assembly. It was much more interesting than working on DOS and early Windows 3.1 apps, although I loved Turbo/Object Pascal. After some Borland C++ pain I moved to Java web apps, Java 2 ME embedded apps, Java mobile phone games and then fell back to web apps for big brands and a lot of &lt;a href="http://grails.org">Grails&lt;/a> open source development.&lt;/p>
&lt;p>When the iPhone SDK came out I started playing with it and studying this “alien&amp;quot; Objective-C stuff but didn’t make the switch to iOS commercially until 2013. That year I had been working on our first app with Adam in my spare time, which is still unreleased, but then had to have emergency spinal surgery to avoid becoming paralysed. This was one of those times that really focuses the mind, and I became resolved to convert to full time commercial iOS/Mac work as soon as possible. Two days after surgery I was hacking iOS at home in bed; the miracle of modern medicine.&lt;/p>
&lt;p>Soundproof was the first in-house app we built. To fill a need we had as musicians, it is all about effortlessly looping the music you practice. There is no “repeat off” mode. Swiping between tracks is infinite, the set list just cycles around. The controls are deliberately oversized and easy to hit at arm’s length. We wanted everyone to find it easier to practice using the app, not more fiddly, where you try to hit a little button while holding a plectrum, cello bow, or drumsticks. We also have a cool count-in and text-to-speech track announcements you can toggle without interrupting your flow.&lt;/p>
&lt;p>Plus, we also needed to get an app in the store to prove ourselves commercially in the iOS contracting market. With one big unreleased app still in development we needed to get something in the App Store quickly and I foolishly thought Soundproof would be a quick 2-3 week project. It turned out that we are incapable of releasing something half-baked, so we iterated… and iterated…&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/revealed-soundproof/soundproof-use2.jpg">
&lt;/figure>
&lt;h3 id="who-is-the-app-aimed-at---whats-the-target-audience">Who is the app aimed at - what’s the target audience?&lt;/h3>
&lt;p>&lt;strong>Marc:&lt;/strong> Soundproof is for anybody who needs to learn by playing, singing, or listening along with audio. Many of us practice by just playing along with tracks. This is who we want to reach. People who want to improve their skills and maybe need help to practice more by removing the friction. I play guitar but have been learning drums for some time. When I practice I put the phone in my pocket with a loop region set, headphones on and just jam along until I can’t any more. At the end, it tells me how much time I spent doing that practice, and how much I’ve done that week.&lt;/p>
&lt;p>My daughters use it too. My 12 year old puts the phone on her music stand and plays along with pieces and recordings of scales, and my 9 year old props it on the music stand of a piano keyboard and taps out tunes while it loops a little tune she’s trying to learn.&lt;/p>
&lt;h3 id="how-long-have-you-been-working-on-it-and-how-big-is-your-team">How long have you been working on it, and how big is your team?&lt;/h3>
&lt;figure>&lt;img src="https://revealapp.com/news/revealed-soundproof/marc-adam.jpg">
&lt;/figure>
&lt;p>&lt;strong>Marc:&lt;/strong> There are two of us at Montana Floss Co., &lt;a href="http://thepdco.co.uk">Adam Hinks&lt;/a> and myself. We spent about three months getting Soundproof to 1.0. The hardest part of building it was the time it took us to get a track selector, set list, and player UI structure that we were happy with. When you look at the built-in Music app for example, it is pretty much upside down for what you want when you practice. When you open the app, you always want to be in the player where you left off. We built, threw away and rebuilt that whole UI several times. Sometimes things can look great in wireframes but when you actually try to use it…&lt;/p>
&lt;h3 id="did-you-work-with-a-designer">Did you work with a designer?&lt;/h3>
&lt;p>&lt;strong>Marc:&lt;/strong> Oh yes. I wouldn’t work without a designer, and I was lucky enough to meet Adam, a great local brand and visual designer, a couple of years ago. We get on because we both like Metal music, are very fussy, and hanker for simplicity. I am pretty good at iterating on UX problems but I can’t even draw a square with a pencil. Plus I can display shockingly bad taste at times.&lt;/p>
&lt;p>So Adam and I work together on all the UX and product design. It works really well, especially as we now run a &lt;a href="http://stroudcluster.com">small co-working space&lt;/a> together here in the UK and get to help each other all the time.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/revealed-soundproof/studio.jpg">
&lt;/figure>
&lt;h3 id="did-you-have-any-inspiration-for-the-app">Did you have any inspiration for the app?&lt;/h3>
&lt;p>&lt;strong>Marc:&lt;/strong> Not so much direct inspiration from other music apps. I am a big fan of classic iOS apps like Tweetbot, Day One, and Writer.Pro — in terms of general polish and simplicity. I was a user of Capo on Mac long ago, and also used it a little on iOS for working out riffs.&lt;/p>
&lt;p>We are so lucky to have great apps like Capo and AnyTune Pro for high quality slow-down and other fancy features, but Soundproof is all about the player mechanic and the specifics of repeat practicing rather than working out the minutiae of solos. It is a great complement to tools like that.&lt;/p>
&lt;p>If anything the inspiration for Soundproof came more from the old 4-track recorders you could get when we were kids; with buttons to set and reset in/out loop points. We think of our iOS apps as tactile, almost mechanical devices. We want everything to make some kind of kinetic sense. We also don’t want an audio waveform display. We want people who are learning to use their ears more and get a feel for the structure of tracks. It is opinionated software.&lt;/p>
&lt;h3 id="the-ui-is-very-clean-its-custom-but-works-well-with-the-platform-do-you-think-ios-7--8-have-made-it-easier-for-developers-to-design-for-the-platform">The UI is very clean. It&amp;rsquo;s custom, but works well with the platform. Do you think iOS 7 &amp;amp; 8 have made it easier for developers to design for the platform?&lt;/h3>
&lt;p>&lt;strong>Marc:&lt;/strong> Perhaps, but not for me. My design skills are so lacking — and I’m also very lazy about it. Get someone who knows what they are doing rather than labouring over it yourself. It has, on the other hand, made it easier (but not easy) to find good designers, as they don’t also have to have photo-realistic texturing skills. Adam is certainly very keen on the flat design, as he loves print. The iOS 7 &amp;amp; 8 styling is much closer to what he likes.&lt;/p>
&lt;h3 id="what-was-the-most-complicated-ui-element-in-the-app-to-build">What was the most complicated UI element in the app to build?&lt;/h3>
&lt;p>&lt;strong>Marc:&lt;/strong> There were a couple of tricky things actually. The zooming time display and the time position slider were pretty hard to make. As an example, the slider morphs to expand the loop region full width when you enter loop mode. As ever with good iOS apps, there’s a lot of detail that isn’t immediately noticeable, and this is the stuff that takes time.&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/revealed-soundproof/01a.jpg">
&lt;/figure>
&lt;figure>&lt;img src="https://revealapp.com/news/revealed-soundproof/01b.jpg">
&lt;/figure>
&lt;h3 id="when-did-you-find-reveal-useful-and-how-did-you-use-it">When did you find Reveal useful and how did you use it?&lt;/h3>
&lt;p>&lt;strong>Marc:&lt;/strong> I started using Reveal back in 2013 when I was working on that first app we still haven’t released yet. In Soundproof I used it to solve the classic “where the hell is my view” problem, as well as the tricky controls like the time slider which involve multi-layered sub-controls that cross fade and change bounds to create the transition effect. Also the volume control and its handling of the AirPlay button appearing and disappearing when external outputs become available — frankly all of it. The drop-down stats bar in the app was also fiddly, as you’ll know if you’ve done something similar, so being able to see its positioning and verify its bounds for clipping was invaluable.&lt;/p>
&lt;p>Oh, and our infinitely swipeable track selector is a UICollectionView with some trickery to add false items at each end of the scroll range. Viewing what items were offscreen in that case in Reveal was great. We’re 100% Auto Layout and oh how we wish we’d had that in Reveal when we did the app!&lt;/p>
&lt;div
style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe
src="https://player.vimeo.com/video/129061736?dnt=0"
style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allow="fullscreen">
&lt;/iframe>
&lt;/div>
&lt;p>We also used it a lot to tweak colours, sizes and positions, and to debug retina stroke pixel alignment issues in realtime. Modifying properties on the fly and seeing the results immediately on the device was so useful. We tweaked until it was right and then I wrote the values down and carried them over to the source. Things like getting the pixel alignment of custom background images on a UISlider were very challenging because of some weird undocumented iOS behaviours and insets. Without Reveal it would have been almost impossible to identify these.&lt;/p>
&lt;h3 id="i-like-how-when-you-tap-the-scrubber-the-time-zooms-up-and-the-rest-of-the-ui-fades-away-can-you-describe-how-you-achieved-that">I like how when you tap the scrubber the time zooms up and the rest of the UI fades away. Can you describe how you achieved that?&lt;/h3>
&lt;p>&lt;strong>Marc:&lt;/strong> I’m glad you like it. I’ll try to explain it the best I can. It took so much tuning, you wouldn’t believe. The user experience we wanted here was based on the fact that while you are scrubbing the track at arm’s length with an instrument in your other hand, no other controls matter. There are a few things going on at once with it. The time display label has to move up the screen from its position on the time slider to where the Play button is, getting much larger as it does so. At the same time we fade in a full screen dark blurred image view that sits on top of everything but the time label and the slider in the Z-order, so the slider and time appear to “push through” the blur. It’s a nice bit of sleight-of-hand. This was developed pre-UIVisualEffectView.&lt;/p>
&lt;div
style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe
src="https://player.vimeo.com/video/129061736?dnt=0"
style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allow="fullscreen">
&lt;/iframe>
&lt;/div>
&lt;p>The tricky part is that if you use a scale transform to zoom a UILabel you’ll get pixellated text, which obviously won’t do. So when you start dragging the slider we instantly swap the font on the UILabel for the much bigger font we use in the final top position, and we counteract the change in size by applying an appropriate scale transform to the label, to shrink it to the same size as the original small font. There’s a slight pixel discrepancy here in the text rendering but you don’t notice it, its so fast.&lt;/p>
&lt;p>Anyway, with the pixellation solved, we can zoom from the shrunken large version of the font up to an identity scale transform in the final position where the Play button normally is (yes, we are animating constraints). When you release the slider, we reverse most of this — we keep the big font until it drops down to the lower position in the slider, and then swap the font and scale transform back out to the originals. If you look closely you can sometimes see this change happen at the end — we should put a crossfade on that! Of course we are applying some spring velocity to the movement of the label too but only the tiniest amount. Adam and I fiddle for ages with that stuff as we never want it to be obvious, but you do want it to be at least noticeable in terms of feel.&lt;/p>
&lt;p>Funnily enough after we launched Soundproof we noticed that the Soundcloud app added a similar time animation when scrubbing, but without zooming the text or fading out the rest of the UI. We didn’t copy it — and of course like ours more. It has the Jony Ive-ish “fiddle factor” which we intentionally build into everything we do.&lt;/p>
&lt;h3 id="whats-next-for-soundproof">What’s next for Soundproof?&lt;/h3>
&lt;p>&lt;strong>Marc:&lt;/strong> We have a 1.1 already in the pipeline with some nice feature additions, including more ways to get audio into the app, i.e. not just from the Music Library. We’ve also got more slow down options, which has been a frequent request from users. We’re not a slow-downer like Capo or AnyTune and never will be, but we can add more Soundproof-style options. Also, Watch support is coming…&lt;/p>
&lt;p>We have big plans beyond this of course, but… “Montana Floss Co. does not discuss future products” :)&lt;/p></content:encoded></item><item><title>Constraints &amp; Transformations</title><link>https://revealapp.com/news/constraints-transformations/</link><pubDate>Fri, 08 May 2015 00:00:00 +0000</pubDate><dc:creator>Vlas Voloshin</dc:creator><guid>https://revealapp.com/news/constraints-transformations/</guid><description>&lt;p>Building frameworks is hard, we all know that. It&amp;rsquo;s even harder when you&amp;rsquo;re building and maintaining a behemoth like UIKit and you have to make sure client code doesn&amp;rsquo;t break when a new version of your framework is released. Backward compatibility allows existing apps to keep functioning on newer versions of iOS, even if they are built for an older version. However, sometimes implementing new features with backward compatibility means introducing inconsistent behaviour between different versions of the framework.&lt;/p></description><content:encoded>&lt;p>Building frameworks is hard, we all know that. It&amp;rsquo;s even harder when you&amp;rsquo;re building and maintaining a behemoth like UIKit and you have to make sure client code doesn&amp;rsquo;t break when a new version of your framework is released. Backward compatibility allows existing apps to keep functioning on newer versions of iOS, even if they are built for an older version. However, sometimes implementing new features with backward compatibility means introducing inconsistent behaviour between different versions of the framework.&lt;/p>
&lt;h2 id="the-problem">The Problem&lt;/h2>
&lt;p>Prior to the release of iOS 8, mixing Auto Layout with view affine transformations was a shady business: some configurations just didn&amp;rsquo;t work as expected, so it was mostly avoided or worked around (&lt;em>&lt;a href="http://stackoverflow.com/q/12943107/1025776">this Stack Overflow question&lt;/a> on the topic has been quite popular&lt;/em>). But soon after iOS 8 was released it became apparent that one of the many changes Apple introduced was how Auto Layout and transformations interact. To illustrate, here are two screenshots of the same app running on iOS 7 and iOS 8:&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/constraints-transformations/sample-app-screenshot.jpg"
alt="Notice that on iOS 7, views in the left column are misplaced, while on iOS 8 they are positioned as expected.">&lt;figcaption>
&lt;p>Notice that on iOS 7, views in the left column are misplaced, while on iOS 8 they are positioned as expected.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>This app has three rows of transformed views: one for translation, one for rotation and one for scaling. Transformed views in the left column are laid out using Auto Layout, while transformed views in the right column are positioned manually by setting the &lt;code>center&lt;/code> property. The transforms themselves are the same across columns. There are also untransformed grey views that serve as &amp;ldquo;anchors&amp;rdquo; for the transformed views. Views in the left column are connected via Top and Leading constraints to their &amp;ldquo;anchor&amp;rdquo; views (though using Bottom, Trailing, Left or Right attributes would have similar results). Notice that on iOS 7, views in the left column are misplaced (red), while on iOS 8 they are positioned as expected (green). The sample app is &lt;a href="https://github.com/revealapp/ConstraintsFightTransforms">available on GitHub&lt;/a>.&lt;/p>
&lt;p>The behaviour of misplaced views is present when running iOS 7 or older, or when linking against iOS 7 SDK. Clearly, this looks like a fix introduced in iOS 8 with backward compatibility for older apps. What exactly is happening, and why?&lt;/p>
&lt;h2 id="investigation">Investigation&lt;/h2>
&lt;p>For the purposes of debugging this behaviour, we&amp;rsquo;ll focus on translation, since it&amp;rsquo;s the simplest example of the three. First, let&amp;rsquo;s launch &lt;a href="http://revealapp.com">Reveal&lt;/a> to take a quick look at the view hierarchy and attributes. Here&amp;rsquo;s how it looks on iOS 7:&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/constraints-transformations/ios7_attributes.jpg">
&lt;/figure>
&lt;p>Notice that the red view is visually offset by &lt;code>(-10, 10)&lt;/code> from its grey &amp;ldquo;anchor&amp;rdquo; view, while the green view is correctly offset by &lt;code>(-20, 20)&lt;/code>, which corresponds to its transform matrix. With the red view selected (a), you can also see that its alignment rect is misplaced (b), while for the green view (c) it correctly matches its &amp;ldquo;anchor&amp;rdquo; view (d).&lt;/p>
&lt;p>Let&amp;rsquo;s take a look at the same app running on iOS 8:&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/constraints-transformations/ios8_attributes.jpg">
&lt;/figure>
&lt;p>The views are now aligned, and all alignment rectangles match their &amp;ldquo;anchor&amp;rdquo; views. Clearly Auto Layout behaviour has changed: &lt;code>center&lt;/code> values of constraint-positioned views are not the same between iOS 7 and iOS 8.&lt;/p>
&lt;h3 id="diving-deeper">Diving Deeper&lt;/h3>
&lt;p>As a starting point in debugging this behaviour we&amp;rsquo;ll determine what alters the position of a view when using Auto Layout, as this appears to have changed between iOS 7 and iOS 8.&lt;/p>
&lt;p>We can do this by using the same sample app and overriding the &lt;code>setFrame:&lt;/code> and &lt;code>setCenter:&lt;/code> instance methods in the &lt;code>GradientView&lt;/code> class. By placing breakpoints in these methods we can see that the overridden &lt;code>setFrame:&lt;/code> method is not called by UIKit at all during layout on iOS 7 or iOS 8. Only the &lt;code>setCenter:&lt;/code> method is called to update the view&amp;rsquo;s position. This makes sense when dealing with transformed views, since the &lt;code>frame&lt;/code> property cannot be used reliably on views with a non-identity transformation applied:&lt;/p>
&lt;blockquote>
&lt;p>If the &lt;code>transform&lt;/code> property is not the identity transform, the value of this property is undefined and therefore should be ignored.
&amp;ndash; &lt;!-- raw HTML omitted -->&lt;a href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/index.html#//apple_ref/occ/instp/UIView/transform">UIView Class Reference&lt;/a>&lt;!-- raw HTML omitted -->&lt;/p>&lt;/blockquote>
&lt;p>The &lt;code>frame&lt;/code> property of a view is actually calculated by the underlying &lt;code>CALayer&lt;/code> as a derivative of the layer&amp;rsquo;s &lt;code>bounds&lt;/code>, &lt;code>anchorPoint&lt;/code>, &lt;code>position&lt;/code> and &lt;code>transform&lt;/code> properties in the parent layer&amp;rsquo;s coordinate space.&lt;/p>
&lt;p>The stack trace leading to the &lt;code>setCenter:&lt;/code> call during a layout pass reveals internal UIKit methods used to apply the layout:&lt;/p>
&lt;figure>&lt;img src="https://revealapp.com/news/constraints-transformations/stacktrace.jpg">
&lt;/figure>
&lt;p>With the help of &lt;a href="http://www.hopperapp.com/">Hopper&lt;/a> and using the &lt;code>_applyISEngineLayoutValues&lt;/code> method as a starting point, it is possible to disassemble UIKit and analyse its implementation of Auto Layout. It appears to have changed quite significantly in iOS 8, with a private function &lt;code>__UILayoutEngineSolutionIsInRationalEdges&lt;/code> now determining the &amp;ldquo;layout engine solution style&amp;rdquo; used throughout UIKit. &amp;ldquo;Layout engine&amp;rdquo; here refers to &lt;code>NSISLayoutEngine&lt;/code>: a private class in Foundation framework that implements the iterative linear arithmetic constraint solver, the heart of Auto Layout. The function itself returns &lt;code>YES&lt;/code> if the app is linked against iOS 8 SDK, and &lt;code>NO&lt;/code> otherwise, thus enabling backward compatibility with apps that haven&amp;rsquo;t been updated for iOS 8.&lt;/p>
&lt;p>Some of the methods that provide legacy behaviour depending on the layout solution style include:&lt;/p>
&lt;ul>
&lt;li>&lt;code>-[UIView setTransform:]&lt;/code>&lt;/li>
&lt;li>&lt;code>-[UIView setBounds:]&lt;/code>&lt;/li>
&lt;li>&lt;code>-[UIScrollView setContentInset:]&lt;/code>&lt;/li>
&lt;li>&lt;code>-[UIScrollView _nsis_contentSize]&lt;/code>&lt;/li>
&lt;li>&lt;code>-[UIWindow _initializeLayoutEngine]&lt;/code>&lt;/li>
&lt;li>&lt;code>-[UIView _updateLayoutEngineHostConstraints]&lt;/code>&lt;/li>
&lt;li>&lt;code>-[UIView _preferredLayoutEngineToUserScalingCoefficients]&lt;/code>&lt;/li>
&lt;li>… and more.&lt;/li>
&lt;/ul>
&lt;p>Critically, the layout solution style also determines which method is used to convert the solution from the solver into the resulting view geometry:&lt;/p>
&lt;ul>
&lt;li>&lt;code>_nsis_origin:bounds:inEngine:&lt;/code> method is used with &amp;ldquo;legacy&amp;rdquo; solution style. Its implementation performs geometry calculations that take view&amp;rsquo;s &lt;code>transform&lt;/code> property into account, which corresponds to the behaviour we can see on iOS 7.&lt;/li>
&lt;li>&lt;code>_nsis_center:bounds:inEngine:&lt;/code> method is used with &amp;ldquo;modern&amp;rdquo; solution style. Its implementation doesn&amp;rsquo;t use view&amp;rsquo;s transform matrix, so the results of its calculations are unaffected by the applied transformations.&lt;/li>
&lt;/ul>
&lt;h2 id="conclusions">Conclusions&lt;/h2>
&lt;p>As it turns out, the observed differences in the behaviour of Auto Layout between iOS 7 and iOS 8 are caused by a deliberate change in UIKit. View transformations no longer seem to factor into Auto Layout&amp;rsquo;s calculations.&lt;/p>
&lt;p>So what does this mean in practice?&lt;/p>
&lt;p>If your app:&lt;/p>
&lt;ul>
&lt;li>Links against the iOS 8.0 SDK or later, and&lt;/li>
&lt;li>Supports iOS 7, and&lt;/li>
&lt;li>Uses Auto Layout on views with non-identity transforms&lt;/li>
&lt;/ul>
&lt;p>You may have to resort to one of the following workarounds:&lt;/p>
&lt;ul>
&lt;li>If you&amp;rsquo;re only using rotation and/or scaling transformations, try using Centre X/Centre Y constraints instead of &lt;!-- raw HTML omitted -->Top/Bottom/Left/Right/Trailing/Leading&lt;!-- raw HTML omitted --> constraints: if the transformed view is laid out by its centre, results tend to be correct.&lt;/li>
&lt;li>Place any transformed views inside a container view, and:
&lt;ul>
&lt;li>Constrain the container view rather than the transformed view.&lt;/li>
&lt;li>The transformed view could be laid out in the container either manually, or using Centre X and Centre Y constraints. Using Equal Width/Height constraints between the transformed view and container view, however, will not give expected results in this case.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Do not use explicit constraints for these views: use autoresizing masks. Fall back to the behaviour provided by UIKit for views with &lt;code>translatesAutoresizingMaskIntoConstraints&lt;/code> property being &lt;code>YES&lt;/code>. You will probably need to configure the &lt;code>autoresizingMask&lt;/code> property of your views in code.&lt;/li>
&lt;/ul>
&lt;p>If your app doesn&amp;rsquo;t need to support iOS 7, you&amp;rsquo;re in luck! Auto Layout&amp;rsquo;s behaviour in iOS 8 and higher is more obvious and correct.&lt;/p>
&lt;p>I do wish that Apple had been more transparent when introducing these changes: this would have allowed developers to make more informed decisions without going through trial, error and disassembly. It also would have made it easier to update apps to support the latest versions of the system frameworks.&lt;/p></content:encoded></item><item><title>A new home</title><link>https://revealapp.com/news/a-new-home/</link><pubDate>Thu, 07 May 2015 00:00:00 +0000</pubDate><dc:creator>Sean Woodhouse</dc:creator><guid>https://revealapp.com/news/a-new-home/</guid><description>&lt;p>For the past year and a half we&amp;rsquo;ve been posting &lt;a href="http://www.ittybittyapps.com">Itty Bitty Apps&lt;/a> and &lt;a href="https://revealapp.com/">Reveal&lt;/a> related content to our &lt;a href="http://blog.ittybittyapps.com/">Itty Bitty Labs&lt;/a> blog. After releasing &lt;a href="https://revealapp.com/features/">Reveal 1.5&lt;/a> we felt it was high time Reveal had a dedicated blog, so here it is!&lt;/p>
&lt;p>We&amp;rsquo;ll deep dive in to Reveal best practices, highlight new features, investigate interesting aspects of iOS and keep you up to date with our plans. We&amp;rsquo;ll also be publishing a new series of articles called &lt;em>Revealed&lt;/em>, where we interview developers and find out their tricks of the trade for creating amazing, immersive user experiences on iOS.&lt;/p></description><content:encoded>&lt;p>For the past year and a half we&amp;rsquo;ve been posting &lt;a href="http://www.ittybittyapps.com">Itty Bitty Apps&lt;/a> and &lt;a href="https://revealapp.com/">Reveal&lt;/a> related content to our &lt;a href="http://blog.ittybittyapps.com/">Itty Bitty Labs&lt;/a> blog. After releasing &lt;a href="https://revealapp.com/features/">Reveal 1.5&lt;/a> we felt it was high time Reveal had a dedicated blog, so here it is!&lt;/p>
&lt;p>We&amp;rsquo;ll deep dive in to Reveal best practices, highlight new features, investigate interesting aspects of iOS and keep you up to date with our plans. We&amp;rsquo;ll also be publishing a new series of articles called &lt;em>Revealed&lt;/em>, where we interview developers and find out their tricks of the trade for creating amazing, immersive user experiences on iOS.&lt;/p>
&lt;p>In the mean time, Vlas kicks off with an &lt;a href="https://revealapp.com/news/constraints-and-transforms">investigation in to the behaviour of Auto Layout constraints and transformations&lt;/a> across iOS 7 &amp;amp; 8.&lt;/p>
&lt;p>Enjoy!&lt;/p></content:encoded></item></channel></rss>