I’ve made a custom zero-image, Core Graphics drawn UIButton based on Ray Wenderlich’s Tutorial (the only modifications are to CoolButton’s drawRect: method, altered drawing code), and it works great most of the time. However, sometimes when I click it for a short period of time, it stays in a depressed state and doesn’t return to normal.
From here, the only way to get it back to a normal state is via a long press. Simply clicking means it stays depressed.
Another thing to note is that I’ve hooked Touch Up Inside up to a chain of a few long methods – I don’t think it would take more than 0.1 seconds to complete. I’ve even used dispatch_async in the @selector that is hooked up to Touch Up Inside, so there shouldn’t be a delay in the UI updating, I think.
I’ve put an NSLog in the drawRect: which fires 3 times per button press usually, and it varies what UIControlState the button is in for each press:
- For some short presses, it goes Highlighted, Highlighted, Normal
- for longer presses, it’s Highlighted, Normal, Normal
However, for very short presses, it only fires twice, Highlighted -> Highlighted.
When it’s a long press to get it back to Normal, it goes H, N, N.
This has been puzzling me for a while, and I haven’t been able to work out why short presses only fire drawRect: twice, or why touchesEnded: doesn’t seem to call drawRect:. Perhaps touchesEnded: isn’t firing?
I really hope someone can help.
If you really want to generate the button images at runtime, generate them when the button is loaded. Then add them for different states using
You can always turn a view into an image using the following: http://pastie.org/244916
Really though, I’d recommend just making images beforehand. If you don’t want to get photoshop, there’s plenty of alternatives. The upcoming pixelmator update looks pretty suave, ands it’s ridiculously cheap!