@Override public void Invoke (NSNotification nf) {
IOSNativeTextField field = _activeFields.get(nf.get_Object());
if (field != null) field.didFinish();
}});
NSNotificationCenter center = NSNotificationCenter.get_DefaultCenter();
// observe UITextField
center.AddObserver(UITextField.get_TextDidBeginEditingNotification(), didBegin);
center.AddObserver(UITextField.get_TextFieldTextDidChangeNotification(), change);
center.AddObserver(UITextField.get_TextDidEndEditingNotification(), didEnd);
// observe UITextView
center.AddObserver(UITextView.get_TextDidBeginEditingNotification(), didBegin);
center.AddObserver(UITextView.get_TextDidChangeNotification(), change);
center.AddObserver(UITextView.get_TextDidEndEditingNotification(), didEnd);
// slide the game view up when the keyboard is displayed
center.AddObserver(UIKeyboard.get_DidShowNotification(),
new cli.System.Action$$00601_$$$_Lcli__MonoTouch__Foundation__NSNotification_$$$$_(new cli.System.Action$$00601_$$$_Lcli__MonoTouch__Foundation__NSNotification_$$$$_.Method() {
@Override public void Invoke (NSNotification nf) {
if (_gameViewTransformed) {
// already transformed, bail with a warning
log.warning("Keyboard shown when already showing?", "viewTransform",
_gameViewTransform);
return;
}
// find the first responder
IOSNativeTextField firstResponder = findFirstResponder();
if (firstResponder == null) return; // it's not a field we're managing, bail
// figure out how we need to transform the game view
SizeF size = ((NSValue) nf.get_UserInfo().get_Item(
UIKeyboard.get_FrameBeginUserInfoKey())).get_RectangleFValue().get_Size();
RectangleF fieldFrame = firstResponder.getView().get_Frame();
// oddly, the size given for keyboard dimensions is portrait, always.
float targetOffset = -size.get_Width() +
_overlay.get_Bounds().get_Height() - fieldFrame.get_Bottom();
// give it a little padding, and make sure we never move the game view down,
// also make sure we never move the bottom of the game view past the top of the
// keyboard
targetOffset = Math.max(Math.min(targetOffset - 10, 0), -size.get_Width());
PointF target = new PointF(0, targetOffset);
target = _overlay.get_Transform().TransformPoint(target);
// update and set the transform on the game view
UIView gameView = _overlay.get_Superview();
CGAffineTransform trans = gameView.get_Transform();
_gameViewTransform = trans.Invert().Invert(); // clone
trans.Translate(target.get_X(), target.get_Y());
gameView.set_Transform(trans);
_gameViewTransformed = true;
// touches outside of the keyboard will close the keyboard
_overlay.Add(_touchDetector);
}}));
center.AddObserver(UIKeyboard.get_WillHideNotification(),
new cli.System.Action$$00601_$$$_Lcli__MonoTouch__Foundation__NSNotification_$$$$_(new cli.System.Action$$00601_$$$_Lcli__MonoTouch__Foundation__NSNotification_$$$$_.Method() {
@Override public void Invoke (NSNotification nf) {
// bail if not transformed; this might be ok, if the keyboard was shown outside
// of our purview
if (!_gameViewTransformed) return;
UIView gameView = _overlay.get_Superview();
gameView.set_Transform(_gameViewTransform);
_gameViewTransform = null;
_gameViewTransformed = false;
_touchDetector.RemoveFromSuperview();
_platform._focus.update(null);
}}));
_currentOrientation = UIDevice.get_CurrentDevice().get_Orientation().Value;
center.AddObserver(UIDevice.get_OrientationDidChangeNotification(),
new cli.System.Action$$00601_$$$_Lcli__MonoTouch__Foundation__NSNotification_$$$$_(new cli.System.Action$$00601_$$$_Lcli__MonoTouch__Foundation__NSNotification_$$$$_.Method() {
@Override
public void Invoke (NSNotification nf) {
UIDeviceOrientation orient = UIDevice.get_CurrentDevice().get_Orientation();
if (orient.Value == _currentOrientation) return; // NOOP