<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Squarespace Site Server v5.11.81 (http://www.squarespace.com/) on Fri, 18 May 2012 18:27:21 GMT--><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>UI, You, &amp;, I</title><link>http://www.stuartjmoore.com/blog/</link><description></description><lastBuildDate>Mon, 30 Apr 2012 22:03:39 +0000</lastBuildDate><copyright></copyright><language>en-US</language><generator>Squarespace Site Server v5.11.81 (http://www.squarespace.com/)</generator><item><title>Gmail Button Order</title><dc:creator>Stuart J Moore</dc:creator><pubDate>Thu, 19 Apr 2012 14:22:48 +0000</pubDate><link>http://www.stuartjmoore.com/blog/2012/4/19/gmail-button-order.html</link><guid isPermaLink="false">1003624:11541353:15912907</guid><description><![CDATA[<p><span class="thumbnail-image-block ssNonEditable"><span><a href="javascript:showFullImage('/display/ShowImage?imageUrl=%2Fstorage%2F1.png%3F__SQUARESPACE_CACHEVERSION%3D1334846434542',141,819);"><img src="http://www.stuartjmoore.com/storage/thumbnails/11541352-14264353-thumbnail.jpg?__SQUARESPACE_CACHEVERSION=1334846434543" alt="" /></a></span></span>I recently noticed that a few emails from colleagues&nbsp;had been going into my spam folder for a month or two now. I never check my spam folder (it's fill within a day), so this was easy to over look and it definitely caused a problem.</p>
<p>&nbsp;</p>
<p>How did it happen? I reported the email as spam. I didn't mean to, it was a slip of mouse. Was it my fault for being careless, or Google's for putting two vastly opposite functions next to eachother?</p>
<p>&nbsp;</p>
<p><span class="thumbnail-image-block ssNonEditable"><span><a href="javascript:showFullImage('/display/ShowImage?imageUrl=%2Fstorage%2F2.png%3F__SQUARESPACE_CACHEVERSION%3D1334846449672',141,819);"><img src="http://www.stuartjmoore.com/storage/thumbnails/11541352-14264366-thumbnail.jpg?__SQUARESPACE_CACHEVERSION=1334846449673" alt="" /></a></span></span></p>
<p>&nbsp;</p>
<p>I archive a lot of emails. Keeping inbox zero consisently isn't easy. I sometimes delete an automated message that has no historical value. I rarely report spam, since Google does a great job.</p>
<p>&nbsp;</p>
<p>Archiving has a pretty low risk, I can always unarchive it. Same with deleting, although it may be permently deleted in 30 days. Reporting spam is a high risk, not only will it be delete in 30 days, but the next few messages won't show up in your inbox.</p>
<p>&nbsp;</p>
<p>Why are the two polar oposite buttons next to each other? Sure, all three buttons "move the email", but I don't always think of it in those terms. And how do I un-report spam? I still can't be sure that Google knows I made a mistake.</p>
<p>&nbsp;</p>
<p><span class="thumbnail-image-block ssNonEditable"><span><a href="javascript:showFullImage('/display/ShowImage?imageUrl=%2Fstorage%2F3.png%3F__SQUARESPACE_CACHEVERSION%3D1334846463881',141,819);"><img src="http://www.stuartjmoore.com/storage/thumbnails/11541352-14264374-thumbnail.jpg?__SQUARESPACE_CACHEVERSION=1334846463882" alt="" /></a></span></span></p>
<p>&nbsp;</p>
<p>Just a quick shift. It seems odd at first. "Back", "move email", "modifiy", "move", "more". Separating the three move buttons? Separating the action buttons by drop down buttons?</p>
<p>&nbsp;</p>
<p><span class="full-image-block ssNonEditable"><span><img style="width: 656px;" src="http://www.stuartjmoore.com/storage/4.png?__SQUARESPACE_CACHEVERSION=1334846473478" alt="" /></span></span></p>
<p>&nbsp;</p>
<p>There are two types of email: good and bad. Save and tag the good ones, delete and report the bad. The buttons are aligned to your thoughts, not the email.</p>
<p>&nbsp;</p>
<p>What else? Maybe the "report spam" button could appear after you delete an email. Google already shows an "undo" link, a spam link wouldn't be much of a stretch. Of course, this would drastically decrease the number of people who report spam.</p>]]></description><wfw:commentRss>http://www.stuartjmoore.com/blog/rss-comments-entry-15912907.xml</wfw:commentRss></item><item><title>Number Only Keyboard for iPad</title><dc:creator>Stuart J Moore</dc:creator><pubDate>Wed, 22 Feb 2012 13:31:33 +0000</pubDate><link>http://www.stuartjmoore.com/blog/2012/2/22/number-only-keyboard-for-ipad.html</link><guid isPermaLink="false">1003624:11541353:15141866</guid><description><![CDATA[<p><span class="thumbnail-image-block ssNonEditable"><a href="javascript:showFullImage('/display/ShowImage?imageUrl=%2Fstorage%2Fkeyboard.png%3F__SQUARESPACE_CACHEVERSION%3D1329917600707',352,1024);"><img src="http://www.stuartjmoore.com/storage/thumbnails/11541352-16740141-thumbnail.jpg?__SQUARESPACE_CACHEVERSION=1329917600708" alt="" /></a></span></p>
<p>&nbsp;</p>
<p>The iPad doesn't have a way to enter only numbers into a UITextField. Sure, you can use "numbers and punctuation", but that still gives the user a chance to enter errorous data.</p>
<p>&nbsp;</p>
<p>To use:</p>
<pre><code>keyboard = [[NumberKeyboard alloc] initWithNibName:@"NumberKeyboard" bundle:nil];
keyboard.textField = youTextField;
keyboard.showsPeriod = NO;
youTextField.inputView = keyboard.view;</code></pre>
<p>&nbsp;Also, release the keyboard in dealloc and #include "NumberKeyboard.h".</p>
<p>&nbsp;</p>
<p>The GitHub project includes streatchable images for most key rows, so you can modify it into any number of different keyboards. It also has the PSD; the skys the limit.</p>
<p>&nbsp;</p>
<p><a href="https://github.com/stuartjmoore/NumberKeyboard">https://github.com/stuartjmoore/NumberKeyboard</a></p>]]></description><wfw:commentRss>http://www.stuartjmoore.com/blog/rss-comments-entry-15141866.xml</wfw:commentRss></item><item><title>YouTube Icon for ICS</title><dc:creator>Stuart J Moore</dc:creator><pubDate>Mon, 23 Jan 2012 01:38:53 +0000</pubDate><link>http://www.stuartjmoore.com/blog/2012/1/22/youtube-icon-for-ics.html</link><guid isPermaLink="false">1003624:11541353:14690935</guid><description><![CDATA[<p>After reading the <a href="http://developer.android.com/design/index.html">Android Design guidelines</a>, I found a new appreciation&nbsp;and understanding for some subtle parts of the OS. The difference between &ldquo;back&rdquo; and &ldquo;up&rdquo; for instance (which seems a little confusing for any user, let alone new ones.</p>
<p>&nbsp;</p>
<p>But, I also learned to hate some of the non-guideline following apps. Especially&nbsp;the Google ones. I always knew I didn't like the Google Voice app (the app I use 90% of the time), and now I can point to exactly why!</p>
<p>&nbsp;</p>
<p>Since the YouTube app has the worst icon, and YouTube is slowly rebranding itself, I decided to whip up an icon that matches the guidelines and their new brand direction. Have fun.</p>
<p style="text-align: center;"><img src="http://www.stuartjmoore.com/storage/youtube.png?__SQUARESPACE_CACHEVERSION=1327283258485" alt="" /></p>
<p style="text-align: left;"><a href="http://dl.dropbox.com/u/3640/youtube.psd">A PSD may be here</a>.</p>]]></description><wfw:commentRss>http://www.stuartjmoore.com/blog/rss-comments-entry-14690935.xml</wfw:commentRss></item><item><title>Hovering Tweets</title><category>Criticism</category><dc:creator>Stuart J Moore</dc:creator><pubDate>Sun, 11 Dec 2011 16:44:54 +0000</pubDate><link>http://www.stuartjmoore.com/blog/2011/12/11/hovering-tweets.html</link><guid isPermaLink="false">1003624:11541353:14063536</guid><description><![CDATA[<p>I've noticed on the new Twitter web app a curious hover/click behavior. When you load up the website, you get a list of tweets, like so:</p>
<p>&nbsp;</p>
<p style="text-align: center;"><span class="full-image-block ssNonEditable"><span><img src="http://www.stuartjmoore.com/storage/hoveringtweets-01.png?__SQUARESPACE_CACHEVERSION=1323622043066" alt="" /></span></span></p>
<p>&nbsp;</p>
<p>Then, when you move your cursor over one of the tweets, you see your pointer change to the hand (the universal symbol for clickable):</p>
<p>&nbsp;</p>
<p style="text-align: center;"><span class="full-image-block ssNonEditable"><span><img src="http://www.stuartjmoore.com/storage/hoveringtweets-02.png?__SQUARESPACE_CACHEVERSION=1323622794314" alt="" /></span></span></p>
<p>&nbsp;</p>
<p>The highlighted red area is the clickable area, or at least it seems to be the clickable area. It's assumed that buttons are one solid shape (most likely a rectangle). But in this instance, there are links contained inside of the entire tweet, creating the button with holes.</p>
<p>&nbsp;</p>
<p style="text-align: center;"><span class="full-image-block ssNonEditable"><span><img src="http://www.stuartjmoore.com/storage/hoveringtweets-03.png?__SQUARESPACE_CACHEVERSION=1323622592227" alt="" /></span></span></p>
<p>&nbsp;</p>
<p>This doesn't seem to be a problem, there is still plenty of area to click on the tweet after all. And it's unlikely you'll try and click the non-white space (&agrave; la the instragram link), but the white space changes upon hover. The "reply", "retweet", "favorite", and "open" links don't appear until you're hovering over the tweet. So, as you're speeding your mouse cursor over the tweet to expand it, new links get in your way and cause and accidental and unpleasant click.</p>
<p>&nbsp;</p>
<p>The design is similar to the iPhone and Android apps. The tweet is so small, and your thumb so big, that the entire tweet needs to be a button allowing you to perform actions on it. But the tweet is only one button, there are no links inside of it. This design pattern is brought over to the web app, but as it's on the web, links are added (since there's a lot more room).</p>
<p>&nbsp;</p>
<p>I would leave the clickable areas at just:</p>
<p>&nbsp;</p>
<p style="text-align: center;"><span class="full-image-block ssNonEditable"><span><img src="http://www.stuartjmoore.com/storage/hoveringtweets-04.png?__SQUARESPACE_CACHEVERSION=1323623930623" alt="" /></span></span></p>
<p>&nbsp;</p>
<p>The entire tweet will still be a hoverable area to reveal the "reply", etc. links.</p>
<p>&nbsp;</p>
<p>Minimizing the clickable area to expand the tweet sounds counterintuitive, but I think it would greatly ease the user experience. In this instance, the area isn't being modified as I'm moving my mouse.</p>]]></description><wfw:commentRss>http://www.stuartjmoore.com/blog/rss-comments-entry-14063536.xml</wfw:commentRss></item><item><title>Redesigning Quora - The TabBar</title><category>Criticism</category><dc:creator>Stuart J Moore</dc:creator><pubDate>Sun, 30 Oct 2011 03:47:04 +0000</pubDate><link>http://www.stuartjmoore.com/blog/2011/10/29/redesigning-quora-the-tabbar.html</link><guid isPermaLink="false">1003624:11541353:13521731</guid><description><![CDATA[<p>When the Quora app for iPhone was released, there was much fan-fair. I'm not a huge Quora user, but this certainly caught my eye. I couldn't help but take a look and was surprised by the UI. Not in a good way.</p>
<p>&nbsp;</p>
<p>As a start-up darling (at least at the time), I thought Quora would have a better design. The standard iPhone UI elements weren't even the worst part. Just looking at the the screenshots alone confused me. "Home"? "Search <em>and</em>&nbsp;Add"? Add what? Notifications are a tab? None of it sat well with me.</p>
<p>&nbsp;</p>
<p style="text-align: center;"><span class="full-image-inline ssNonEditable"><span><img src="http://www.stuartjmoore.com/storage/quora-tabbar-1.png?__SQUARESPACE_CACHEVERSION=1325601798040" alt="" /></span></span></p>
<p style="text-align: center;"><span class="full-image-inline ssNonEditable"><span><br /></span></span></p>
<p>If there's one thing wrong with the app, it's that its designed with a web browser in mind. Web apps and native apps may be converging slowly, but they still have destinctive UI elements. A web app can't look like an iPhone app, just as an iPhone app can't look like an Android app.</p>
<p>&nbsp;</p>
<p>"Home"? iPhone apps don't have a home. There are main pages, but they are never titled "home".</p>
<p>&nbsp;</p>
<p>Notifications are meant to seek you out, not you seek them out. Notifications are only new items for you to check out, they don't persist as an entire tab.</p>
<p>&nbsp;</p>
<p>Search is a great option, as is adding a question. But they really shouldn't be shoved into one tab. If I want to ask a question, where does my instinct lead me? "Search &amp; Add" definitely isn't my first choice. I don't want to search, I just want to ask a question (the system wants me to search so I don't add redundant questions). Search &amp; add is easy to get away with on a web app because you can have a persisant textbox with the placeholder text "Search for or ask a question". App space is more limited.</p>
<p>&nbsp;</p>
<p>Nearby seems pretty useless to me. When it comes down to it, it's just another way to search.</p>
<p>&nbsp;</p>
<p>Profile is fine, ignoring any minor graphical errors.</p>
<p>&nbsp;</p>
<p><strong>Changes</strong></p>
<p>&nbsp;</p>
<p>The tabBar is the most important part of the app. It's the top most level of your UI. It lays out the entire organization of your content, so getting it right is nessecary. Here's how I would fix their layout:</p>
<p>&nbsp;</p>
<p style="text-align: center;"><span class="full-image-block ssNonEditable"><span><img src="http://www.stuartjmoore.com/storage/quora-tabbar-2.png?__SQUARESPACE_CACHEVERSION=1325601810336" alt="" /></span></span></p>
<p style="text-align: center;">&nbsp;</p>
<p>The "Home" tab is fine in and of itself (I'll get to the list later), but it needs a new name. "Questions" works.</p>
<p>&nbsp;</p>
<p>Search needs to be its own tab. Even if Search allows you to add a question, the user sees that as a last resort, not as an initial interaction.</p>
<p>&nbsp;</p>
<p>Same goes for "Ask" (not add). When the user tries to ask a question that has been asked before, the app can still search and intercept them before they do. Just as with a lot of apps these days, the "Ask" tab is more of a button. It stands out and is centered, because it's an action that behoves both the user and the app.</p>
<p>&nbsp;</p>
<p>"Notifications" is renamed to "Activity" because activity is persistant, notifications are not. I really wanted to hide the activity under the "Profile" tab, but this way keeps the symmetry. Activity being under profile wouldn't be such an issue, since users only need to tap on the tab when there is something to check out. When the activity tab doesn't have the red number above it, it's essentially useless.</p>
<p>&nbsp;</p>
<p>"Nearby" has been completely removed and combined into "Search" (just as "Shuffle" is in "Home"). "Profile" is unchanged.</p>
<p>&nbsp;</p>
<p>I forgot to mention the "About" button on the "Home" tab. This view is mostly FAQ and privacy policy, something apps don't usually include. Although you can't see it, the "About" section is moved to the settings app, as is with most apps.</p>
<p>&nbsp;</p>
<p><strong>Next?</strong></p>
<p>&nbsp;</p>
<p>There are still plenty of web to app translations that need to be done. Lists are definitely number one on my list, seeing as how they allow for the most creativity in this instance.</p>]]></description><wfw:commentRss>http://www.stuartjmoore.com/blog/rss-comments-entry-13521731.xml</wfw:commentRss></item><item><title>Transparent ModalViewController</title><dc:creator>Stuart J Moore</dc:creator><pubDate>Tue, 11 Oct 2011 23:02:30 +0000</pubDate><link>http://www.stuartjmoore.com/blog/2011/10/11/transparent-modalviewcontroller.html</link><guid isPermaLink="false">1003624:11541353:13166451</guid><description><![CDATA[<p>Working on a new app, I wanted to have a membership card slide up and dim the background of the current view. Since the card has a few features, and can be presented from multiple view controllers, I decided to present it as a modal view.</p>
<p>&nbsp;</p>
<p>Although modal views (on iOS) can't have transparent backgrounds, because the parent view is no longer drawn. The solution? Take a screenshot and put it behind the card. It's fast and simple.</p>
<p>&nbsp;</p>
<p><script src="https://gist.github.com/1279713.js"> </script></p>
<p><a href="https://gist.github.com/1279713">https://gist.github.com/1279713</a></p>]]></description><wfw:commentRss>http://www.stuartjmoore.com/blog/rss-comments-entry-13166451.xml</wfw:commentRss></item><item><title>SMHeadedList</title><category>Code</category><dc:creator>Stuart J Moore</dc:creator><pubDate>Wed, 21 Sep 2011 16:06:15 +0000</pubDate><link>http://www.stuartjmoore.com/blog/2011/9/21/smheadedlist.html</link><guid isPermaLink="false">1003624:11541353:12936992</guid><description><![CDATA[<div></div>
<div>I&rsquo;ve been writing a game for a while now. I&rsquo;m testing the game on an unreleased beta version of an OS that may or may not be under NDA for a little while longer. One of the built in apps that my game connects to got a bit of an interface lift for the new OS and I&rsquo;ve been staring at it non-stop. <br /><br />The app has a few new features, but one list caught my eye. At first, the UI was kind of interesting, but the more I swiped up and down, the more I had to know how it was done. I had my ideas, but the only way to figure it out was code it myself.<br /><br />The list looks and acts like a simple table. The &ldquo;title&rdquo; element will scroll with the list and stay at the top, just like a UITableView.</div>
<div>&nbsp;<span style="text-align: center;">&nbsp; &nbsp; &nbsp;&nbsp;</span></div>
<div>There is one key difference though, the scroll bar only appears below &ldquo;title&rdquo;. Sounds like a simple change, but it&rsquo;s certainly not easy to do.</div>
<div></div>
<div>And, just to keep up with the app that I&rsquo;m mimicking, the &ldquo;header&rdquo; section either fully appears or is hidden (it scrolls away if it&rsquo;s less than half shown). I could have added a few buttons to the &ldquo;title&rdquo; as well, but that&rsquo;s easy.</div>
<div><br /><strong>Code</strong><br /><br />If you don&rsquo;t need to read my explanation (you don&rsquo;t, the code is shockingly simple), then you can get <a href="https://github.com/stuartjmoore/SMHeadedList">the full code over at GitHub now</a>.<br /><br />I figured that the view called for a UITableView inside a UITableView, but syncing those two up would be the problem to solve. So, I started there. Could I subclass the tables and call TouchesMoved between them? No, because UIScrollView traps those methods (and HitTest doesn&rsquo;t update after the initial touch). I was left with using the delegate scroll view methods and key-value observers (KVO).</div>
<div></div>
<div><span style="text-align: center;">You&rsquo;ll notice that the items table (inside the second row of the header table) dips below the iPhone&rsquo;s screen. Won&rsquo;t the scroll bar dip below the screen, too (step one of a poorly designed app)? No, because the items table (the view controlling the scroll bar) doesn&rsquo;t officially scroll until the header row is fully out of view. The items table&rsquo;s size is the size of the iPhone screen minus the status bar minus the title&rsquo;s height, so it will fill up the screen completely once you start scrolling.</span></div>
<div><br />Once it&rsquo;s all laid out, all that&rsquo;s left is to sync up the tables. I&rsquo;ll leave you to look at the code on GitHub (mostly because I want to clean it up still), but the idea is simple. <br /><br />First, scrolling by the user is disabled on the main header table and all HitTests on the first row are forwarded to the items table.<br /><br />Second, we observe (via KVO) all the scrolling done on the items table. If the user scrolls and the header row is still visible, we &ldquo;lock&rdquo; the items table by setting the offset to 0, 0 (unless it is already at zero, to avoid an infinite loop). Instead, we send the scroll value change on to the header table until it is out of view. A similar thing is done in reverse if the user is scrolling up to see the header again.<br /><br />Finally, we use the UIScrollViewDelegate&rsquo;s end of scrolling methods to snap the header into or out of view if the user is scrolling in that direction and they pass a certain threshold (I choose 20 to match the status bar height).<br /><br />Of course, get <a href="https://github.com/stuartjmoore/SMHeadedList">the full code over at GitHub</a>.</div>
<div style="text-align: left;"></div>]]></description><wfw:commentRss>http://www.stuartjmoore.com/blog/rss-comments-entry-12936992.xml</wfw:commentRss></item><item><title>NSLog</title><category>Code</category><dc:creator>Stuart J Moore</dc:creator><pubDate>Sat, 10 Sep 2011 20:31:27 +0000</pubDate><link>http://www.stuartjmoore.com/blog/2011/9/10/nslog.html</link><guid isPermaLink="false">1003624:11541353:12801073</guid><description><![CDATA[<p>I don't use gdb. It may be better, but debugging is just so much easier with NSLog. Sadly, it doesn't always work.</p>
<p>&nbsp;</p>
<p>I've been writing a simple game lately to get the hang of Cocos2D/Box2D. Out of all my apps, games just tend to sell better without much effort. The game is about a rabbit running and jumping, so of course, I need a boolean to determine when the rabbit is in the air to stop the player from hitting "run" and gaining speed while not on the ground.&nbsp;</p>
<p>&nbsp;</p>
<p>I first used contact listeners to determine when the rabbit left and hit the ground. But these were called for every body (the rabbit technically&nbsp;has three) and in no particular&nbsp;order. Since you had to make perfect contact with the ground, you weren't able to jump even if you were millimeters away from it. Even worse, the boolean would be erroneously&nbsp;set to "YES" if the player ran into a wall some of the time (update: figured out the bug and how to solve it thankfully).</p>
<p>&nbsp;</p>
<p>So, I came up with another idea that I should have used from the start: determine jumping based on the rabbit's vertical velocity. The ground is flat, so there's no need to worry about hills just yet. But the same problem of not being able to chain continuous&nbsp;jumps arose (a big issue for a game about speed). I tried to debug it using NSLog:</p>
<p>&nbsp;</p>
<p style="padding-left: 30px;">NSLog(@"%f %d", body-&gt;GetLinearVelocity.y, body-&gt;GetLinearVelocity.y == 0);</p>
<p>&nbsp;</p>
<p>Which printed out (0 meaning false):</p>
<p>&nbsp;</p>
<p style="padding-left: 30px;">0.0000 0</p>
<p>&nbsp;</p>
<p>GetLinearVelocity clearly printed out a value of zero, yet it doesn't equal zero? Is it a casting problem? A negetive zero problem? How could this be? I later figured out it was something simpler. Using:</p>
<p>&nbsp;</p>
<p style="padding-left: 30px;">NSLog(@"%0.10f %d", body-&gt;GetLinearVelocity.y, body-&gt;GetLinearVelocity.y == 0);</p>
<p>&nbsp;</p>
<p>Printed out:</p>
<p>&nbsp;</p>
<p style="padding-left: 30px;">0.0000000009 0</p>
<p>&nbsp;</p>
<p>Yeah, Box2D has some crazy precision&nbsp;apparently.</p>]]></description><wfw:commentRss>http://www.stuartjmoore.com/blog/rss-comments-entry-12801073.xml</wfw:commentRss></item><item><title>Infinite Scrolling</title><category>Trends</category><dc:creator>Stuart J Moore</dc:creator><pubDate>Tue, 23 Aug 2011 17:11:10 +0000</pubDate><link>http://www.stuartjmoore.com/blog/2011/8/23/infinite-scrolling.html</link><guid isPermaLink="false">1003624:11541353:12601400</guid><description><![CDATA[<p><span id="internal-source-marker_0.9533567680045962">User interface design, like all design, tends to have trends. One designer has a good idea to solve a problem, another evolves that idea to solve their own. Eventually, they go beyond trend to become fully fledged UI elements. Infinite scroll lists are reaching that destination.</span></p>
<p><span><br /></span></p>
<p><span>Typical scroll lists just move up and down, showing a predetermined number of rows. But infinite scroll lists have much more data, never switch to a new view, and can continue to scroll far beyond the user&rsquo;s needs.</span></p>
<p><span><br /></span></p>
<p><span>They can be best categorized even further as:</span></p>
<ul>
<li><span>Pull to refresh</span></li>
<li><span>Progressive loading</span></li>
<li><span>Truly infinite</span></li>
</ul>
<p>&nbsp;</p>
<p><span><strong>Pull to Refresh</strong></span></p>
<p><span><strong><br /></strong></span></p>
<p><span>The first such instance of an infinitely scrollable list [note: data pulled from my ass] would be Tweetie&rsquo;s &ldquo;pull to refresh&rdquo; action. It&rsquo;s very loosely infinite, but it allowed the user to see the newest tweets on their timeline by scrolling, not hitting a button or waiting for a timeout.</span></p>
<p>&nbsp;</p>
<p>When the user wants to see newer items, they scroll up. But if they&rsquo;re at the newest item, they hit a brick wall. The app knows the user is looking for newer data, and the server may have some, so it asks the user if they want to refresh. They can let go to not refresh or pull down further to ping the server.</p>
<p>&nbsp;</p>
<p><span>Not much to say here except that it is a great way to take the user&rsquo;s intended actions into account, instead of relying on them to tap a button.</span></p>
<p>&nbsp;</p>
<p><span><strong>Progressive Loading</strong></span></p>
<p>&nbsp;</p>
<p><span>Progressive loading is a lot like pull to refresh, except it&rsquo;s the opposite. When the user reaches the bottom of a list, the server is pinged for older data. The alternative is to provide &ldquo;next&rdquo; and &ldquo;previous&rdquo; buttons. But, depending on the data, why make a user paginate through multiple views? If they&rsquo;re at the bottom, just load the rest of the list.</span></p>
<p>&nbsp;</p>
<p><span>This is where infinite scrolling gets interesting. The assumption is that the older data is so vast, the user may never be able to reach the end. Progressive loading allows a server to send all the data eventually when needed, instead of sending gigabytes of it at once. But, there are a few problems with loading progressively.</span></p>
<p>&nbsp;</p>
<p><span><em>Smoothness</em></span></p>
<p>&nbsp;</p>
<p><span>Everything about computers needs to be smooth, especially scrolling. Loading more data at the end of a list tends to create a &ldquo;jump&rdquo;. You&rsquo;re scrolling down a page, 40 pixels at a time, and your last scroll is only 15 pixels to the end of the page. Suddenly, the rest of the content is loaded and you&rsquo;re scrolling at 40 pixels again. Not very smooth.</span></p>
<p>&nbsp;</p>
<p><span>Google+ handles this very well. They progressively load your photos as you scroll down, but the call is made early enough, and possibly only for size data, that the rest of the images fade in seamlessly. You almost don&rsquo;t notice the scrollbar getting smaller and smaller.</span></p>
<p>&nbsp;</p>
<p>Twitter&rsquo;s web app tries, but falls a little short. The loading doesn&rsquo;t occur until you reach the very bottom (causing a jump), as noted by the indicator. Scrolling is interrupted, since you can&rsquo;t scroll until the tweets have loaded, leaving the user with lost input. The jump and lost scrolling makes following where you are a little difficult, unlike in Google+.</p>
<p>&nbsp;</p>
<p><em>Bottom Content</em></p>
<p>&nbsp;</p>
<p><span>I can&rsquo;t believe I have to say this, but if you load progressively, don&rsquo;t put content </span><span>below</span><span> the infinite scroll list. If the user scrolls down to click a link and the page loads another 1,000 pixels of content, that link will disappear far below their cursor.</span></p>
<p>&nbsp;</p>
<p><span>Twitter solved this by putting the typical &ldquo;bottom content&rdquo; at the bottom of a right-aligned column, out of the way of the infinite list. But Facebook wasn&rsquo;t so smart. They left their bottom content there, right below the list. Now, every time the user wants to click on &ldquo;Advertising&rdquo;, they have to do battle with the progressive loading of their friend&rsquo;s news. What&rsquo;s worse is how random the loading seems.</span></p>
<p>&nbsp;</p>
<p><span><strong>Truly infinite</strong></span></p>
<p>&nbsp;</p>
<p><span>I have yet to see an example of this, but I&rsquo;m sure it could exist. Pull to refresh is only reloaded when there is something new, Progressive loading has a limit to how much is stored in the database, but truly infinite lists could theoretically never stop.</span></p>
<p>&nbsp;</p>
<p><span>A truly infinite list wouldn&rsquo;t load data, because data is finite, it would have to be used for something that expands forever. Numbers most likely. A calendar that scrolls (instead of kitschly paginating the months away in 3D) would be truly infinite while progressively loading the event data. Time doesn&rsquo;t end, why should a calendar?</span></p>
<p>&nbsp;</p>
<p><span>This creates a problem for scrollbars. Scrollbars tell you where you are; a sort of progress bar. They allow you to move easily within a list (although scroll wheels have largely replaced that). How would a scrollbar for a truly infinite list work? </span></p>]]></description><wfw:commentRss>http://www.stuartjmoore.com/blog/rss-comments-entry-12601400.xml</wfw:commentRss></item><item><title>Capacitive Buttons, In Defense of</title><category>Devil’s Advocate</category><dc:creator>Stuart J Moore</dc:creator><pubDate>Fri, 12 Aug 2011 20:37:25 +0000</pubDate><link>http://www.stuartjmoore.com/blog/2011/8/12/capacitive-buttons-in-defense-of.html</link><guid isPermaLink="false">1003624:11541353:12499303</guid><description><![CDATA[<p id="internal-source-marker_0.4411202010232955" dir="ltr"><span>What a better way to start a new blog then to write a counterpoint to someone you look up to? Lukas Mathis, of </span><a href="http://ignorethecode.net/"><span>ignorethecode.net</span></a><span> and </span><a href="http://pragprog.com/titles/lmuse/designed-for-use"><span>Designed for Use</span></a><span>, argues that </span><a href="http://ignorethecode.net/blog/2011/07/04/the_capacitive_button_cult_must_be_stopped/"><span>capacitive buttons are a detriment</span></a><span> </span><span>to not only phones, but all devices that use them.</span></p>
<p>&nbsp;</p>
<p dir="ltr"><span>I certainly don&rsquo;t feel so strongly for or against these buttons. I&rsquo;ve never really give them much thought&mdash;expect for on the 3rd generation iPod, where I had nothing but disdain for them. They work the way I expect and never misfire. Well, let&rsquo;s think about them.</span></p>
<p>&nbsp;</p>
<p dir="ltr"><span><strong>Pros</strong></span></p>
<ul>
<li>
<p dir="ltr"><span>Low failure rate (I&rsquo;m tempted to say no failure rate)</span></p>
</li>
<li>
<p dir="ltr"><span>Sexy (If only I could find a woman who lit up)</span></p>
</li>
<li>
<p dir="ltr"><span>Notifications (WebOS alerts you without wasting battery for the LCD)</span></p>
</li>
</ul>
<p dir="ltr"><span><strong>Cons</strong></span></p>
<ul>
<li>
<p dir="ltr"><span>Accidental touches</span></p>
</li>
</ul>
<p>&nbsp;</p>
<p dir="ltr"><span><strong>Touchscreens</strong></span></p>
<p>&nbsp;</p>
<p dir="ltr"><span>We can probably agree that any phone worth it&rsquo;s weight these days is a touchscreen smartphone. And any capacitive buttons are situated right below said touchscreen. Are they so different? Grazing either will result in an undesired action; people know to keep their hands off. Capacitive buttons are never moving from the chin of the phone (where nobody holds it) and always resulting in the same action (back button silliness notwithstanding). They&rsquo;re more static extensions of &nbsp;the touchscreen than anything else. </span></p>
<p>&nbsp;</p>
<p dir="ltr"><span><strong>iPhone</strong></span></p>
<p>&nbsp;</p>
<p dir="ltr"><span>The iPhone doesn&rsquo;t use capacitive buttons. There&rsquo;s one way and one way only to exit an app: the physical home button. Any &ldquo;accidental presses&rdquo; are handled by the app, because they only happen at that level. But how many times do you press that home button each time you use your phone? At least once, and sadly, it feels like the cheapest button on the phone. Double clicking for multitasking is painful since your thumb just doesn&rsquo;t rotate as well as your index finger.</span></p>
<p>&nbsp;</p>
<p dir="ltr"><span><strong>Android</strong> </span><span>&amp; </span><span><strong>Windows Phone 7</strong></span></p>
<p>&nbsp;</p>
<p dir="ltr"><span>Android and Windows Phone 7 use three or four capacitive buttons just below the touchscreen. These are the phones that have stirred the controversy. I&rsquo;ve never used WP7, but I can assume the same things hold true as they do for the Nexus S. Pressing the home button will <span title="Multitasking is moot. The app disappears; it's closed.">&ldquo;close&rdquo;</span> the current app. The back button will take you back one screen until the app closes. The search button will change to search mode. And the menu button will toggle the menu. These are all radically different interactions.</span></p>
<p>&nbsp;</p>
<p dir="ltr"><span>Accidentally pressing the home button means finding the apps icon again (who knows where you put it?). Pressing the back button means redoing your last action (or finding the app icon). The search and menu button mean pressing them once more to toggle back.</span></p>
<p>&nbsp;</p>
<p dir="ltr"><span><strong>WebOS</strong></span></p>
<p>&nbsp;</p>
<p dir="ltr"><span>WebOS cherishes its capacitive area. It&rsquo;s more than just a button, it&rsquo;s also a swipe gesture pad. Instead of wasting 44 pixels for a navigation bar just to get back one screen, WebOS phones have the user swipe back just below the touchscreen. The home button doesn&rsquo;t close an app, it just pushes it back a few virtual inches so you can get to your other apps. </span></p>
<p>&nbsp;</p>
<p dir="ltr"><span>I&rsquo;d be shocked if anyone swiped without meaning to. I can see hitting the home button unintentionally, but so what? The app just moves back a little. Nothing is destroyed and returning to your task is one tap away.</span></p>
<p>&nbsp;</p>
<p dir="ltr"><span><strong>Destruction</strong></span></p>
<p>&nbsp;</p>
<p dir="ltr"><span>There&rsquo;s the true con: destruction. When you graze the iPhone screen, only the app reacts, not the system. When you tap Android&rsquo;s menu button, it just toggles the menu&mdash;something that&rsquo;s easy to undo. But when you hit Android&rsquo;s home button, good luck finding that app in your mess of icons.</span></p>
<p>&nbsp;</p>
<p dir="ltr"><strong><span>Confirm </span><span>or </span><span>Undo</span></strong></p>
<p>&nbsp;</p>
<p dir="ltr"><span>Whenever the user is about to do a destructive task, the system should give them two back-up options: confirm or undo. Android buttons undo (albeit though multiple steps at times). It makes the most sense, who wants to see &ldquo;do you want to close this app? Yes or No&rdquo; everytime they want to do something else?</span></p>
<p>&nbsp;</p>
<p dir="ltr"><span>Well, WebOS confirms. If you didn&rsquo;t mean to hit the home button, just tap the app again to cancel. If you wanted to close it, just swipe it up and throw it out. It&rsquo;s not as simple as pressing down hard to close an iPhone app, but it&rsquo;s a lot more elegant than grazing to close an Android app.</span></p>
<p>&nbsp;</p>
<p dir="ltr"><span><strong>Solution</strong></span></p>
<p>&nbsp;</p>
<p dir="ltr"><span>Since Android is the only one with the problem (and I&rsquo;ve never used Windows Phone 7), it&rsquo;s the only one that needs a solution (short of getting rid of them). Search and menu are fine, they&rsquo;re toggles. </span><a href="http://www.istartedsomething.com/20110803/idea-for-a-more-accident-friendly-wp7-search-button/"><span>Long pressing</span></a><span> is okay, but that can be used for other things (multitasking). The best option, as I see it, is to turn home into a toggle. Currently, the stock home button does nothing on the home screen itself (although I have mine set up to load the app drawer). What if it loaded the last app? An easy undo for grazers, and a quick toggle back and forth for people who have fancy widgets they want to check. The back button has plenty of problems, but disabling the ability to close the app would be a good start (and make the apps feel more solid and safe). Oh yeah, and turn them off when I&rsquo;m using a clock app at night.</span></p>]]></description><wfw:commentRss>http://www.stuartjmoore.com/blog/rss-comments-entry-12499303.xml</wfw:commentRss></item></channel></rss>
