Sunday, March 14, 2010
iPlotz Not Performing Up to Speed
I took another look at the iPlotz wireframing tool today. At first, this tool looked very promising. Unfortunately, it is a Flash based tool. Flash is notorious for not running well on OS X and iPlotz is no exception. The iPhone components available in the wireframing section were in sufficient to to illustrate the functionality in even a simple application. This tool looks spectacular as a concept but unfortunately is quite limited in its current implementation. Also, the drag and drop barley functions. I can't imagine how long it would take to create even a simple application in wireframes with this tool.
Monday, March 8, 2010
HP Slate: An "Open" Competitor to Apple's iPad?
This video shows that the Windows 7 on HP Slate can offer similar features to the Apple iPad. Further, this device is a full computer running all of the Windows 7 applications you use everyday without restrictions. (And if it runs Windows it will probably run Linux without a hitch too.)
Flash content is fully enabled. Putting all of the video on the web into the palm of your hand. This is a major distinguishing factor for the Slate. It is true that HTML 5 is already running and available to YouTube users. I might add that I have used the HTML5 version of YouTube on my iPad simulator and it runs quite nicely. Still, Microsoft is yet to release an HTML 5 compliant browser. This means that developers will continue to be dependent on Flash (or other browser plug-ins) to provide in-page video content for browsers as old as IE 8, at least.
By the way, IE 6, which was released in August of 2001, just had a funeral and most web content providers would still gasp at the idea of not offering a suitable video option for that browser. If history is an indicator, it will be 2020 before we can actually deliver video content over the web without relying on a plugin. (Also, Steve Jobs doesn't just hate Flash he hates all plug-ins, just read the iPhone SDK TOU)
It is good that this device offers so many options because there is no question that the HP slate will need to differentiate itself from the iPad. Apple is open to reducing the price of the iPad if demand lags, so undercutting the iPad is not an option for HP.
Finally, while on paper, or even in a video, this tablet may look like more than a match for the iPad, I recently had a chance try out the Windows multi-touch experience. It was slow, awkward, and frustrating.
In the end the key factor may be usability. If this Windows 7 tablet frustrates users back onto their laptops, the product could have a short life.
The real competitor to the Apple iPad could just be Google's coming Chrome OS...
Friday, March 5, 2010
How To Be The First To Receive An iPad?
If there turns out to be shortage due to any unforeseen manufacturing issues, the iPad could be quite scarce for some time.
I want to begin development on the device right away. So, my question today is how shall I actaully get my hands on this iPad. Apple says they will be offering it for pre-order on the 12th.
I definitely want to pick mine up from the store. The question is, can I register on line for in-store pre-orders? If I can only place orders for in-store pick-up at the store, should I arrive early on the 12th? Will there be a line?
I'll post any details I find here.
Update: Apple rep says reserve online for in-store pickup.
Objective-C Error: *nil description*
One of the easiest mind boggling errors to run into when developing for the iPhone is the accidental override of NSObject's description method. For those who are new to iPhone Development or Objective-C, the description method is equivalent to the more common toString method found in other languages. This is the method that is invoked when an object is printed to a string with %@ string formatting token.
You will encounter the *nil description* output if your description override returns a nil string. While overriding the description method can be useful in allowing developers to describe their object's contents, it also can cause confusing and unexpected output if the override was unintentional.
...now wouldn't it be nice if obj-c required developers to mark methods as override to ensure that all overrides were intentional?
You will encounter the *nil description* output if your description override returns a nil string. While overriding the description method can be useful in allowing developers to describe their object's contents, it also can cause confusing and unexpected output if the override was unintentional.
...now wouldn't it be nice if obj-c required developers to mark methods as override to ensure that all overrides were intentional?
Monday, March 1, 2010
Creating Apps for iPhone 3.x with / iPad OS 3.2 Beta SDK

After installing the iPhone / iPad OS 3.2 Beta SDK you may notice that the drop down in the upper left no longer allows you to build your new projects to pre 3.2 versions of iPhone OS. That means that you currently can't install your apps on your iPhone.
The good news is that you can build your app to run on any previous 3.x iPhone OS devce.
Simply go into Targets in the "Groups & Files" panel on the left. Then right click on the target with your application name. (There is usually only one target.) Next Choose get info.
A dialog will appear. Under the build tab choose a "Base SDK" of iPhone 3.x.


Now you should be ready to develop iPhone apps for devices running versions of iPhone OS prior to version 3.2.
Sunday, February 28, 2010
Windows 7 Tablet with Multi-Touch, Forget About It!

I recently got a chance to use some of the latest multi-touch features in Microsoft Windows. I had hoped for good things from Microsoft but found their product to be frustratingly unresponsive! It took multiple attempts to register multi-touch actions or even single-touch button presses. When touches were being tracked the UI was so far behind the input that even simple actions like zooming in and out of a map became virtually impossible. Worse than the disappointing Microsoft Surface experience, the Windows multi-touch tablet UX would probably be a joke!
Microsoft Surface: Not Yet a Polished Product

I finally got my hands on Microsoft surface at the Samsung pavilion in Vancouver this weekend. The Responsiveness was less than quick. After using multi-touch on my MacBook Pro and iPhone, I expected a physical and seamless feeling experience on the Surface. What I discovered was nothing less than a very delayed response time on this device.
The Palm Pre, which I used to shoot this picture, running WebOS, well out performed this surface. The most interesting part of the experience were the glass blocks, which when placed on the screen, would bring up various windows that allowed sharing content and other arbitrary activities.
More pictures follow:



More pictures follow:



Selling the Experience | A CBC Web/Radio Show On How We Think About Advertisements
While in Vancouver for the Olympics, I had the good fortune of discovering a fantastic radio show on advertising on CBC Radio called The Age of Persuasion, hosted by Terry O'Reilly (left). For any one designing user experience products are working to create other consumer software products, this show offers a captivating look at how we think about new products. There are many great historical examples from the early days of advertising as well as a look into current trends. I can't recommend the show highly enough.You can find recent episodes here: http://www.cbc.ca/ageofpersuasion/ Give the episode "Season 4: “Being There: Selling Experiences" a listen and tell me if you are not hooked.
Tuesday, February 23, 2010
iPad OS 3.2 beta 3 is out?
Whenever a new iPhone/iPad SDK comes out there is always a huge rush and slow connection speeds follow. Today, I discovered that the 3rd iPad beta simulator/SDK had just been released; however, when I went to the dev center I was only offered the beta 2 version.

Is Apple now offering there SDK updates in waves to avoid the bandwidth crunch, or was the SDK pulled?

Is Apple now offering there SDK updates in waves to avoid the bandwidth crunch, or was the SDK pulled?
Update 1 (1:30pm) The SDK has a photos app (with mysterious camera button) . ...I still can't download it. :(
Update 2 (3:30pm): It turns out that Apple pulled the iPhone/iPad Beta 3 SDK only moments after its release. So, there is no telling when we will be able to legitimately download this SDK.
Update 3 (11:15pm):
iPad simulator finally available. Download in progress :)
Monday, February 22, 2010
Controlling the UIScrollView in a UIWebview: Removing the Bounce, Shadows, and More
To control the scrolling behavior of a webview ,we simply grab a reference to its inner scrollview and then control that scrollview as we would any other.
The first and only subview of the UIWebView is a UIScrollView. Unfortunately, Apple has provided no direct access to this scrollview; however, the Apple engineers also do not yet have any notion of private methods on objects. ;) (You may have heard stories from other developers about private APIs. However, an API is only private if its methods cannot be found in Apple's published APIs. All of the methods that we are going to use here are included in the documented APIs.)
The first and only subview of the UIWebView is a UIScrollView. Unfortunately, Apple has provided no direct access to this scrollview; however, the Apple engineers also do not yet have any notion of private methods on objects. ;) (You may have heard stories from other developers about private APIs. However, an API is only private if its methods cannot be found in Apple's published APIs. All of the methods that we are going to use here are included in the documented APIs.)
First we will pull the UIScrollView out from the UIWebView:
That's it, now you have full control over the webviews inner scrollview and we have only used documented API's.
NSArray *wsv = [NSArray arrayWithArray:[webScroller subviews]];
[[wsv objectAtIndex:6] setHidden:YES];
[[wsv objectAtIndex:7] setHidden:YES];
[[wsv objectAtIndex:8] setHidden:YES];
[[wsv objectAtIndex:9] setHidden:YES];
NSArray *sv = [NSArray arrayWithArray:[myWebivew subviews]];
UIScrollView *webScroller = (UIScrollView *)[sv objectAtIndex:0];
UIScrollView *webScroller = (UIScrollView *)[sv objectAtIndex:0];
That's it, now you have full control over the webviews inner scrollview and we have only used documented API's.
(The sv array provides a pleasant level of indirection as it allows us to access the scrollview without directly pulling it from the webview.) If you are looking to prevent scrolling, control scroll offset or effect any other scrolling behavior you will be able to do it with this webScroller object.
Next if you want to remove those shadows from the top and bottom of the webview, you can simply hide them. They are inserted in the webScroller (the webview's scrollview). Use the following lines to hide the shadows.
NSArray *wsv = [NSArray arrayWithArray:[webScroller subviews]];
[[wsv objectAtIndex:6] setHidden:YES];
[[wsv objectAtIndex:7] setHidden:YES];
[[wsv objectAtIndex:8] setHidden:YES];
[[wsv objectAtIndex:9] setHidden:YES];
There you have it!
Remember, as sdk version change there may be some issues with this code, so watch your apps to make sure they continue to function properly when new OS version are released.
UIWebView sizeToFit broken?
UIWebView sizeToFit does not work unless the webView starts with a non zero frame.
In the following code the webView will not be sized to fit. To correct the issue choose a non-zero size for the webview frame.
myWebView = [[UIWebView alloc] initWithFrame:CGRectZero] // wrong
[myWebView loadHTMLString:@"...lots of html here resulting in a very large webview..." baseURL:nil];
- (void)webViewDidFinishLoad:(UIWebView *)webView {
// if webview frame is zero size to fit will not work.
[webView sizeToFit];
NSLog(@"webView height: %f", webView.frame.size.height);
}
To correct the issue change: myWebView = [[UIWebView alloc] initWithFrame:CGRectZero] // wrong to myWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0,320,100)] // right
Sunday, February 21, 2010
How to specify a port for scp file transfers
I found the scp syntax to be a bit non conventional here, so I am making a quick note to serve as reminder to anyone who finds this syntax less than intuitive.
To scp over a specified port use scp -P [port] ./myfile myuser@example.com:/mydir/
Whether you want to use scp to copy up to the remote host or down from the remote host, the port goes at the beginning of the command. Also, a capital -P is required.
To scp over a specified port use scp -P [port] ./myfile myuser@example.com:/mydir/
Whether you want to use scp to copy up to the remote host or down from the remote host, the port goes at the beginning of the command. Also, a capital -P is required.
Saturday, February 20, 2010
With Only 140 Characters Per Post Twitter is Just Not Enough!
Sometimes, after 140 characters, I am just getting started, so after a year and a half without a single post to this blog, I am at it again. I don't expect to generate many lengthy entries, but am looking forward to blogging without limits.
Friday, February 19, 2010
YouTube offers HTML5 beta site and it works on the iPad Simulator, is Hulu Next?
YouTube is now offering an HTML 5 beta to all users http://www.youtube.com/html5.
The videos play very well on the iPad Simulator and I would expect even better performance on the h.264 optimized device hardware.

Will hulu also offer an HTML alternative or will they leverage the lack of Flash on iPad forcing users to pay for their service? http://bit.ly/aMGdQP
The videos play very well on the iPad Simulator and I would expect even better performance on the h.264 optimized device hardware.

Will hulu also offer an HTML alternative or will they leverage the lack of Flash on iPad forcing users to pay for their service? http://bit.ly/aMGdQP
Tuesday, October 28, 2008
Writing Requirements from a UX Perspective
Here is Alan Cooper's five step cycle for requirements refinement and solidification. With some products one iteration may be enough often refinements will need to be made several times to maintain a comprehensive focus.
- Create problem and vision statements
- Brainstorm
- Identifying persona expectations
- Constructing context scenarios
- Identifying requirements
One: Creating Problem and Vision Statements (an argument of purpose)
In every product there must be a central thesis or argument of purpose behind which all stake holders unite. This statement will then be used to assign value to each proposed feature during the following brainstorming sessions. It also provides a cohesive focus for the product. It is vital that the feature set be as concise and focused as possible. This statement will help reduce features which may be appealing to specific stake holders, but do not facility the user in efficiently realizing his primary goals. Finally, it is vital that usability issues, which are always critical to the success of the application, be illustrated in terms of business goals!
Two: Brainstorming
During brainstorming it is important to focus on how users will use the product. Spend more time talking about use cases and little on features and layout. Let go of preconceived ideas about how the product will look and allow new UI concepts to form around the specific needs of the user. Do not lock down UI here.
Three: Identifying User Expectations
Understand the features the users will expect to find in the product. Focus on making expected functionality as apparent as possible. Also, realize that different users will expect to accomplish the same task in different ways. Attempt to outline areas where the application needs to be permissive. (An application is said to be permissive when a user has many ways and orders in which he can accomplish the same task.) This is usually expensive so identifying key areas here will save time. Remember as these are issues of usability it is vital to tie them directly to business objectives.
Four: Constructing Context Scenarios
Context Scenarios focus on how the users will interactive with the product in their typical usage environments. Here we focus on how the user lives with the product throughout his day. From our context scenarios we will form requirements designed around how the user will accomplish his goals while driving, multitasking in a busy office, or in whatever environment he typically finds himself. It is important to focus on overall user-objectives first and then iteratively fill in the details. Context Scenarios should not describe specific UI design, but will be used as a source for discovering the priority of user's needs. Context Scenarios allow us to create novel solution. It is important to never mention specific UI interactions at this stage! An example Context Scenario can be found in The Essentials of Interaction Design 3 on pg 120.
Five: Identifying Requirements
Accept that Requirements are not to be comprised of features and tasks. It is recommended to think of requirements as consisting of the following three primary components:
From here it should be possible to begin drawing UI diagrams and defining interactions.
(For more information on this topic view the text: The Essentials of Interaction Design 3 pg 115.)Two: Brainstorming
During brainstorming it is important to focus on how users will use the product. Spend more time talking about use cases and little on features and layout. Let go of preconceived ideas about how the product will look and allow new UI concepts to form around the specific needs of the user. Do not lock down UI here.
Three: Identifying User Expectations
Understand the features the users will expect to find in the product. Focus on making expected functionality as apparent as possible. Also, realize that different users will expect to accomplish the same task in different ways. Attempt to outline areas where the application needs to be permissive. (An application is said to be permissive when a user has many ways and orders in which he can accomplish the same task.) This is usually expensive so identifying key areas here will save time. Remember as these are issues of usability it is vital to tie them directly to business objectives.
Four: Constructing Context Scenarios
Context Scenarios focus on how the users will interactive with the product in their typical usage environments. Here we focus on how the user lives with the product throughout his day. From our context scenarios we will form requirements designed around how the user will accomplish his goals while driving, multitasking in a busy office, or in whatever environment he typically finds himself. It is important to focus on overall user-objectives first and then iteratively fill in the details. Context Scenarios should not describe specific UI design, but will be used as a source for discovering the priority of user's needs. Context Scenarios allow us to create novel solution. It is important to never mention specific UI interactions at this stage! An example Context Scenario can be found in The Essentials of Interaction Design 3 on pg 120.
Five: Identifying Requirements
Accept that Requirements are not to be comprised of features and tasks. It is recommended to think of requirements as consisting of the following three primary components:
- Objects: The information that the user will need in order to accomplish his goals, these would be messages, comments, images, blog entries, as well as associated information publish date, file size etc.
- Actions: The operations the user will need to perform on the objects. Later UI controls will be created to conduct these operations. Hence, actions will also help determine where information should appear in the UI.
- Contexts: Development timelines, business models, technical limitiations, customer based limitations.
From here it should be possible to begin drawing UI diagrams and defining interactions.
Sunday, August 31, 2008
What Robert Penner Never Told You About His 'Easing Equations'
In his epic work "Programming Macromedia Flash MX" Robert Penner introduced his easing equations to the world. Of course, the equations were standard curves used in interpolation throughout animation programming. However, these curves had never before been available in Flash. (Later, Macromedia would add them to the standard Flash libraries.)
Interestingly, it turns out that these curves with the names NSAnimationEaseInOut, NSAnimationEaseIn, NSAnimationEaseOut had existed on OS X/NeXTStep computers for nearly 15 years before Penner would bring them to Flash. Of course, the developers of Flash must have used NSAnimations before they brought the term 'easing' to the mainstream through the Flash UI. (Outside of Flash/COCOA the term 'easing' is never used in formal academic circles and is always refered to as interpolation.)
It infact appears that many ActionScript classes have Object-C/COCOA ancestors such as hitTest, NSURLRequest, NSURL, and many more.
Interestingly, it turns out that these curves with the names NSAnimationEaseInOut, NSAnimationEaseIn, NSAnimationEaseOut had existed on OS X/NeXTStep computers for nearly 15 years before Penner would bring them to Flash. Of course, the developers of Flash must have used NSAnimations before they brought the term 'easing' to the mainstream through the Flash UI. (Outside of Flash/COCOA the term 'easing' is never used in formal academic circles and is always refered to as interpolation.)
It infact appears that many ActionScript classes have Object-C/COCOA ancestors such as hitTest, NSURLRequest, NSURL, and many more.
Wednesday, August 27, 2008
Add, Set, and Delete Cookies in UIWebView with NSHTTPCookieStorage
NSHTTPCookieStorage allows you to update the cookies for every request made from your application. UIWebViews will respond to this changes in cookies at run time and NSHTTPCookieStorage allows you to listen for changes in cookies as the are normaly set in the browser.
To get the cookies for any url use:
NSHTTPCookieStorage* cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray* theCookies = [cookieStorage cookiesForURL:[NSURL URLWithString:@"http://example.com"]];
This makes it possible to easily login or logout a user from a website presented in your UIWebView.
Checkout NSHTTPCookieStorage* for all the details.
To get the cookies for any url use:
NSHTTPCookieStorage* cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray* theCookies = [cookieStorage cookiesForURL:[NSURL URLWithString:@"http://example.com"]];
This makes it possible to easily login or logout a user from a website presented in your UIWebView.
Checkout NSHTTPCookieStorage* for all the details.
Labels:
Cocoa,
iPhone,
Objective-C,
UIKit
Monday, August 25, 2008
AdMob Ads break in UIWebView
AdMob ads are broken in UIWebViews (a UIWebView is an iPhone native browser control) for two reasons.
Update: after some badgering AdMob has responded here.
- AdMob requires a user agent and when you tell AdMob you are on an iPhone AdMob will provide ads with direct links to the App Store. This would be great, but Apple servers respond with "Internal Server Error" when AdMob ads link to the appstore through UIWebView. The same links work great in iPhone Safari.
- When a page containing a UIWebView loads with an AdMob ad, the page is instantly redirected to about:blank. Canceling this redirect in shouldStartLoadWithRequest causes other links on the page to become unresponsive!
- If you know how to get this working please comment.
Update: after some badgering AdMob has responded here.
Labels:
Cocoa,
iPhone,
Objective-C,
UIKit
Subscribe to:
Posts (Atom)

