之前写过两篇博文 是关于 Android 和 Windows Phone 下的 FlipView 的实现。

上上周,有个印度佬通过 GitHub 找到我, 问我有没有打算个 ios 端的,还说比较了相同功能的几个开源项目,我的这个项目值得推荐。说的我心潮澎湃,上周末花了一个周末升级到最新的 XCode 7,顺便也升级到了 OS X EI Capitan, 安装了最新的 Xamarin, 使用了 IOS 9 提供的免费证书,终于于今天凌晨1点(10月25)把 ios 端的 renderer 给写出来了。

先上效果图:

项目地址:

https://github.com/gruan01/FlipView

支持 ios / Android / Windows Phone

相比之下,ios 的实现最简单, 只用了 UIScrollView + UIPageControl (白点) 就完成了,代码易于理解。

https://github.com/gruan01/FlipView/blob/master/FlipView/FlipView.iOS/Controls/FlipView.cs

Android 下使用了 PageAdapter + ViewPager + 一堆的点缀,控制点N多,不易阅读理解。

Windows Phone 下从 ItemsControl 扩展出来一个新控件,还算清晰吧。

本文主要介绍 ios 端,其它请参考:

Xamarin 实现 Android 无限循环展示, FlipView

挣扎着写 FlipView For Xamarin.Form

UIScrollView 可以设置分页(PagingEnable), 这个特性满足 FlipView 的需求。

如果要有分页效果, UIScrollView 的 ContentSize 必须大于它的 Frame.

要使每一页上都有衔接的内容显示,必须按 X 或 Y 方向对子 View 进行布局:

         public override void LayoutSubviews() {
             base.LayoutSubviews();

             var w = this.Frame.Size.Width;
             var h = this.Frame.Size.Height;
             ; i < this.Views.Count; i++) {
                 var v = this.Subviews[i];

                 , w, h);
                 v.Frame = rect;
             }

             this.ContentSize = new CGSize(w * this.Views.Count, h);
         }

要知道当前显示的是哪一页,需要监听 UIScrollView 的 Scrolled 事件:

             this.Scrolled += FlipView_Scrolled;
         }

         void FlipView_Scrolled(object sender, EventArgs e) {
             var pageWidth = this.Frame.Size.Width;
             ) / pageWidth) + ;
             this.PageControl.CurrentPage = page;
         }

this.PageControl 就是那几个白点,只负卖萌。 注意不要把它做为 UIScrollView 的子视图了, 它应该是和 UIScrollView 同一个父级的,要不然,这几个白点就会在切换页面的时候同时被滚来滚去。

         protected override void OnElementChanged(ElementChangedEventArgs<Flip> e) {
             base.OnElementChanged(e);

             var fv = new Controls.FlipView();
             var items = this.GetChildrenViews().ToList();
             fv.SetItems(items);

             this.SetNativeControl(fv);
             this.Control.SizeToFit();
             this.AddSubview(this.Control.PageControl);
         }

Android 的布局有 MATCH_PARENT 和 WRAP_CONTENT, windows phone 下更简单,这使得在 Android 和 WP 下不用关心空间大小的分配。

但是在 ios 下有一点麻烦,UIScrollView 的 子视图需分配 Frame, 还需要计算好 ContentSize。但是控件加载的时候,空间和大小都还没有分配, 当然无法给子视图分配 Frame, 同理 ContentSize 也无法计算。

无奈只得在 Render 的 OnElementChanged 方法中,SetNativeControl 之后,调用 SizeToFit 方法,已使 GetDesiredSize 可以被触发,并将分配的大小传给 UIScrollView

         public override SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint) {
             this.Control.UpdateLayout(widthConstraint, heightConstraint);
             return UIViewExtensions.GetSizeRequest(this.NativeView, widthConstraint, heightConstraint, 44.0, 44.0);
         }

在 UpdateLayout 方法中, 对 UIScrollView 的 Frame 进行调整, 然后强制重新布局 (LayoutSubviews 方法会被调用)。

         public void UpdateLayout(double width, double height) {
             , , width, height);
             , height - , width, );
             //this.BringSubviewToFront(this.PageControl);
             this.SetNeedsLayout();
         }

模拟器的效果就是上面的效果图, 但是在真机调试的时候,编译阶段报如下错误:

错误 30 error MT1007: Failed to launch the application 'XXX' on the device '“XXX': Look for
earlier warnings returned: 0x454. You can still launch the application manually by tapping on it. Xamarin.iOS

Extension 0 0

手动点击安装到真机的APP, 无法运行。 这个应该是 Xamarin 的 Bug, 和代码无关,改天换个低版本的 Xamarin 在试。

-----------------------------

OK 完。

谢谢捧场。

FlipView For Xamarin.Form 之 IOS的更多相关文章

  1. Xamarin.Form与Xamarin.Android或Xamarin.IOS的区别简述

    Xamarin.Form与Xamarin.Android或Xamarin.IOS的区别简述: 可能刚刚接触Xamarin的人来说,对于这个概念比较的模糊,认为这说的不都是同一个东西吗?事实并不是这样的 ...

  2. 给 Xamarin.Form For Windows Phone APP 加个漂亮的 "头"

    Windows Phone 是那个1%, 我也是那个1%, 不喜勿喷.WP 向来给 android / ios 的粉们一个最直观的印象: 丑.其实"丑"这个东西会一直下去,而且是个 ...

  3. Xamarin.Form 实例: Discuz BBS 客户端 源码分享

    感谢台风, 这个十一长假让我好好的休息了一回, 睡觉到腰酸背疼, 看电影看到眼发红. 今天最后一天, 不敢出去逛, 不知道哪会还会下暴雨... 嗯嗯..这个项目其实在十一之前就开始了, 工作无聊,没有 ...

  4. Xamarin.Form怎么调用原生方法

    ---恢复内容开始--- Xamarin.Form怎么调用原生包 今天我想和大家分享的是有关Xamarin如何调用安卓的原生代码,下面的例子以大家可能会经常用到的微信WX方法的调用. 首先我们新建一个 ...

  5. 12、xamarin form中实现H5 网页唤醒微信支付的方法

    在微信的支付中有种支付叫微信H5支付.方便用户在网页中轻松唤起微信进行支付. 当然微信不推荐大家使用这样的方式唤起微信支付.建议app还是使用正常的微信支付sdk即可 服务端与其他的建议参考微信支付官 ...

  6. C# 移动开发(Xamarin.Form) Plugin.BLE 蓝牙连接

    随着Xamarin.Form项目接近尾声,仔细一算才发现过来大半年时间了. 期间除了刚开始有闲情写写,现在总算有空来总结一下了. 来先说 Plugin.BLE (https://github.com/ ...

  7. Xamarin Mono Android Ios 安装、破解(4.12)

    一.Windows下面的安装 1. 安装环境介绍: Win8.1 企业版64位.VS2013,mono-android-4.12.02001,下面的安装过程都是在VS2013已经安装成功之后的操作,本 ...

  8. 【Xamarin挖墙脚系列:Xamarin正式发布了IOS的模拟器在Windows下】

    xamarin 的发展越来越迅速.如果还感觉这玩意儿是个鸡肋,辣么请跟的上时代吧 . (额,对微软产品有严重偏见的请绕行..............其实你可以看看.net 基金会现有的开源项目再说不开 ...

  9. Xamarin.Forms 开发IOS、Android、UWP应用

    C#语言特点,简单.快速.高效.本次我们通过C#以及Xaml来做移动开发. 1.开发工具visual studio 2015或visual studio 2017.当然visual studio 20 ...

随机推荐

  1. window10系统安装oracle11g时遇到INS-13001环境不满足最低要求

    机器安装了window10系统,之前有次安装oracle11g是成功了.但是机器后来固态硬盘坏了,又坏了个后,还是win10系统安装oracle11g时,出现INS-13001环境不满足最低要求,郁闷 ...

  2. Web Application Project is configured to use IIS. Unable to access the IIS metabase.(配置为使用IIS Web应用程序xxxx项目。无法访问IIS元数据库。)

    这几天重装系统,装了win10,居然用vs2013打开项目出现下面这个提示错误,搞了很久才知道原因: Even though I am an administrator on the machine, ...

  3. MyEclipse下创建的项目导入到Eclipse中详细的图文配置方法

    一.情景再现. 有些人比较喜欢用Myeclipse开发,有些人却比较喜欢用eclipse开发.但是其中有一个问题,Myeclipse里面的项目导入的时候出现了一个小小的问题. 如下: 二.说明问题 导 ...

  4. hyperv 创建第二代虚拟机

    环境:宿主机windows 8.1,虚拟机:windows 8.1 硬件:笔记本电脑,无线网络,没有有线网络网络配置先不设置 1.安装hyperv,控制面版-->程序和功能-->启用或关闭 ...

  5. 开启mysql慢查询

    Linux查看mysql 安装路径一.查看文件安装路径由于软件安装的地方不止一个地方,所有先说查看文件安装的所有路径(地址).这里以mysql为例.比如说我安装了mysql,但是不知道文件都安装在哪些 ...

  6. C++ string的大小写转换

    将一个string转换成大写或者小写,是项目中经常需要做的事情,但string类里并 没有提供这个方法.自己写个函数来实现,说起来挺简单,但做起来总让人觉得不方便.打个比方:早上起来想吃个汉堡,冰箱里 ...

  7. UI设计实战篇——利用Bootstrap框架制作查询页面的界面

    Bootstrap框架是一个前端UI设计的框架,它提供了统一的UI界面,简化了设计界面UI的过程(缺点是定制了界面,调整的余地不是太大).尤其是现在的响应时布局(我的理解是页面根据不同的分辨率,采用不 ...

  8. floyd算法 青云的机房组网方案(简单)

    青云的机房组网方案(简单) 青云现在要将 nn 个机房连成一个互相连通的网络.工程师小王设计出一个方案:通过在 nn 个机房之间铺设 n-1n−1 条双向的光纤,将所有的机房连接.可以假设数据在两个机 ...

  9. python中property干什么用的?

    先来段官方文档压压惊.. property(fget=None, fset=None, fdel=None, doc=None) Return a property attribute. fget i ...

  10. a 标签中调用js的几种方法

    我们常用的在a标签中有点击事件: 1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问 ...