CCScrollView has one annoying usability problem: Touches that land outside of the CCScrollView will be propagated to any interactive elements (such as buttons) that are children of its content node. In other words, even if a button, that's a child of the content node, is outside of the area of the CCScrollView, it will receive touches. Sure, sometimes this might be desired, but othertimes it would be nice if touches to those elements were limited to the area inside the scrollview.
Well, easy, just specialize CCScrollView by inheriting from it, and stop touches that land outside of it from reaching its children? Easier said than done. This seems to be impossible due to a weird catch-22.
CCScrollView makes decisions on touches in its gestureRecognizer:shouldReceiveTouch: method. It returns YES if it wants to swallow touches, and NO if it wants to allow them to propagate to other nodes. If it returns YES, then nothing else will receive the touch. If it returns NO, then any other node may receive the touch indiscriminately.
So what to return? If the touch lands outside of the CCScrollView, it should return NO, meaning "I'm not handling this touch". But if it returns NO, then the touch will propagate to whatever other node is at that location, including child nodes of this CCScrollView. But if it returns YES, then it will handle the touch as if it had landed inside it, making itself scroll. There is no option of "swallow the touch, stopping it from propagating to other nodes, but ignore it, ie. don't scroll".