<?xml version="1.0" encoding="utf-8" ?>

<rss version="0.91" >
<channel>
<title>Feelin' Fine</title>
<link>http://blog.proculo.de/</link>
<description>Macs &amp; more</description>
<language>en</language>
<image>
        <url>http://blog.proculo.de/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Feelin' Fine - Macs &amp; more</title>
        <link>http://blog.proculo.de/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Why User Experience is Important</title>
    <link>http://blog.proculo.de/archives/185-Why-User-Experience-is-Important.html</link>

    <description>
        &lt;p&gt;Recently, &lt;a href=&quot;http://mark.wadham.me/&quot;&gt;Mark Wadham&lt;/a&gt; dumped his iPhone 4 in favour of an Android-based phone, the HTC Desire S and &lt;a href=&quot;http://mark.wadham.me/blog/2011/04/03/thoughts-on-switching-to-android/&quot;&gt;wrote a blog post&lt;/a&gt; about his switching experience.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Overall, he really seems to like his new phone, but he also lists a number of shortcomings compared to the iPhone. I noticed that one particular complaint stood out amongst the others, and Mark tried to play it down a little:&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;blockquote&gt;While certainly not bad, the UI clearly wasnt designed by the UX experts at Apple and I spotted a number of irritating inconsistencies and unintuitive aspects of the ui.&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;Its hard to gauge just how much of this is simply me being used to iOS, but there is definitely some room for improvement of the user experience.  I think if the UX guys at work tried this phone they would find it quite irritating to use.&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;To disable [haptic keyboard feedback] I had to turn off two settings in completely different parts of the menu. yeah, people into UX shouldnt get this phone &lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;Its not as fun to use as an iPhone, and if youre a real UX freak you should probably stick with the iPhone at least for now&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;Despite the lesser UI experience, I actually like Android, mostly because of the freedom.&lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;[The Android phone is] missing the cleanness of the user experience, consistency in the user interface []&lt;/blockquote&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Overlooking the irony that Mark switched to Android because it&#039;s more &quot;open&quot; than iOS, he apparently thinks only &quot;UX freaks&quot; would care about the user experience, which couldn&#039;t be more wrong. We are all users, which is why we all care about user experience (except maybe for &lt;a href=&quot;http://twitter.com/evilmattgemmell&quot;&gt;@evilmattgemmell&lt;/a&gt;).&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Perhaps only a user experience expert can pinpoint what exactly is distracting or imperfect about a device&#039;s user experience, but those shortcomings are certainly going to annoy all users. If your device or software (or any other kind of product really) annoys your users, you have utterly failed in designing something worthwhile. A simple &quot;usable&quot; doesn&#039;t cut it.&lt;/p&gt; 
    </description>
</item>
<item>
    <title>On Going Indie</title>
    <link>http://blog.proculo.de/archives/184-On-Going-Indie.html</link>

    <description>
        &lt;p&gt;Today is my last day as an employee at &lt;a href=&quot;http://www.enough.de/&quot;&gt;Enough Software&lt;/a&gt; and as of tomorrow, I will be independent. Hopefully this means I&#039;ll get to spend more time working on iOS and Mac projects of my own, but especially in the early stages of my new-found freedom, I will do a lot of contracting to cover the bills and make enough money to pay for our upcoming wedding (in September) and our honeymoon (January 2012).&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Over the years, I got to work on a number of exciting projects (such as &lt;a href=&quot;http://itunes.apple.com/de/app/s-banking-mobile-banking-mit/id320596872?mt=8&quot;&gt;S-Banking&lt;/a&gt;, which was #1 in the German App Store for quite some time and was even featured in one of Apple&#039;s TV commercials in Germany) at Enough Software, and I&#039;ll really miss the place and my co-workers. There are a lot of talented and bright people working here (including the best boss in the world), and transitioning from working at an office to working from home won&#039;t be easy. I&#039;ll also miss downtown Bremen, which is an awesome place to work - everything is so close!&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;On the other hand, I already have the best co-workers in the world, on Twitter. &lt;a href=&quot;http://speirs.org/&quot;&gt;Fraser Speirs&lt;/a&gt; once said that Twitter is like an office for the self-employed, and I couldn&#039;t agree more. Before Twitter, it would have been harder for me to take this step. I am pretty certain that I would feel that my fiancé, Maxie, and I were going through this alone and that no-one could possibly relate to what we&#039;re doing. With Twitter, I know there are dozens of others who have made the same experience or are doing it right now. When I &lt;a href=&quot;http://twitter.com/#!/arepty/status/52667619840495616&quot;&gt;tweeted about my last day as an employee&lt;/a&gt;, I got over 50 people congratulating me and wishing me good luck in my future endeavours in a matter of hours. People were even complaining (jokingly, I hope) that their timeline consisted of nothing but people congratulating me. If this isn&#039;t the right place and the right time, what is?&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I am really excited about the upcoming changes, but of course, as with any life-altering decisions, I am also a little scared. It might all backfire and I might be looking for a new permanent position in a few months. I am hoping that my skills as an Objective-C developer are sufficient, so this hopefully won&#039;t happen. But there are just too many variables in a situation like this and it might not depend solely on my abilities.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I&#039;m already working on a new iPhone app which I&#039;ll hopefully be able to tell you more about in a few weeks. I also have just started a contracting gig for a well-known Cocoa developer here in Germany, so my bases for the beginning should be covered. I also have a half-finished update for &lt;a href=&quot;http://foliocaseapp.com/&quot;&gt;Folio Case&lt;/a&gt;, which needs just a little fine-tuning, localization and beta testing before it&#039;s ready to go out. Looks like there won&#039;t be a shortage of projects for a while. :-)&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;In the end, working on my own means that I will enjoy a lot more freedom than I used to have. I will have a say in which projects I will do, and which projects I won&#039;t do. If the market stays the way it is, this might mean that I will get to try new things and even have my input on UI and UX valued - which isn&#039;t always the case when you&#039;re contracting. It means letting go of a steady income, which is something I will have to adjust to, but I am pretty certain that eventually, it will be worth it from a financial perspective - not to mention my personal happiness.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Today is my last day as an employee. Tomorrow, I will be an indie.&lt;/p&gt; 
    </description>
</item>
<item>
    <title>Useful iOS Libraries and Classes</title>
    <link>http://blog.proculo.de/archives/183-Useful-iOS-Libraries-and-Classes.html</link>

    <description>
        Unless you suffer from &lt;a href=&quot;http://en.wikipedia.org/wiki/Not_Invented_Here&quot;&gt;Not Invented Here Syndrome&lt;/a&gt;, you most likely enjoy using open source iOS code that other developers share via &lt;a href=&quot;https://github.com/&quot;&gt;github&lt;/a&gt; (or other places) as much as I do. Whenever I see a useful new piece of code, be it a whole library or just a simple class, I immediately want to check out how it works and begin to think about how and where I can use it in an actual project. In other cases, I have a particular problem that I need a solution for and I may check to see whether I can find something suitable which already solved that particular problem. Then there&#039;s also the case where I develop a solution and open-source it for everyone to use.&lt;br /&gt;
&lt;br /&gt;
Over the past few weeks, I compiled a list of what I think are useful and/or interesting open source iOS libraries/classes, focussing solely on components that provide some sort of drop-in UI and leaving out anything that doesn&#039;t require linking against UIKit. If there is enough interest, I may write another blog post on non-UI components in the future.&lt;br /&gt;
&lt;br /&gt;
So, without further ado, here are some components that can be useful in one of your next iOS projects, or which you simply might find interesting to play around with. Some of these are well known, but hopefully you&#039;ll find something you didn&#039;t know existed. &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;http://three20.info/&quot;&gt;Three20&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Three20 is an open-source Objective-C library, originally developed by &lt;a href=&quot;http://joehewitt.com/&quot;&gt;Joe Hewitt&lt;/a&gt; as part of &lt;a href=&quot;https://github.com/facebook/facebook-ios-sdk&quot;&gt;Facebook Connect for iPhone&lt;/a&gt;. Three20 is probably the most well-known 3rd party library for iOS development and is in use in numerous popular iOS apps, such as &lt;a href=&quot;http://itunes.apple.com/us/app/facebook/id284882215?mt=8&quot;&gt;Facebook&lt;/a&gt;, &lt;a href=&quot;http://itunes.apple.com/us/app/posterous/id394252521?mt=8&quot;&gt;Posterous&lt;/a&gt; and &lt;a href=&quot;http://itunes.apple.com/us/app/pulse-news-reader/id371088673?mt=8&quot;&gt;Pulse&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The library uses modular design, so developers can choose which parts of the library to use in their own projects, or develop extensions on their own.&lt;br /&gt;
&lt;br /&gt;
Among the things the library offers is a launcher which resembles the standard SpringBoard on Apple&#039;s iOS devices. Three20&#039;s URL-based navigation all across the app brings with it persistence, to ensure a smooth user experience even if the app was terminated while in the background.&lt;br /&gt;
&lt;br /&gt;
One of the most popular components is the photo viewer, which uses the standard datasource pattern to mimick the user interface of Apple&#039;s own Photos app. The message composer emulates Apple&#039;s Mail app to send any kind of message and is completely customizable, including autocompletion of recipient names, based on a data source you provide.&lt;br /&gt;
&lt;br /&gt;
There are also a number of clever components to facilitate the use of remote content in your app, such as an image view which takes a URL as a parameter and loads and displays the content by itself and a similar class for a table view. This is useful in a lot of cases and can vastly reduce the amount of glue code a developer has to produce.&lt;br /&gt;
&lt;br /&gt;
Another notable component is the built-in HTTP disk cache, since the default iOS component only uses a RAM cache - and as we all know, RAM is a scarce resource of many iOS devices and its contents will be lost when an app is shut down.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;http://tapku.com/&quot;&gt;Tapku&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Perhaps the second biggest library after Three20, Tapku also emulates a lot of what Apple has built into their apps that come with iOS, but has left out of the Cocoa Touch APIs. A prominent example of this is Coverflow, which Apple uses in the iPod app when in landscape orientation. I&#039;ve used Tapku in the past for its calendar component, which closely resembles what Apple uses in their Calendar app.&lt;br /&gt;
&lt;br /&gt;
The library comes with an example project, so you can check out each component before you add the code to your app.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;http://www.inappsettingskit.com/&quot;&gt;InAppSettingsKit&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
One of the not so strong points of iOS is user-adjustable preferences. The Apple-approved way of dealing with such preferences is to use a settings bundle, which will automatically appear in the Settings app. There are a number of advantages to this approach, such as consistency across application, but it also means that the user has to specifically look out for an entry for your app in Settings in order to make changes - or they have to be told that there is such a possibility, which is plain annoying.&lt;br /&gt;
&lt;br /&gt;
Enter InAppSettingsKit, which allows you to mimic the behaviour and style found in Settings.app inside your own app, based on your settings bundle (although there are customization options). The library provides a uniform experience for your users along with great ease-of-use.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;http://getsharekit.com/&quot;&gt;ShareKit&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Many people nowadays use social networks as a large part of how they communicate with their friends and relatives, and to find information and entertainment. Users commonly share items they find interesting with their friends on social networking sites, and it can make sense for your app to allow users to easily share things.&lt;br /&gt;
&lt;br /&gt;
This is where ShareKit comes in. It provides an easy method to provide sharing functionality for a number of social networks (such as &lt;a href=&quot;http://www.facebook.com/&quot;&gt;Facebook&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/&quot;&gt;Twitter&lt;/a&gt; and &lt;a href=&quot;http://www.delicious.com/&quot;&gt;Delicious&lt;/a&gt;) plus e-mail. The library&#039;s design is rather smart, to it will only offer those services which support the type of content the user wants to share, such as URLs, images, text or files. It even works offline out of the box and will persistently store items which can then be send when a connection is available.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;https://github.com/route-me/route-me&quot;&gt;Route-Me&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Route-Me is an open-source replacement for large parts of MapKit, including support for various map sources. As of now, it supports &lt;a href=&quot;http://www.openstreetmap.org/&quot;&gt;OpenStreetMap&lt;/a&gt;, &lt;a href=&quot;http://www.bing.com/maps/&quot;&gt;Microsoft VisualEarth (now Bing Maps)&lt;/a&gt; and &lt;a href=&quot;http://cloudmade.com/&quot;&gt;CloudMade&lt;/a&gt; out of the box. There are classes for various other map sources, such as &lt;a href=&quot;http://maps.yahoo.com/&quot;&gt;Yahoo!&lt;/a&gt;, but those are included only for demonstration purposes and are not intended to be used in an actual application for licensing reasons.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;https://github.com/TheRealKerni/Hockey&quot;&gt;Hockey&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Ever since iOS 4.0 introduced over-the-air installing, developers have been finding interesting ways to use it, especially to facilitate distribution of ad-hoc builds, which are commonly used for beta testing purposes.&lt;br /&gt;
&lt;br /&gt;
Hockey uses this approach to really make it easy on users to install new versions of apps they offering code for both PHP5-enabled servers and an iOS component which allows for in-app updates, including support for update notifications.&lt;br /&gt;
&lt;br /&gt;
The client library is optional though, so Hockey can also be used for installing and updating apps from Safari.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;https://github.com/myell0w/MTStatusBarOverlay&quot;&gt;MTStatusBarOverlay&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
In the past few years, we&#039;ve seen a lot of UI innovation come from 3rd party developers, such as &lt;a href=&quot;http://itunes.apple.com/us/app/twitter/id333903271?mt=8&quot;&gt;Tweetie&lt;/a&gt;&#039;s (now Twitter for iPhone) pull to refresh (see &lt;a href=&quot;https://github.com/enormego/EGOTableViewPullRefresh&quot;&gt;EGOTableViewPullRefresh&lt;/a&gt; below) and &lt;a href=&quot;http://reederapp.com/2/&quot;&gt;Reeder&lt;/a&gt;&#039;s status bar overlays that indicate current progress without wasting valuable screen estate.&lt;br /&gt;
&lt;br /&gt;
MTStatusBarOverlay replicates this status bar overlay and makes it easy for developers to implement this kind of behaviour in their own apps, along with extensions such as a detail view that pops out of the status bar.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;http://blog.proculo.de/archives/182-Using-KVO-to-annotate-UISliders.html&quot;&gt; ARAnnotatedSlider &lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Written by yours truly for &lt;a href=&quot;http://foliocaseapp.com/&quot;&gt;Folio Case&lt;/a&gt;, this is more an example of showing how to use Key-Value-Observing (KVO) in order to react to UI changes than a complete 3rd party library, but it should be able to adopt it for usage in your own apps without too much hassle.&lt;br /&gt;
&lt;br /&gt;
This example allows developers to add a callout view to UISliders, thus giving users direct feedback on their actions in the same place where they are currently focusing on anyway.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;a href=&quot;https://github.com/enormego/EGOTableViewPullRefresh&quot;&gt;EGOTableViewPullRefresh&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Ever since Loren Brichter came up with the pull-to-refresh mechanism in &lt;a href=&quot;http://itunes.apple.com/us/app/twitter/id333903271?mt=8&quot;&gt;Tweetie&lt;/a&gt; (now Twitter for iPhone), other developers have tried to emulate the behaviour. One such implementation is &lt;a href=&quot;http://www.enormego.com/&quot;&gt;enormego&lt;/a&gt;&#039;s EGOTableViewPullRefresh, which comes pretty close to Brichter&#039;s original (sans sound effects).&lt;br /&gt;
&lt;br /&gt;
Cross-posted to the &lt;a href=&quot;http://blog.j2mepolish.org/?p=412&quot;&gt;Enough Software Company Blog&lt;/a&gt;. 
    </description>
</item>
<item>
    <title>Using KVO to annotate UISliders</title>
    <link>http://blog.proculo.de/archives/182-Using-KVO-to-annotate-UISliders.html</link>

    <description>
        &lt;div class=&quot;serendipity_imageComment_left&quot; style=&quot;width: 83px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a  class=&#039;serendipity_image_link&#039;  rel=&#039;lightbox&#039; href=&#039;http://blog.proculo.de/uploads/FolioCasePaging.jpg&#039;&gt;&lt;!-- s9ymdb:178 --&gt;&lt;img width=&quot;83&quot; height=&quot;110&quot; src=&quot;http://blog.proculo.de/uploads/FolioCasePaging.serendipityThumb.jpg&quot; alt=&quot;&quot;  /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Annotated UISlider in Folio Case&lt;/div&gt;&lt;/div&gt;In &lt;a href=&quot;http://foliocaseapp.com&quot;&gt;Folio Case&lt;/a&gt;, I&#039;m using a custom UISlider with annotations to allow users to easily skim through the document and find the page they want. When the user taps the knob, a small bubble shows up that shows the page number that corresponds to the position where the knob currently is. The page number within the bubble is constantly updated as the user drags the knob around. When the user lets go, the app turns to the selected page, the knob snaps in place and the bubble slowly fades out. This approach makes sure that the user gets the information when he/she needs it and it doesn&#039;t stand in the way of getting things done. &lt;br /&gt;
&lt;br /&gt;
Ever since &lt;a href=&quot;http://foliocaseapp.com&quot;&gt;Folio Case&lt;/a&gt; was released, I&#039;ve been asked how I achieved this effect, as there is no built-in functionality for this behaviour in UIKit. The short answer is: using KVO (key value observing), I track whether the knob is being touched and moved and react appropriately.&lt;br /&gt;
&lt;br /&gt;
The long answer is, well, longer. If you&#039;re not familiar with the concept of KVO, you might want to read Apple&#039;s &lt;a href=&quot;http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html&quot;&gt;Key Value Observing Programming Guide&lt;/a&gt;. In short, Apple describes KVO as &quot;a mechanism that allows objects to be notified of changes to specific properties of other objects&quot;. In practical use, this means that I can register as an observer to any property other classes expose, such as a UIView&#039;s frame. If I choose to do so, I will be notified whenever the object is being moved within its superview, which causes its frame to change.&lt;br /&gt;
&lt;br /&gt;
Now, in order to track a UISlider&#039;s knob movement, we will have to get a little tricky. A UISlider instance, once it is being displayed on the screen, has three subviews, all of which are instances of UIImageView. The third and foremost UIImageView instance contains the UISlider&#039;s knob. This might change at any time, so if you&#039;re going to use an approach like this in production code, be aware that it might change with the next release of iOS. However, the worst thing that can happen in this case is that the bubble won&#039;t be shown anymore.&lt;br /&gt;
&lt;br /&gt;
In &lt;code&gt;ARAnnotatedSliderView&lt;/code&gt;, which is my class to manage the UISlider and the bubble that is being conditionally displayed, I have the following method:&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;http://gist.github.com/595211.js&quot;&gt; &lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;kARPageScrubberViewKeypathFrame&lt;/code&gt; and &lt;code&gt;kARPageScrubberViewKeypathTracking&lt;/code&gt; are simple constant NSStrings, &lt;code&gt;@&quot;frame&quot;&lt;/code&gt; and &lt;code&gt;@&quot;tracking&quot;&lt;/code&gt;, respectively.  The first property I want to observe is the knob&#039;s frame, to be notified of changes in the knob&#039;s positioning. The second property I want to observe is the UISlider&#039;s &lt;i&gt;tracking&lt;/i&gt; property, to be notified when the user starts tracking the knob with his/her finger and when they stop, so I can dismiss the bubble. When one of those notifications kicks in, I react to it using this method:&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;http://gist.github.com/595226.js&quot;&gt; &lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
When the knob&#039;s frame was changed, this code makes sure that the bubble view stays right on top of it to ensure a smooth experience for the user. When tracking starts, I can use this notification to display the bubble, and when tracking stops, I can set up a timer to dismiss the bubble after a short while.&lt;br /&gt;
&lt;br /&gt;
As you can see from the complete code, this class is taken from &lt;a href=&quot;http://foliocaseapp.com&quot;&gt;Folio Case&lt;/a&gt; without (many) changes, and so is not well configurable. The bubble will always display &quot;Page %d&quot; where a class that was intended as being reusable would probably allow you to customize this setting. I&#039;ve set up a &lt;a href=&quot;http://github.com/alexrepty/ARAnnotatedSlider&quot;&gt;small example project for this on Github&lt;/a&gt;, if you&#039;d like to check it out and play with it. If someone ends up making a fully reusable class out of this, please let me know.&lt;br /&gt;
&lt;br /&gt;
If you&#039;d like to get back to me, feel free to leave a comment here or &lt;a href=&quot;http://twitter.com/arepty/&quot;&gt;follow me on Twitter&lt;/a&gt;. 
    </description>
</item>

</channel>
</rss>

