UITextView Scrolling Doesn’t Work

I had an issue where I was unable to get scrolling on a UITextView to work when editing was turned off. I searched and searched through the vast sea of information that is the internet and came up empty.

Basically the problem was that I had nested my UITextView inside of a UIImageView. This seems innocuous enough but UIImageView does not have the userInteractionEnabled flag set to YES by default. Therefore the event was dispatched up to that view from the main thread and was blocked because the view would not handle and propagate the event.

So the solution was to set the UIImageView’s userInteractionEnabled flag to YES.

    self.userInteractionEnabled = YES;

I think there could be other views that are set up like this as well, although I am not sure which ones they would be. So watch out for this, especially if you are defining your views in code.

I hope that this shows up in someone’s Google search and helps them out.

Tags: , , , , ,

Upcoming: New iPhone Game

We at BeefyApps have not been idle since the 1.1 release of our iPhone Soundboard.  A new project has been underway, this time with a little more focus on skill and competitiveness.  Finishing touches are being done on a  recreational pursuit of high scores that can be shown off to your friends.  A little sneak peak of an early alpha build:

Electrophobe for the iPhone
Electrophobe for the iPhone

We are most electrified about the features that you can’t see in the screenshot.

Tags: , , , , ,

iPhone Upload Progress Bar

If you are developing for the iPhone and you have been utilizing the web components, you have probably noticed that while you can observe the downloading progress, via the NSConnection class, you are unable to hook into the outbound stream from the Cocoa Touch framework classes.   In order to solve this problem you need to go beneath the covers and use the CFNetwork class.

The CFNetwork class will allow you to monitor the inbound and outbound streams.  The NSConnection and NSRequest methods are actually built on top of their Core Foundation counterparts.

Here is a link to the apple documents relating to the CFNetwork Classes: http://developer.apple.com/iphone/library/documentation/Networking/Conceptual/CFNetwork/Introduction/Introduction.html

This whole system might look fairly complex and it is.  You need to understand about streams and headers and binary data and all that fun stuff, but luckily the guys over at All Seeing Interactive (http://www.allseeing-i.com) have devised a couple of classes that you can implement in your own code.

Now I have a minor critique of this code in that I don’t like the way that it’s ASIRequest object consumes a UIProgressView (or it’s Mac Equivalent) only.  Personally I like to have a little more control over how my progress bars update.  This may sound a little obtuse but consider the following scenario: Imagine you have a multi-stage upload and save that must first assemble some binary data, compress it and then upload it.  The progress bar then should have 1/3 of it used for each step.  With the current implementation the progress is assumed to go from 0% to 100%.

This really isn’t a big problem though because the code is available for download from their public repository at github.  A couple of minor changes and it is easy enough to simply provide an additional selector for the progress updating and voila, you have full control.

So to the guys over at All Seeing Interactive, thanks for the framework.  It gets us all going in the right direction.  Good Work!

Tags: , , , , ,

Star Rating Slider

I remember looking at Apple’s iTunes rating slider and thinking to myself, that will be perfect to integrate into BeefyBoard: The iPhone Soundboard for rating soundboards and skins alike.  Imagine my dismay upon combing through the SDK and coming up empty handed.  Not to be deterred though, I managed to recreate something similar to apple’s slider using a couple images and the base UISlider implementation that Apple provides.

sliderblog1

Apple’s UISlider component is made up of two images one for the left, which I like to call the filled side, and another image for the right, or the empty side.  Apple deals with these images by using some stretchable images with caps and this lets them resize the slider to their heart’s content.  We however do not really have that luxury.

Gotcha #1: The left and right images need to be the same size and you need to account for the frame padding that Apple adds in as part of the component.  On the slider that I worked with, my two images were 250px wide but my slider control had to be 254px wide in order to display properly.  You will notice if you start playing with the size that it will mess up your image if you get this wrong.

Gotcha #2: The thumb image that you choose will affect the size and the position of the two images and where they meet.  Even though you might have figured out how to get the images to line up, if you are using a thumb control image the UISlider will adjust the size of the image to take this into account.  For instance, if you make your thumb image 50px then 50 px will be added to the width of the control to take into account the width of the thumb on either side of the slider.

Now that we have talked about all the sizing problems we should be great right?  Not yet, we still need to worry about the way that you control the slider.  Between the 2.1 and 2.2 releases of the iPhone SDK the behaviour has changed for the touch sensitivity of the UISlider.  In 2.1 you used to be able to touch anywhere on the slider and the slider would move to that position.  In 2.2 some people complained that they were accidentally changing settings and thus it was removed. So…

Gotcha #3: If you do not add a thumb image in your slider you will not have any hit area to click on in order to adjust the value of the slider.  You could add a transparent thumb icon if you wanted to provide a hit area but not have the graphic, but remember gotcha #2 above, the UISlider will adjust the size of the slider and you will need to account for that.

To solve this problem, I went in and enabled touch support for a UISlider subclass that I created.  I added touch support for the slider being pressed and again for a finger being moved on the slider.  One important thing that I almost missed was to fire the value changed action on the UISlider so that it would tell any registered selectors that the rating value had changed.

I hope this helps some people out there to avoid some problems and if you have any questions please feel free to leave a comment.  I will try to answer the best I can.

Tags: , , , ,