应用"新特性"功能demo

iOS11 SDK 新特性 CoreML 及swift 小demo github代码 如果本博客对您有帮助,希望可以得到您的赞赏! swift 机器学习Core ML的简单调用小demo。完整代码附上: https://github.com/Liuyubao/LYBCoreMLDemo iOS11 新增特性 iOS11 SDK 的大的框架有两个,分别是集成机器学习的 Core ML 和创建增强现实 (AR) 应用的 ARKit。 CoreML... 阅读详情

1.利用UICollectionViewController来做应用新特性的界面

//
//  NewFeatureCollectionViewController.swift

import UIKit

private let reuseIdentifier = "Cell"

class NewFeatureCollectionViewController: UICollectionViewController {
    /// 页面个数
    private let pageCount = 4;
    /// 布局对象
    private var layout:UICollectionViewFlowLayout = NewFeatureLayout()

    init(){
        super.init(collectionViewLayout: layout)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // 1.注册cell
        // UICollectionViewCell.self 在OC里这样写:[UICollectionViewCell class]
        self.collectionView!.registerClass(NewFeatureCell.self, forCellWithReuseIdentifier: reuseIdentifier)

        // Do any additional setup after loading the view.
    }



    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */

    // MARK: UICollectionViewDataSource
    /**
     返回一个有多少个cell
     */
    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return pageCount
    }

    /**
     返回对应indexPath的cell
     */
    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        // 1.获取cell
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! NewFeatureCell

        // 2.设置cell上的数据
        cell.imageIndex = indexPath.item

        // 3.返回cell
        return cell
    }

    // MARK: UICollectionViewDelegate

    /**
     一个cell完成显示后会调用
     */
    override func collectionView(collectionView: UICollectionView, didEndDisplayingCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {

        //indexPath 是上一页的索引

        // 1.拿到当前显示的cell对应的索引
        let path = collectionView.indexPathsForVisibleItems().last!

        // 2.拿到对应的cell,让cell来执行按钮动画
        if path.item == (pageCount - 1) {
            let cell = collectionView.cellForItemAtIndexPath(path) as! NewFeatureCell
            cell.startBtnAnimation()
        }
    }


}

/// 自定义的UICollectionViewCell
class NewFeatureCell:UICollectionViewCell{

    /// 保存图片的索引
    var imageIndex:Int? {
        didSet{
            iconView.image = UIImage(named: "new_feature_\(imageIndex! + 1)")
        }
    }

    /**
     让按钮做动画
     */
    func startBtnAnimation(){
        startButton.hidden = false
        // 执行动画
        startButton.transform = CGAffineTransformMakeScale(0.0, 0.0)
        startButton.userInteractionEnabled = false

        // UIViewAnimationOptions(rawValue: 0) 对应OC的 knilOptions
        UIView.animateWithDuration(2.0, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 10, options: UIViewAnimationOptions(rawValue: 0), animations: {
            // 清空形变
            self.startButton.transform = CGAffineTransformIdentity
            }, completion: { (_) in
                self.startButton.userInteractionEnabled = true
        })
    }

    /**
     『开始微博』按钮被点击了
     */
    func startBtnClick(){
        // 去主页
        // 注意点:企业开发中如果要切换根控制器,最好都在AppDelegate中切换
        NSNotificationCenter.defaultCenter().postNotificationName(SwitchRootViewControllerKey, object: true)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)

        // 1.初始化UI
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setupUI(){
         // 1.添加子控件到contentView上
        contentView.addSubview(iconView)
        contentView.addSubview(startButton)

        // 2.布局子控件
        iconView.xmg_Fill(contentView)
        startButton.xmg_AlignInner(type: XMG_AlignType.BottomCenter, referView: contentView, size: nil,offset: CGPoint(x: 0,y: -160))
    }

    // MARK: - 懒加载
    private lazy var iconView = UIImageView()
    private lazy var startButton:UIButton = {
        let btn = UIButton()
        btn.setBackgroundImage(UIImage(named: "new_feature_button"), forState: UIControlState.Normal)
        btn.setBackgroundImage(UIImage(named: "new_feature_button_Highlighted"), forState: UIControlState.Highlighted)
        btn.hidden = true

        btn.addTarget(self, action: #selector(NewFeatureCell.startBtnClick), forControlEvents: UIControlEvents.TouchUpInside)

        return btn
    }()
}

/// 自定义布局
private class NewFeatureLayout:UICollectionViewFlowLayout{

    /**
     自定义布局,要重写这个方法
     */
    override func prepareLayout() {
        // 准备布局
        // 会先调用一共有多少行的方法,再调用返回每一个的cell


        // 1.设置layout布局
        itemSize = UIScreen.mainScreen().bounds.size
        minimumLineSpacing = 0
        minimumInteritemSpacing = 0
        scrollDirection = UICollectionViewScrollDirection.Horizontal


        // 2.设置collectionView的属性
        collectionView?.showsHorizontalScrollIndicator = false
        collectionView?.bounces = false
        collectionView?.pagingEnabled = true
    }
}

2.接下来需要在AppDelegate里判断是否是新版本?

    /**
     判断有木有新版本
     */
    private func isNewUpdate() -> Bool {
        // 1.获取当前软件的版本号
        let currentVersion = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String

        // 2.获取之前的软件版本号(存在本地)
        let sanboxVersion = NSUserDefaults.standardUserDefaults().objectForKey("CFBundleShortVersionString") as? String ?? ""

        // 3.比较
        if currentVersion.compare(sanboxVersion) == NSComparisonResult.OrderedDescending {
            // 有新版本
            NSUserDefaults.standardUserDefaults().setObject(currentVersion, forKey: "CFBundleShortVersionString")

            return true
        }

        return false
    }

3.如果是新版本,就设置窗口根控制器是新版本控制器

/**
     用于获取默认界面
     */
    private func defaultController() -> UIViewController {
        if isNewUpdate() {
            return NewFeatureCollectionViewController()
        }

        return MainViewController()
    }

在func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?)里

 // 1.创建window
        window = UIWindow(frame: UIScreen.mainScreen().bounds)
        window?.backgroundColor = UIColor.whiteColor()

        // 2.创建根控制器
        window?.rootViewController = defaultController()
        window?.makeKeyAndVisible()

        return true
ArcGIS在线体验中心Demo列表 ArcGIS在线体验中心(http://tm.arcgisonline.cn/)九月、十月更新了系列Demo。以下是Demo详细信息: 1.      2013用户大会主题演示系列:涵盖了Web API高性能炫酷演示案例,以及GeoEvent典型应用,如实时噪声监控以及社交媒体网络舆情监控应用演示、高效便捷的”影像在线分发平台“开创全新一代WebGIS应用模式; 2.      2013用户大 阅读详情

相关推荐

飞猪首页DEMO:大学生网页设计实战课程作业

本文还有配套的精品资源,点击获取 简介:本课程作业以“飞猪首页DEMO”为主题,指导学生学习网页设计基础,涵盖HTML、CSS、JavaScript等技术,旨在培养学生掌握创建功能完善首页界面的技能。作业涉及网站开发流程、页面布局设计、动态交互实现、前端框架应用等,使学生通过实践提升前端开发能力,为未来职业生涯奠定基础。 1. HTML基础与页面结构 1.1...

weixin_42356162的博客 2042

利用UICollectionView实现"新特性"功能demo

1.手动创建窗口,启动。判断是否有新版本,展示新特性界面// // AppDelegate.m #import "AppDelegate.h" #import "NewFeatureViewController.h" #define VersionKey @"version" @interface AppDelegate () @end @implementation AppDeleg

427

Web_Demo: 构建和实践Web开发技能的完整项目

超文本标记语言(HTML)作为构建网页内容的基础,是每一位前端开发者所必须掌握的。HTML文档由一系列的元素(elements)构成,这些元素通过标签(tags)来定义,例如<html><head>, 和<body>。每个标签通常包含一个开始标签和一个结束标签,这些标签在浏览器中被解析并展示为网页上的内容。在HTML的基本结构中,声明了文档类型和HTML版本,而<html>标签是所有HTML页面的根元素。<head>部分包含了元数据信息,如<title>定义了页面标题,

weixin_30533301的博客 1081

Spring6的新特性,正式“抛弃”feign了

上文中创建工程的时候,引入了 Spring Reactive Web 的依赖,在创建代理的service对象的时候,使用了其中的 WebClient 类型。只是,我们的一些思维还未转变过来,对 feign 的底层实现也缺乏一定的了解。除了上述例子中的简单使用之外,添加了 HttpExchange 的方法还支持各种类型的参数,这一点也与 Spring MVC 的 Controller 方法类似,方法的返回值也可以是任意自定义的实体类型(就像上面的例子一样),此外,还支持自定义的异常处理。

qq_42003636的博客 1866

【通信原理 入坑之路】—— 详解IQ调制以及星座图原理

文章目录一. IQ调制与解调的原理与过程二.PSK(相移键控)和IQ调制的关系:2.1 用IQ调制实现QPSK调制 一. IQ调制与解调的原理与过程 IQ调制的定义是:“IQ调制就是数据分为两路,分别进行载波调制,两路载波相互正交。I是in-phase(同相), q是 quadrature(正交)” 我们通过下面的示意图介绍IQ调制的过程: 首先,信号分成两路:I路和Q路(为了方便理解我们把这两...

凝望,划过星空的博客 11万+

直流耦合系统介绍

参考《SMA如何使用直流耦合技术实现更高效的光伏电站-白皮书》

圆桌骑士的博客 732

《Java新特性展示项目》推荐

《Java新特性展示项目》推荐 1. 项目基础介绍 本项目是一个开源的Java项目,主要使用Java语言编写。项目名为“demo-java-x”,托管在GitHub上,项目地址为:https://github.com/nipafx/demo-java-x.git。该项目旨在演示Java 9至Java 18版本中所引入的新特性和功能。 2. 项目的核心功能 项目的核心功能是展示Java语言在不同版本...

gitblog_00862的博客 387

避坑指南:从聚宽迁移到QMT必须知道的5个细节(含Redis连接异常处理)

本文详细解析了从聚宽迁移到QMT平台时需注意的5个关键细节,特别是Redis连接池优化和xtquant重连机制。通过实战代码示例,帮助量化团队解决信号传递稳定性、时间同步、滑点控制等核心问题,确保交易策略平稳过渡。

weixin_27303545的博客 430

Spring Boot 2.x新特性:Demo项目版本升级终极指南

Spring Boot 2.x带来了众多令人兴奋的新特性和改进,从依赖管理到配置属性都发生了显著变化。作为深入学习并实战Spring Boot的项目,spring-boot-demo项目基于Spring Boot 2.1.0.RELEASE版本,为我们提供了完美的升级学习案例。本指南将带你全面了解Spring Boot 2.x的核心变化和升级要点。 ## 🚀 Spring Boot 2.x核心

gitblog_01168的博客 391

LLM大模型基础知识【一】

大语言模型(LLM):是指在自然语言处理(Natural Language Processing,NLP)领域中的一类大模型,通常用于处理文本数据和理解自然语言。这类大模型的主要特点是它们在大规模语料库上进行了训练,以学习自然语言的各种语法、语义和语境规则。例如:GPT系列(OpenAI)、Bard(Google)、文心一言(百度)。视觉大模型:是指在计算机视觉(Computer Vision,CV)领域中使用的大模型,通常用于图像处理和分析。

lin_xi_xi的博客 2878

C++语言程序设计教程第4版杨进才沈显君课后习题答案解析

为了更好地学习这门课程,我尝试在网上寻找一些学习资料和参考书籍,但效果并不是很理想。因此,我希望能有一些学长学姐或者是有经验的程序员能够分享一些学习经验和方法,让我更好地掌握这门课程。学习过程中,我发现这本书的内容非常丰富,讲解也非常详细,对于像我这样编程基础薄弱的学生来说,是一本非常实用的教材。同时,我也希望有经验的程序员能够推荐一些适合初学者的C++语言学习资料和工具,以便我能更好地学习和掌握这门课程。总之,希望能得到大家的帮助和支持,让我更好地学习和掌握C++语言程序设计。主 编: 杨进才,沈显君。

weixin_58833001的博客 1334

探索 Vue 3 的魅力:Vue3-Demo 项目深度解析

探索 Vue 3 的魅力:Vue3-Demo 项目深度解析 在前端开发领域,Vue.js 以其易学易用和强大的功能深受开发者喜爱。随着 Vue 3 的发布,其性能、特性和可扩展性都有了显著提升。今天,我们将深入探讨一个基于 Vue 3 的示例项目 —— ,通过它来了解 Vue 3 的强大之处。 项目简介 Vue3-Demo 是 VincentZyc 创建的一个开源项目,旨在展示 Vue 3 的核心...

gitblog_00072的博客 563

R语言计算植物群落重要值:从基础概念到优势种判定

在植被生态学研究中,重要值是衡量物种在群落中地位的核心指标,它综合了相对多度、相对频度与相对显著度三个维度,能够客观反映物种的数量优势、分布广度与空间占据能力。理解重要值的生态学逻辑,是开展群落分类、优势种判定及多样性分析的基础。而R语言凭借其批量处理、可复现和与后续多元统计无缝衔接的优势,成为生态学研究者处理样方数据的高效工具。从野外记录的宽表到标准化长表,再到分组汇总计算相对指标,R语言能够显著提升数据处理效率与准确性。本文以实测群落数据为例,系统梳理重要值的两种算法口径、基于dplyr和tidyr的完

weixin_42634811的博客 268

探索Vue3的未来:深入实践Vue3-Demo

探索Vue3的未来:深入实践Vue3-Demo 在这个快速发展的前端世界中,,为我们提供了一个深入了解和实践Vue3特性的完美平台。 项目简介 Vue3-Demo是由@benyasin创建的一个实战项目,它旨在演示Vue3的新特性,包括Composition API、Suspense、Teleport等,并结合TypeScript进行编写,以增强代码类型安全。通过这个项目,你可以迅速上手并领略Vu...

gitblog_00022的博客 395

量子计算入门指南:密度算符的核心概念与应用解析

本文深入解析了量子计算中密度算符的核心概念与应用。作为描述量子系统“状态的状态”的关键数学工具,密度算符能有效处理混合态与子系统描述,是理解量子噪声、量子纠错和开放系统演化的基石。文章通过对比纯态与混合态,阐释了密度矩阵的数学定义与物理意义,并结合代码示例演示了其在实际量子计算问题中的强大威力。

day7的博客 469

微信小程序|基于小程序实现定位打卡功能

此文主要在小程序内实现打卡功能,可根据用户位置与公司设定的打卡范围实时判断打卡是否合法,并在后台对打卡记录进行管理。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

demo flink写入kafka_FlinkSQL DDL新特性与Kafka整合——Flink1.10

导读:Flink在1.9 版本中新增了一个SQL DDL的新特性并在1.10版本也进行了一些优化使其具备可用于生产环境的能力。Flink拥有丰富的连接器生态系统,尽管这些连接器经过了严格的测试和生产准备,但它们是用Java编写并以代码配置的,这意味着它们不适合纯SQL或Table应用程序。为了获得全面的SQL经验,不仅需要使用SQL编写查询,还需要使用表定义。本文将举一个简单的FlinkSQL与K...

weixin_29938009的博客 478

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java21新特性Demo

Java21版本于 2023 年 9 月 19 日发布,自从 Java 改为 6 个月发布一个版本以来,此为如期交付的第 12 个版本。Java21 是 Java 17之后的目前最新的 LTS版本(长期技术支持版本),其中备受关注的新特性是虚拟线程和分带ZGC。虚拟线程在 Java 21中将成为正式功能。Java 21 有望将会成为继 java8 之后又一个流行的 Java 版本。接下来,让我们一探究竟,和大家分享Java21的新特性。

Sparkleii的博客 1437

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JDK19新特性使用详解

JDK19于2022-09-20发布GA版本,本文将会详细介绍JDK19新特性的使用。

2401_87878486的博客 1088

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java11新特性总结

Java11新特性简介 美国时间 2018年09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。 可以看出 Java 8 扩展支持到 2025 年,而 Java 11 扩展支持到 2026 年。 现在大部分都在用 Java 8,Java 9 和 10 目前很少有人在用,现在 Java 11 长期支持,也已经包含了 9 和 10 的全部功能,...

lixinkuan的博客 2965

推荐使用:Next 13 Demo - 简单而高效的笔记应用构建工具

推荐使用:Next 13 Demo - 简单而高效的笔记应用构建工具 项目介绍 Next 13 Demo 是一个基于最新版本的 Next.js 和 Pocketbase 构建的简单笔记应用示例。这个项目旨在帮助开发者快速理解和实践如何利用这两个强大的工具来构建现代Web应用程序。通过这个项目,您可以轻松地创建一个功能齐全的个人记事本,同时体验到最新的前端开发技术带来的便利和效率。 项目技术分析 ...

gitblog_00004的博客 487

Vue3-Demo: 探索Vue.js 3.0的新高度与无限可能

Vue3-Demo: 探索Vue.js 3.0的新高度与无限可能 项目简介 Vue3-Demo 是一个基于最新 Vue.js 3.0 框架构建的应用示例项目,旨在展示 Vue 3 的新特性、优化和最佳实践。它包含了一系列精心设计的组件和功能,帮助开发者快速理解和掌握 Vue 3 的核心概念。 技术分析 1. Composition API Vue 3 引入了 Composition API,这是一...

gitblog_00022的博客 1106

java8新特性及demo

java8新特性及demo,支持原创,转载:https://www.cnblogs.com/liuxiaozhi23/p/10880147.html 一、Java 8 Lambda 表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用Lambda 表达式可以使代码变的更加简洁紧凑。 1.1 语法 lambda 表达式的语法格式如下: (parameters) -> expression或

qq_38976745的博客 412

探索Android Jetpack Demo:构建高效现代应用的新途径

探索Android Jetpack Demo:构建高效现代应用的新途径 在这个数字化的时代,开发者们正在寻找更有效率的方式来构建高性能、高可维护性的Android应用程序。Zhiwei1990 的 android-jetpack-demo 项目正是一个值得推荐的资源,它是一个全面展示Google Android Jetpack组件用法的示例应用,旨在帮助开发者快速理解和掌握这些强大的工具。 项目...

gitblog_00034的博客 353

Spring Boot 3新特性解析:从零开始构建现代化应用

Spring Boot 3通过拥抱Java生态的革新,为开发者提供了构建高性能、高可观测性应用的利器。无论是微服务、Serverless还是传统单体架构,开发者都能从中获得显著的生产力提升。旧项目迁移至Spring Boot 3的兼容性处理结合Spring Cloud 2022.x构建分布式系统深度优化GraalVM原生镜像的运行时性能。

小筱在线博客 1325
上一篇: Swift获取沙盒中目录的一个分类
下一篇: Swift NSDate的一个分类,把"Mon Apr 04 19:45:37 +0800 2016"这种格式的时间转换为"2016-04-04 11:45:37 +0000"
学习笔记666
博客等级 码龄12年 1047粉丝 1369原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值