FlipView For Xamarin.Form 之 IOS
之前写过两篇博文 是关于 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的更多相关文章
- Xamarin.Form与Xamarin.Android或Xamarin.IOS的区别简述
Xamarin.Form与Xamarin.Android或Xamarin.IOS的区别简述: 可能刚刚接触Xamarin的人来说,对于这个概念比较的模糊,认为这说的不都是同一个东西吗?事实并不是这样的 ...
- 给 Xamarin.Form For Windows Phone APP 加个漂亮的 "头"
Windows Phone 是那个1%, 我也是那个1%, 不喜勿喷.WP 向来给 android / ios 的粉们一个最直观的印象: 丑.其实"丑"这个东西会一直下去,而且是个 ...
- Xamarin.Form 实例: Discuz BBS 客户端 源码分享
感谢台风, 这个十一长假让我好好的休息了一回, 睡觉到腰酸背疼, 看电影看到眼发红. 今天最后一天, 不敢出去逛, 不知道哪会还会下暴雨... 嗯嗯..这个项目其实在十一之前就开始了, 工作无聊,没有 ...
- Xamarin.Form怎么调用原生方法
---恢复内容开始--- Xamarin.Form怎么调用原生包 今天我想和大家分享的是有关Xamarin如何调用安卓的原生代码,下面的例子以大家可能会经常用到的微信WX方法的调用. 首先我们新建一个 ...
- 12、xamarin form中实现H5 网页唤醒微信支付的方法
在微信的支付中有种支付叫微信H5支付.方便用户在网页中轻松唤起微信进行支付. 当然微信不推荐大家使用这样的方式唤起微信支付.建议app还是使用正常的微信支付sdk即可 服务端与其他的建议参考微信支付官 ...
- C# 移动开发(Xamarin.Form) Plugin.BLE 蓝牙连接
随着Xamarin.Form项目接近尾声,仔细一算才发现过来大半年时间了. 期间除了刚开始有闲情写写,现在总算有空来总结一下了. 来先说 Plugin.BLE (https://github.com/ ...
- Xamarin Mono Android Ios 安装、破解(4.12)
一.Windows下面的安装 1. 安装环境介绍: Win8.1 企业版64位.VS2013,mono-android-4.12.02001,下面的安装过程都是在VS2013已经安装成功之后的操作,本 ...
- 【Xamarin挖墙脚系列:Xamarin正式发布了IOS的模拟器在Windows下】
xamarin 的发展越来越迅速.如果还感觉这玩意儿是个鸡肋,辣么请跟的上时代吧 . (额,对微软产品有严重偏见的请绕行..............其实你可以看看.net 基金会现有的开源项目再说不开 ...
- Xamarin.Forms 开发IOS、Android、UWP应用
C#语言特点,简单.快速.高效.本次我们通过C#以及Xaml来做移动开发. 1.开发工具visual studio 2015或visual studio 2017.当然visual studio 20 ...
随机推荐
- leveldb源码分析--Iterator遍历数据库
在DBImpl中有一个函数声明为Iterator* DBImpl::NewIterator(const ReadOptions& options) ,他返回一个可以遍历或者搜索数据库的迭代器句 ...
- 关于Redis中的数据类型
一. Redis常用数据类型 Redis最为常用的数据类型主要有以下: String Hash List Set Sorted set 一张图说明问题的本质 图一: 图二: 代码: /* Object ...
- 用shell脚本写一个for循环
一.输出十遍北京 for((i=1;i<10;i++))> do> echo '北京';> done 二.死循环 for((;;))do#java -jar producer. ...
- iOS -数据库网络之xml解析
XML文件有2种解析方式 1.基于文档(document) 2.基于事件(sax) 1.IOS中XML文件获取 首先要将XML导入工程中 在ViewController的按钮事件中,代码如下: ...
- 利用API方式进行数据库的增删改查
/* 将数据库的增删改查单独放进一个包 */ package com.itheima28.sqlitedemo.dao; import java.util.ArrayList; import java ...
- PHPDBG
一.简介 PHPDBG的是一个轻量级.强大.易用的PHP调试平台.可以在PHP5.4和之上版本中使用.在php5.6和之上版本将内部集成. 二.安装 PHP源码下载 http://php.net/gi ...
- HttpClient如何解决302重定向问题
最近的接口测试,发现接口地址报302错误,通过上网搜索,发现问题所在,解决办法是需要请求重定向后的URI. package com.btv; import org.apache.http.Header ...
- bootstrap学习总结-js组件(四)
这次我们来看下js组件的使用,本篇文章会有点长,希望大家可以耐心看,相信收获会有不少.不少园友加我好友,表示喜欢我写文字的风格,简单明了,这里,再次谢谢你们的支持.一方面,博主自身技术有限,写的东西都 ...
- DoTween NGUI bug
多次动画导致UISprite丢失 DOTween动画进行时与UISprite有冲突,DOTween多次重复同一个动画时,UISprite会莫名的丢失 UISprite动画代码 CUIManager.I ...
- Javascript中的对象和原型(3)
在Javascript中的对象和原型(二)中我们提到,用构造函数创建的对象里面,每个对象之间都是独立的,这样就会降低系统资源的利用率,解决这样问题,我们就要用到下面提到的原型对象. 一 原型对象 原型 ...