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 进行布局:

 1         public override void LayoutSubviews() {
 2             base.LayoutSubviews();
 3
 4             var w = this.Frame.Size.Width;
 5             var h = this.Frame.Size.Height;
 6             for (var i = 0; i < this.Views.Count; i++) {
 7                 var v = this.Subviews[i];
 8
 9                 var rect = new CGRect(w * i, 0, w, h);
10                 v.Frame = rect;
11             }
12
13             this.ContentSize = new CGSize(w * this.Views.Count, h);
14         }

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

1             this.Scrolled += FlipView_Scrolled;
2         }
3
4         void FlipView_Scrolled(object sender, EventArgs e) {
5             var pageWidth = this.Frame.Size.Width;
6             var page = (int)Math.Floor((this.ContentOffset.X - pageWidth / 2) / pageWidth) + 1;
7             this.PageControl.CurrentPage = page;
8         }

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

 1         protected override void OnElementChanged(ElementChangedEventArgs<Flip> e) {
 2             base.OnElementChanged(e);
 3
 4             var fv = new Controls.FlipView();
 5             var items = this.GetChildrenViews().ToList();
 6             fv.SetItems(items);
 7
 8             this.SetNativeControl(fv);
 9             this.Control.SizeToFit();
10             this.AddSubview(this.Control.PageControl);
11         }

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

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

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

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

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

1         public void UpdateLayout(double width, double height) {
2             this.Frame = new CGRect(0, 0, width, height);
3             this.PageControl.Frame = new CGRect(0, height - 20, width, 20);
4             //this.BringSubviewToFront(this.PageControl);
5             this.SetNeedsLayout();
6         }

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

错误 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 完。

谢谢捧场。

时间: 2024-12-19 01:35:54

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

挣扎着写 FlipView For Xamarin.Form

Xamarin.Form 中没有 FlipView, 也没有 CarouselView , 有的只是一个 CarouselPage, 它是一个 Page, 不是一个 View ! Windows Phone 8.1 下有个控件叫 FlipView, 但是它不存于在 WP Siliverlight ! 而Xamarin.Form 的 WP 项目又是基于 WP Siliverlight 的. Android 原生也没有 FlipView 类似的控件. IOS 下冒似也没有. 我急切的想弄一个这样的东

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

原文:Xamarin.Form与Xamarin.Android或Xamarin.IOS的区别简述 Xamarin.Form与Xamarin.Android或Xamarin.IOS的区别简述: 可能刚刚接触Xamarin的人来说,对于这个概念比较的模糊,认为这说的不都是同一个东西吗?事实并不是这样的,我们先来说说Xamarin.Android和Xamarin.IOS吧,这两个其实就是一个单独的工程,在这里面我们可以针对安卓或者IOS进行代码的编写,而且支持原生的代码调用,这对于安卓或者IOS的开发

Xamarin.Form 下拉刷新动画

好像园子里对 Xamarin 感兴趣的人很少啊... 来, 先给各位爷们逗个笑, 本山大爷本色出演: 照例, 上源码: https://github.com/gruan01/ListViewExtend 目前只有 WP 的效果, Android 还在研究, IOS 的还没计划. ------------------------------------------------------ Xamarin.Form 的 ListView 只支持下拉刷新 (这里有用法), 上拉 加载更多 没有对应的事

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

感谢台风, 这个十一长假让我好好的休息了一回, 睡觉到腰酸背疼, 看电影看到眼发红. 今天最后一天, 不敢出去逛, 不知道哪会还会下暴雨... 嗯嗯..这个项目其实在十一之前就开始了, 工作无聊,没有新任务, 我就搞起它. 至于为什么选 Discuz 的 BBS , 因为我常上的几个网站, 都有一堆的 APP , 官方的, 第三方的 . BBS 虽然已经没落了, 但是官方的 APP 居然用不了! 写这个东西之前, 本来想拿来看 1024 的, 但是 1024 要么不是最新版本, 要么禁用了 AP

Xamarin.Form 项目总结

离上一篇 用Xamarin.Form做个技术预览版的APP  有一个月零几天了. 现在这个APP在业务方面的代码由另外一个同事全权处理, 我又闲了下来, 要去弄另外一个项目. 这个把月, 踩过 Xamarin.Form 很多坑, 填过很多坑, 也造了很坑... 这里做个总结, 给想跳坑的你做个参考. ListView 的下拉刷新 下拉刷新还是很简单的, 首先要设置 listView.IsPullToRefreshEnabled 为 true 当下刷新时, RefreshCommand 会被调用,

xamarin.form Tabbed选项卡式页

<?xml version="1.0" encoding="utf-8" ?> <TabbedPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:App1;assembly=App1&qu

Xamarin.Form 蓝牙ble

本文介绍Xamarin.Form的蓝牙使用方法,开始之前说说题外话,就Xamarin.Form来说,在国内是没多少人在弄的,但对于我自己来说,是吃了这碗饭,也希望在这行做的人越来越多,越来越好,本人2016年开始入使用Xamarin.Form开发App,那时候刚微软刚收购Xamarin,也正式开源免费给开发者使用,但那时候的本说实话是有多不完善的,直到现在微软依然有很多不完善的功能,所以在国内学这个,一般是由公司高层推这个技术,直接至底向上的非常少.微软的东西在国内环境来说,多不太好,很多大的互

Xamarin.Form指纹认证

Xamarin.Form框架并没有提供指纹认证功能,需要分平台实现! Android的Fingerprint Authentication 参考:https://docs.microsoft.com/zh-cn/xamarin/android/platform/fingerprint-authentication/ 概述 指纹扫描仪在Android设备上的到来为应用程序提供了用户身份验证的传统用户名/密码方法的替代方案. 使用指纹对用户进行身份验证可以使应用程序合并比用户名和密码更不安全的安全性

Xamarin.Form 初学 之 服务引用-WCF服务引用

最近研究一下Xamarin.Form,感觉这个东西确实不错,之前一直做WPF相关,然后看到Xamarin.Form开发与WPF特别相似的语法.很有兴趣! 可是环境部署对于小白的我,可是费了不少功夫!安装VS2015费了我好些时间!安装部署以后再说!先说说引用WCF服务的坑吧! 官方文档:Xamarin可以调用WCF,可以怎么调用???(满脑子问号)https://developer.xamarin.com/guides/xamarin-forms/web-services/consuming/w