我正在翻译objective-c代码到Xamarion.iOS。
在objective-c中,我有以下代码:
- (void)keyboardWasShown: (NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboadFrameBeginUserInfoKey] CGRectValue].size;
. . .
}
问题是info objectForKey返回一个Id对象,该对象具有CGRectValue方法。
但是在Xamarin中我有…
private void KeyboardWasShown(NSNotification notification)
{
var info = notification.UserInfo;
var kbSize = (info.ObjectForKey(UIKit.UIKeyboard.FrameBeginUserInfoKey)).??
. . .
}
在Xamarin中,NSDictionary返回一个NSObject,但是objective-c版本返回一个Id Object。NSObject没有CGRectValue方法
我的问题是Xamarin对Id对象做了什么,我应该转换什么类来获得CGRectValue。我试过转换到一个UIView,但那没有帮助,除非我错过了一些东西。
我试着谷歌一下但是我只在iOSDevice的Id上得到一堆点击。
编辑:我还没有机会测试这个,但我想我找到了一种可能的方法。
var kbSize = ((UIView) info.ObjectForKey(UIKit.UIKeyboard.FrameBeginUserInfoKey)).Frame.Size;
在我有机会测试从Id返回的对象是否属于UIView类型之前,我将花费一些时间。
在Xamarin中,您可以使用强类型通知,它将为您提供所需的一切,而无需打开数据框。
请看下面的例子:http://developer.xamarin.com/api/type/MonoTouch.UIKit.UIKeyboard/
在您的例子中,您想要使用ObserveDidShow
而不是ObserveDidChangeFrame
,但其思想是相同的。
也就是说,如果你仍然想使用另一种方法,从ObjectForKey调用出来的值是一个NSValue,所以你要做的是将结果转换为NSValue,然后使用CGRectValue属性。
更新:您想要的示例的完整链接:
http://developer.xamarin.com/api/member/MonoTouch.UIKit.UIKeyboard + Notifications.ObserveDidShow (System.EventHandler % 7 bmonotouch.uikit.uikeyboardeventargs % 7 d)/