{"id":7723,"date":"2016-01-13T15:54:28","date_gmt":"2016-01-12T21:54:28","guid":{"rendered":"http:\/\/www.moonmile.net\/blog\/?p=7723"},"modified":"2016-01-13T15:57:31","modified_gmt":"2016-01-13T06:57:31","slug":"xamarin-forms-%e3%81%a7%e3%83%89%e3%83%a9%e3%83%83%e3%82%b0%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%97%e3%82%88%e3%81%86%ef%bc%88xamarin-forms-on-ios%e7%b7%a8%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.moonmile.net\/blog\/archives\/7723","title":{"rendered":"Xamarin.Forms \u3067\u30c9\u30e9\u30c3\u30b0\u3092\u5b9f\u88c5\u3057\u3088\u3046\uff08Xamarin.Forms on iOS\u7de8\uff09"},"content":{"rendered":"<p>Xamarin.Forms \u3067\u30c9\u30e9\u30c3\u30b0\u3092\u5b9f\u88c5\u3057\u3088\u3046\uff08\u306e\u3046\u308a\u3093\u7de8\uff09<br \/>\n<a href=\"http:\/\/www.moonmile.net\/blog\/archives\/7653\">http:\/\/www.moonmile.net\/blog\/archives\/7653<\/a><br \/>\nXamarin.Forms \u3067\u30c9\u30e9\u30c3\u30b0\u3092\u5b9f\u88c5\u3057\u3088\u3046\uff08Android\u7de8\uff09<br \/>\n<a href=\"http:\/\/www.moonmile.net\/blog\/archives\/7667\">http:\/\/www.moonmile.net\/blog\/archives\/7667<\/a><br \/>\nXamarin.Forms \u3067\u30c9\u30e9\u30c3\u30b0\u3092\u5b9f\u88c5\u3057\u3088\u3046\uff08Xamarin.Forms on Android\u7de8\uff09<br \/>\n<a href=\"http:\/\/www.moonmile.net\/blog\/archives\/7670\">http:\/\/www.moonmile.net\/blog\/archives\/7670<\/a><\/p>\n<p>\u306e\u7d9a\u304d\u3067\u3059\u3002iOS \u7248\u306f\u6bd4\u8f03\u7684\u7c21\u5358\u306b\u3067\u304d\u305f\u306e\u3067\u3001Xamarin.iOS \u7248\u3068 Xamarin.Forms \u7248\u3092\u3044\u3063\u307a\u3093\u306b\u4f5c\u3063\u3066\u3044\u3057\u307e\u3044\u307e\u3059\u3002<\/p>\n<h2>\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9<\/h2>\n<p><a href=\"https:\/\/github.com\/moonmile\/BoxDrag \u306b\u3042\u308a\u307e\u3059\u3002\">https:\/\/github.com\/moonmile\/BoxDrag \u306b\u3042\u308a\u307e\u3059\u3002<\/a><\/p>\n<h2>Xamarin.iOS \u3067\u30c9\u30e9\u30c3\u30b0\u3092\u5b9f\u88c5\u3059\u308b<\/h2>\n<p>iOS \u306e\u307f\u3067\u52d5\u304f\u30d0\u30fc\u30b8\u30e7\u30f3\u306f\u3001BoxDragApple.iOS \u3068\u3044\u3046\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u307b\u3046\u3067\u3059\u3002\u4ee5\u524d\u306f\u3001ViewController \u306b\u30bf\u30c3\u30d7\u30a4\u30d9\u30f3\u30c8\uff08TouchesBegan\u7b49\uff09\u3092\u9001\u3063\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u3001\u4eca\u56de\u306f Android \u3068\u52d5\u304d\u3092\u5408\u308f\u305b\u308b\u305f\u3081\u306b\u81ea\u524d\u306e\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb BoxViewEx \u3092\u4f5c\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\npartial class BoxViewEx : UIView\r\n{\r\n    public BoxViewEx (IntPtr handle) : base (handle)\r\n    {\r\n    }\r\n    public override void TouchesBegan(NSSet touches, UIEvent evt)\r\n    {\r\n        base.TouchesBegan(touches, evt);\r\n        UITouch touch = touches.AnyObject as UITouch;\r\n    }\r\n    public override void TouchesMoved(NSSet touches, UIEvent evt)\r\n    {\r\n        base.TouchesMoved(touches, evt);\r\n        UITouch touch = touches.AnyObject as UITouch;\r\n        var newPoint = touch.LocationInView(this);\r\n        var previousPoint = touch.PreviousLocationInView(this);\r\n        nfloat offsetX = previousPoint.X - newPoint.X;\r\n        nfloat offsetY = previousPoint.Y - newPoint.Y;\r\n        this.Frame = new CoreGraphics.CGRect(\r\n            this.Frame.X - offsetX,\r\n            this.Frame.Y - offsetY,\r\n            this.Frame.Width,\r\n            this.Frame.Height);\r\n    }\r\n    public override void TouchesEnded(NSSet touches, UIEvent evt)\r\n    {\r\n        base.TouchesEnded(touches, evt);\r\n    }\r\n}\r\n<\/pre>\n<p>\u3061\u3087\u3063\u3068\u306f\u307e\u308a\u3069\u3053\u308d\u304c\u3042\u3063\u3066\u3001Xamarin.iOS \u3067\u30e6\u30fc\u30b6\u30fc\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u3092\u4f5c\u308b\u3068\u304d\u306f\u3001<\/p>\n<ol>\n<li>Storyboard \u3067\u3001BoxViewEx \u3092\u8a18\u8ff0\u3057\u3066\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u3092\u4f5c\u308b\u3002<\/li>\n<li>\u30b3\u30fc\u30c9\u306e\u307b\u3046\u3067\u3001partial \u4ed8\u304d\u306e BoxViewEx \u30af\u30e9\u30b9\u304c\u4f5c\u3089\u308c\u308b\u3002<\/li>\n<li>\u751f\u6210\u3055\u308c\u305f BoxViewEx.cs \u3092\u4f7f\u3046<\/li>\n<\/ol>\n<p>\u3068\u3044\u3046\u624b\u9806\u304c\u5fc5\u8981\u3067\u3059\u3002\u5148\u306b BoxViewEx \u30af\u30e9\u30b9\u3092\u4f5c\u3063\u305f\u308a\u3001partial \u7121\u3057\u3067\u4f5c\u3063\u305f\u306e\u3067\u3059\u304c\u3046\u307e\u304f\u52d5\u304d\u307e\u305b\u3093\u3002\u304a\u305d\u3089\u304f Storyboard \u306e\u30c7\u30b6\u30a4\u30ca\u3067\u81ea\u524d\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u3092\u4f5c\u3063\u305f\u3068\u304d\u306b\u3001\u4f55\u3089\u304b\u306e ID \u304c\u5272\u308a\u632f\u3089\u308c\u308b\u306e\u3067\u3057\u3087\u3046\u3002<\/p>\n<p><a href=\"http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2016\/01\/dworkblogimage20160113_01org.jpg\"><img decoding=\"async\" src=\"http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2016\/01\/dworkblogimage20160113_01thum.jpg\" border=\"0\" \/><\/a><\/p>\n<p>BoxViewEx \u30af\u30e9\u30b9\u306f\u3001UIView \u3092\u7d99\u627f\u3057\u305f\u3060\u3051\u306a\u306e\u3067\u666e\u901a\u306b Storyboard \u3067\u6271\u3048\u307e\u3059\u3002<\/p>\n<p>\u30bf\u30c3\u30c1\u30a4\u30d9\u30f3\u30c8\u306b\u3088\u308b\u30c9\u30e9\u30c3\u30b0\u306f\u3001TouchesMoved \u30e1\u30bd\u30c3\u30c9\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3059\u308c\u3070 ok \u3067\u3059\u3002\u79fb\u52d5\u3057\u305f\u3068\u304d\u306e\u5dee\u5206\u3092\u53d6\u3063\u3066 Frame \u30d7\u30ed\u30d1\u30c6\u30a3\u306b\u4f4d\u7f6e\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<h2>Xamarin.Forms on iOS \u3067\u30c9\u30e9\u30c3\u30b0\u3092\u5b9f\u88c5\u3059\u308b<\/h2>\n<p>iOS \u30aa\u30f3\u30ea\u30fc\u7248\u304c\u3067\u304d\u305f\u306e\u3067\u3001Xamarin.Forms \u3067\u52d5\u304f\u3088\u3046\u306b\u3057\u307e\u3059\u3002<br \/>\nForms \u306e\u3042\u308b PCL \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306f Android \u3067\u4f5c\u3063\u305f\u3068\u304d\u306e\u307e\u307e\u306b\u3057\u3066\u304a\u3044\u3066\u3001BoxDragXF.iOS \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u3001<br \/>\nBoxExRenderer \u30af\u30e9\u30b9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nusing BoxDragXF;\r\nusing BoxDragXF.iOS;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing Xamarin.Forms;\r\nusing Xamarin.Forms.Platform.iOS;\r\nusing Foundation;\r\nusing UIKit;\r\n\r\n &#x5B;assembly: ExportRenderer(typeof(BoxViewEx), typeof(BoxExRenderer))]\r\nnamespace BoxDragXF.iOS\r\n{\r\n    class BoxExRenderer : BoxRenderer\r\n    {\r\n        protected override void OnElementChanged(ElementChangedEventArgs&lt;BoxView&gt; e)\r\n        {\r\n            base.OnElementChanged(e);\r\n        }\r\n        public override void TouchesBegan(NSSet touches, UIEvent evt)\r\n        {\r\n            base.TouchesBegan(touches, evt);\r\n            UITouch touch = touches.AnyObject as UITouch;\r\n        }\r\n        public override void TouchesMoved(NSSet touches, UIEvent evt)\r\n        {\r\n            base.TouchesMoved(touches, evt);\r\n            UITouch touch = touches.AnyObject as UITouch;\r\n            var newPoint = touch.LocationInView(this);\r\n            var previousPoint = touch.PreviousLocationInView(this);\r\n            nfloat dx = newPoint.X - previousPoint.X;\r\n            nfloat dy = newPoint.Y - previousPoint.Y;\r\n            var el = this.Element as BoxViewEx;\r\n            el.OnManipulationDelta(el, new ManipulationDeltaRoutedEventArgs(el, dx, dy));\r\n        }\r\n        public override void TouchesEnded(NSSet touches, UIEvent evt)\r\n        {\r\n            base.TouchesEnded(touches, evt);\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>\u66f8\u304d\u65b9\u306f\u3001Android \u306e\u6642\u3068\u540c\u3058\u3067\u3059\u306d\u3002iOS \u306e\u5834\u5408\u306f\u3001\u79fb\u52d5\u8ddd\u96e2\u306e\u5dee\u5206\u304c\u3059\u3067\u306b\u8a08\u7b97\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3001\u305d\u306e\u307e\u307e OnManipulationDelta \u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u305b\u3070 ok \u3067\u3059\u3002<\/p>\n<h2>\u5b9f\u884c\u3057\u3066\u307f\u308b<\/h2>\n<p>\u3053\u308c\u3092\u52d5\u304b\u3057\u3066\u307f\u305f\u306e\u304c\u3001\u3053\u306e\u52d5\u753b\u3067\u3059\u3002<\/p>\n<div style=\"width: 640px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-7723-1\" width=\"640\" height=\"480\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2016\/01\/20160108-iOS-Drag-XF.mp4?_=1\" \/><a href=\"http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2016\/01\/20160108-iOS-Drag-XF.mp4\">http:\/\/www.moonmile.net\/blog\/wp-content\/uploads\/2016\/01\/20160108-iOS-Drag-XF.mp4<\/a><\/video><\/div>\n<p>Renderer \u3092\u5207\u308a\u66ff\u3048\u308b\u3060\u3051\u3067\u3001Android \u3068 iOS \u304c\u540c\u3058\u3088\u3046\u306b Xamarin.Forms \u3067\u52d5\u304f\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002\u4f3c\u305f\u3088\u3046\u306a\u611f\u3058\u3067\u3001\u72ec\u81ea\u306e\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb\u3092\u4f5c\u3063\u3066\u3001PCL \u5074\u3067\u5171\u901a\u3067\u52d5\u304b\u3059\u3068\u3044\u3046\u3053\u3068\u304c\u3067\u304d\u308b\u8a33\u3067\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Xamarin.Forms \u3067\u30c9\u30e9\u30c3\u30b0\u3092\u5b9f\u88c5\u3057\u3088\u3046\uff08\u306e\u3046\u308a\u3093\u7de8\uff09 http:\/\/www.moonmile.net\/blog\/archives\/7653 Xamarin.Forms \u3067\u30c9\u30e9\u30c3\u30b0\u3092\u5b9f\u88c5\u3057\u3088\u3046\uff08Android\u7de8 &hellip; <a href=\"https:\/\/www.moonmile.net\/blog\/archives\/7723\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[23,62],"tags":[],"class_list":["post-7723","post","type-post","status-publish","format-standard","hentry","category-csharp","category-xamarin"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/7723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/comments?post=7723"}],"version-history":[{"count":3,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/7723\/revisions"}],"predecessor-version":[{"id":7727,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/7723\/revisions\/7727"}],"wp:attachment":[{"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/media?parent=7723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/categories?post=7723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/tags?post=7723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}