Wiki source for ViewTransition


Show raw source

A typical example is the Info button on the Fraction Calculator tape, you press the (i) and we rotate in
a custom UIWebView. This starts over in the subclass of SqueakProxy where pressing the (i) generates
a smalltalk message to trigger **infoButtonWasPressed:**

%%(language-ref)
infoButtonWasPressed: aButton
infoButtonPressed := true.
%%

this lets us remember that the button was pressed but we can't do the UIKit work until the callback finishes
so we do that chore in postLockProcessing, where we look for the state change, reset and call the ui handler to do the
transition

%%(language-ref)
MyApplicationSqueakProxySubClass>>postLockProcessing

self infoButtonPressed ifTrue:
[self infoButtonPressed: false.
ui doTransitionToInfoView].
%%


%%(language-ref)
doTransitionToInfoView
| menuBar infoViewDoneButton |

ObjectiveCBridge performSelectorOnMainThread:
[self infoViewController ifNil:
[| infoViewDoneButtonString |
self loadInfoNIBFile.
menuBar := self infoViewController view viewWithTag: 5.
infoViewDoneButton := menuBar topItem rightBarButtonItem.
infoViewDoneButtonString := 'infoViewDoneButtonWasPressed:'.
self squeakProxy addSigViaString: infoViewDoneButtonString aSignature: 'v@:@'.
infoViewDoneButton setTarget: self squeakProxy squeakProxy.
infoViewDoneButton setAction: (ObjectiveCBridge findSelectorCalled: infoViewDoneButtonString)].

self sharedApplication delegate
rotateViewFrom: self keypadController view
toView: self infoViewController view
animationDuration: 0.75
animationTransition: 2
curve: 3
cached: true asObjc.
self sharedApplication setStatusBarHidden: false asObjc animated: true asObjc].

%%

Now there are a number of complex things going on here, obviously I could use lazy initialization method to initialize the infoViewController,
so when we first come in we have to create the controller.

%%(language-ref)
loadInfoNIBFile
| infoString |

infoString := 'InfoView' asNSStringUTF8.
infoViewController := (ObjectiveCBridge classObjectForName: #RotatingViewControllerWithUIWebDelegate)
alloc
initWithNibName: infoString
bundle: (ObjectiveCBridge classObjectForName: 'NSBundle') mainBundle.
infoString release.
%%

To create the controller we just load the nib file "InfoView" next we need to adjust the Done button behavior
%%(language-ref)
menuBar := self infoViewController view viewWithTag: 5.
infoViewDoneButton := menuBar topItem rightBarButtonItem.
infoViewDoneButtonString := 'infoViewDoneButtonWasPressed:'.
self squeakProxy addSigViaString: infoViewDoneButtonString aSignature: 'v@:@'.
infoViewDoneButton setTarget: self squeakProxy squeakProxy.
infoViewDoneButton setAction: (ObjectiveCBridge findSelectorCalled: infoViewDoneButtonString)].
%%

First we have to get the menuBar, we have in the nib file placed the menu bar then assigned a TAG number, so we can ask for component number 5.
Then we ask for the topItem's rightBarButtonItem. This is all UIKit work so note how it's performed in a performSelectorOnMainThread: block.
we then setup the MyApplicationSqueakProxySubClass instance we have called squeakProxy to understand that on a button tap it should send the message infoViewDoneButtonWasPressed: to the MyApplicationSqueakProxySubClass instance's squeakProxy instance var.

So when the person taps the button then
%%(language-ref)
MyApplicationSqueakProxySubClass>>infoViewDoneButtonPressed: aValue
infoViewDoneButtonPressed := aValue

MyApplicationSqueakProxySubClass>>postLockProcessing

self infoViewDoneButtonPressed ifTrue:
[self infoViewDoneButtonPressed: false.
ui doTransitionToStatusViewFromInfoView].

%%
which follows the same pattern as the infoButtonPressed logic

Where we rotate the keypad view back into place. Then we'e made an explicit decision to release the infoViewController and set it to nil in order to
fulliy release the memory used by the controller back to Objective-C.

%%(language-ref)
doTransitionToStatusViewFromInfoView
ObjectiveCBridge performSelectorOnMainThread:
[self sharedApplication delegate
rotateViewFrom: self infoViewController view
toView: self keypadController view
animationDuration: 0.75
animationTransition: 1
curve: 3
cached: false asObjc.
self sharedApplication setStatusBarHidden: true asObjc animated: true asObjc.
self infoViewController release.].

self infoViewController: nil.
%%

For the RotateViewFrom:... it's Objective-C code hung off the Application delegate.
%%(language-ref)
- (void) rotateViewFrom: (UIView *) fromView toView: (UIView*) toView animationDuration: (double) animationDuration animationTransition: (int) animationTransition curve: (int) curve cached: (BOOL) cachedFlag {
UIView * superViewtoUse = [fromView superview];

[UIView beginAnimations: nil context: nil];
[UIView setAnimationDelegate: self];
[UIView setAnimationWillStartSelector: @selector (animationWillStart:context:)];
[UIView setAnimationDuration: animationDuration];
[UIView setAnimationCurve: curve];
[UIView setAnimationTransition: animationTransition forView: superViewtoUse cache: cachedFlag];
[fromView removeFromSuperview];
[superViewtoUse addSubview: toView];
[UIView commitAnimations];

}
%%


Valid XHTML :: Valid CSS: :: Powered by WikkaWiki