Swift3 今日(TodayExtension)扩展图文笔记
>图片1(创建今日扩展)

>图片2

>图片3(设置大小)

>图片4(绘画控件)

>图片5(设置共享文件)

>图片6(设置群组ID)

>图片7(设置URL Schemes)

>扩展中的主要逻辑代码
class TodayViewController: UIViewController, NCWidgetProviding,UITableViewDelegate,UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
var newsList = [NewsModel]()
lazy var moreBtn:UIButton = {
let btn = UIButton(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: 44))
btn.setTitle("查看更多", for:.normal)
btn.addTarget(self, action: #selector(gotoMainApp), for: .touchUpInside)
btn.backgroundColor = UIColor(red:245/255.0, green:74/255.0, blue:48/255.0, alpha: 1)
return btn
}()
func gotoMainApp(){
//跳转到主程序的代码(见图7)
self.extensionContext?.open(URL(string:"WidgetApp://action=GotoNewsListPage")!, completionHandler: { (suc:Bool) in
})
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
updateView()
}
//刷新界面
func updateView(){
if newsList.count != 0{
newsList.removeAll()
}
//通过UserDefaults从组里面获取共享数据(见图6)
let ud = UserDefaults(suiteName: "group.centaHouse");
if let nickName = ud?.array(forKey: "group.centaHouse.centaToday"){
for (_,element) in nickName.enumerated() {
if let edic = element as? [String : Any]{
let nm = NewsModel()
nm.setValuesForKeys(edic)
newsList.append(nm)
}
}
self.tableView.reloadData()
if newsList.count != 0 {
self.tableView.tableFooterView = self.moreBtn
}
//判断在不同数据下展示界面的视图大小(不处理的话,展开和折叠会出问题)
if #available(iOSApplicationExtension 10.0, *) {
if extensionContext?.widgetActiveDisplayMode == .compact{ //压缩状态
// if newsList.count != 0 {
// UIView.animate(withDuration: 0.1, animations: {
// self.preferredContentSize = CGSize(width: self.view.bounds.width, height: CGFloat(self.newsList.count*100 + 44))
// })
// }
}else{//展开状态
if newsList.count != 0 {
UIView.animate(withDuration: 0.1, animations: {
self.preferredContentSize = CGSize(width: self.view.bounds.width, height: CGFloat(self.newsList.count*100 + 44))
})
}
}
} else {
// Fallback on earlier versions
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.delegate = self
self.tableView.dataSource = self
//注册自定义cell
let nib = UINib(nibName: "NewsInfoCell", bundle: nil)
self.tableView.register(nib, forCellReuseIdentifier: "NewsInfoCell")
//设置今日扩展模式为可张开收缩模式(IOS10以后支持,进入扩展右上角显示"展开"和"折叠")
if #available(iOSApplicationExtension 10.0, *) {
self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded
} else {
// Fallback on earlier versions
};
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return newsList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//新闻列表
let cell = tableView.dequeueReusableCell(withIdentifier: "NewsInfoCell") as! NewsInfoCell
cell.news = newsList[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let url = newsList[indexPath.row].ShowNewsUrl
extensionContext?.open(URL(string:"WidgetApp://action=Goto-\(url)")!, completionHandler: { (suc:Bool) in
})
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 95;
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//监听扩展的展开和收缩状态处理视图的大小
/**
* @maxSize 界面能够显示的最小和最大尺寸(最小状态下是110)
* @activeDisplayMode: 张开和收缩状态
**/
@available(iOSApplicationExtension 10.0, *)
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
if(activeDisplayMode == .compact){
self.preferredContentSize = CGSize(width: maxSize.width, height: maxSize.height)
}else{
self.preferredContentSize = CGSize(width: maxSize.width, height: CGFloat(newsList.count*100 + 44))
}
}
//自行看官方注释
func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
// Perform any setup necessary in order to update the view.
// If an error is encountered, use NCUpdateResult.Failed
// If there's no update required, use NCUpdateResult.NoData
// If there's an update, use NCUpdateResult.NewData
if #available(iOSApplicationExtension 10.0, *) {
if extensionContext?.widgetActiveDisplayMode == .compact{
completionHandler(NCUpdateResult.newData)
}else{
completionHandler(NCUpdateResult.noData)
}
} else {
// Fallback on earlier versions
completionHandler(NCUpdateResult.newData)
}
}
}
#pragma mark app跳转 (今日通知栏)
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{ NSString* prefix = @"WidgetApp://action=";
if ([[url absoluteString] rangeOfString:prefix].location != NSNotFound) {
NSString* action = [[url absoluteString] substringFromIndex:prefix.length];
if ([action isEqualToString:@"Goto-"]) {
......
}else{
......
}
}
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
//在主程序保存需要展示的数据
func extentionUpdate(){
//group.cenXXX 组名
if let user = UserDefaults(suiteName: "group.cenXXX") {
//扩展标识符
user.set(objArray, forKey: "group.cenXXX.cenToday")
}
}
>收缩状态

>展开状态

Swift3 今日(TodayExtension)扩展图文笔记的更多相关文章
- firefox 扩展开发笔记(三):高级ui交互编程
firefox 扩展开发笔记(三):高级ui交互编程 前言 前两篇链接 1:firefox 扩展开发笔记(一):jpm 使用实践以及调试 2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟 ...
- 常见浏览器扩展开发笔记(chrome firefox 360 baidu qq sougou liebao uc opera)
浏览器扩展开发貌似时下很冷门啊,但是不少企业还是有类似的应用,360的抢票插件啊,笔者最近在做的网页翻译扩展之类的.笔者在开发的过程中,遇到了不少坑,说是坑,说白了就是各个厂商支持的API不统一导致的 ...
- Swift3.0 基础学习梳理笔记(一)
本篇是我在学完一遍基础语法知识的时候,第一遍复习,我一遍梳理一遍记录的笔记.同时分享给像我一样在学习swift 的猿友们. 本篇可能过于冗长.所以所有的参考资料都分模块的写在palyground 里, ...
- 高性能可扩展mysql 笔记(一)数据库表、索引、SQL语句设计规范
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 项目说明:该笔记的背景为电商平台项目,电商项目由于其高并发.多线程.高耗能等特性,在众多的项目类型中涉及 ...
- Centos7 编译安装 Nginx PHP Mariadb Memcached 扩展 ZendOpcache扩展 (实测 笔记 Centos 7.3 + Mariadb 10.1.20 + Nginx 1.10.2 + PHP 7.1.0 + Laravel 5.3 )
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7-x86_64-Minimal-1611.iso 安装步骤: 1.准备 1.0 查看硬 ...
- 挑灯熬夜看《Build 2015 Keynote》图文笔记
又是一年微软Build大会时间,网络上流传各种微软新品发布的消息终于也要揭晓了,一直熬夜到凌晨3点,好久没有这么兴奋了. 微软给力的很嘛! Satya nadella开始讲解 首先回顾微软的传统和技术 ...
- jQuery扩展方法笔记
一.方式列表: 1.jQuery.extend(Object); // jQuery 本身的扩展方法 2.jQuery.fn.extend(Object); // jQuery 所选对象扩展方法 二. ...
- Centos7 编译安装 Nginx PHP Mariadb Memcached 扩展 ZendOpcache扩展 (实测 笔记 Centos 7.3 + Openssl 1.1.0e + Mariadb 10.1.22 + Nginx 1.12.0 + PHP 7.1.4 + Laravel 5.4 )
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7-x86_64-Minimal-1611.iso 安装步骤: 1.准备 1.0 查看硬 ...
- Centos7 编译安装 Nginx PHP Mariadb Memcache扩展 ZendOpcache扩展 (实测 笔记 Centos 7.0 + Mariadb 10.1.9 + Nginx 1.9.9 + PHP 5.5.30)
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7-x86_64-Minimal-1503-01.iso 安装步骤: 1.准备 1.1 ...
随机推荐
- 探索未知种族之osg类生物---呼吸分解之advance
回顾 我们用了两节的内容才堪堪讲解完ViewerBase::frame()函数中调用的realize()---Viewer:: realize()函数.我们简单的总结就是Viewer:: realiz ...
- POJ3417 Network
一道LCA+树上差分 原题链接 显然每一条新增边都会导致环. 如果试着举些例子的话,很容易发现割掉非环上的边,则割掉其他任意一条新增边都可达成目标:若割掉的原有边是一个环上的边,那么只有割掉导致这个环 ...
- 数据存储(直接写入、NSUserDefaults、NSkeyedArchiver)
ios中常用文件存取的方法有: 1.直接写文件的方式,可以存储的对象有NSString.NSArray.NSDictionary.NSData.NSNumber,数据全部存放在一个属性列表文件(*.p ...
- Luogu 3119 [USACO15JAN]草鉴定Grass Cownoisseur
思路很乱,写个博客理一理. 缩点 + dp. 首先发现把一个环上的边反向是意义不大的,这样子不但不好算,而且相当于浪费了一次反向的机会.反正一个强连通分量里的点绕一遍都可以走到,所以我们缩点之后把一个 ...
- linux学习第一天 (Linux就该这么学) 找到一本不错的Linux电子书,附《Linux就该这么学》章节目录
本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...
- ZVulDrill渗透环境搭建及部分题目writeup
一 实验环境 0x01 ZvulDirll 0x02 下载地址https://github.com/redBu1l/ZVulDrill 二 配置安装 0x01 在你网站的根目录下创建一个Vu ...
- 矩阵快速幂小结-Hdu2604
矩阵快速幂可以想象为线性代数的矩阵相乘,主要是运用于高效的计算矩阵高次方. 将矩阵两两分组,若要求a^n,即知道a^(n/2)次方即可,矩阵快速幂便是运用的这个思路. 比方想求(A)^7那么(A)^6 ...
- 数组方法indexOf & lastIndexOf
indexOf() 语法:arrayObject.indexOf(searchvalue, startIndex) 功能:从数组的开头(位置0)开始向后查找. 参数:searchvalue:必需,要查 ...
- 关于进行pdf的每页广告去除、转换word等方案。
pdf转word经常使用的是 软件下载安装破解完成以后进行编辑pdf,可以导出word,效果比一般的word自带的转换效果要好. 在进行pdf的每页去除页脚或者页眉的广告时候,使用pdf的替换功能.这 ...
- 01.Java 开发简单的计算器
难度为一般,适合具有 Java 基础和 Swing 组件编程知识的用户学习一. 实验介绍1.1 实验内容本次实验利用Java开发一个可以进行简单的四则运算的图形化计算器,会使用到 Java Swing ...