iOS10新特性-自定义iMessage application

1、创建工程

2、工程创建完成后的目录结构

###3、接下来开始写代码

//
//  MessagesViewController.swift
//  MessagesExtension
//
//  Created by 岑志军 on 2016/9/28.
//  Copyright © 2016年 cen. All rights reserved.
//


/*
 虽然没有严格限制,但是苹果建议的表情文件大小:
 1. Small: 100 x 100 pt @3x scale (300 x 300 pixel image)
 2. Medium: 136 x 136 pt @3x scale (378 x 378 pixel image)
 3. Large: 206 x 206 pt @3x scale (618 x 618 pixel image)

 表情包的大小:
 1. 文件中images不可以大于500kb;
 2. iamge不可以小于100 x 100 pt (300 x 300 pixels).
 3. iamge不可以大于206 x 206 pt (618 x 618 pixels).
 4. 图片格式必须是 PNG, APNG, JPEG, GIF ;


 MessageExtension文件
 1. MessagesViewController.swift : iMessage app的程序入口;
 2. MainInterface.storyboard: 可视化操作;
 3. Assets.xcassets: 图片集合;
 4. Info.plist : 配置一些扩展信息;
 */

import UIKit
import Messages

class MessagesViewController: MSMessagesAppViewController {


    // 创建一个MSSticker数组来存储我们的表情包
    var stickers = [MSSticker]()

    /*
     case small 小图模式
     case regular 中图
     case large   大图
     */
     // 要想显示图片表情,必须要初始化一个MSStickerBrowserViewController作为根视图,代码如下
    private func setupStickerBrowser() {
        let controller = MSStickerBrowserViewController(stickerSize: .small)

        addChildViewController(controller)
        view.addSubview(controller.view)

        // 设置数据源
        controller.stickerBrowserView.dataSource = self

        // 布局
        view.topAnchor.constraint(equalTo: controller.view.topAnchor).isActive = true
        view.bottomAnchor.constraint(equalTo: controller.view.bottomAnchor).isActive = true
        view.leftAnchor.constraint(equalTo: controller.view.leftAnchor).isActive = true
        view.rightAnchor.constraint(equalTo: controller.view.rightAnchor).isActive = true
    }

    // 5.加载表情包,上面设置了数据源,所以我们要加载图片(数据)
    private func loadStickers() {
        for i in 1...31 {
            let str = String(format: "%02d", i)
            print(str)
            if let url = Bundle.main.url(forResource: str, withExtension: "gif") {

                do {
                    let sticker = try MSSticker(contentsOfFileURL: url, localizedDescription: "")
                    stickers.append(sticker)
                } catch {
                    print(error)
                }

            }

        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        // 初始化本地表情包
        loadStickers()
        // 创建本地表情包控制器
        setupStickerBrowser()
    }
}

// 实现MSStickerBrowserViewController数据源方法
extension MessagesViewController: MSStickerBrowserViewDataSource{
    // 一共有多少个
    func numberOfStickers(in stickerBrowserView: MSStickerBrowserView) -> Int {
        return stickers.count
    }

    // 每一个要显示什么
    func stickerBrowserView(_ stickerBrowserView: MSStickerBrowserView, stickerAt index: Int) -> MSSticker {
        return stickers[index]
    }
}

最后大功告成:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏HT

基于 HTML5 WebGL 的 3D 网络拓扑图

  在数据量很大的2D 场景下,要找到具体的模型比较困难,并且只能显示出模型的的某一部分,显示也不够直观,这种时候能快速搭建出 3D 场景就有很大需求了。但是搭...

35550
来自专栏菩提树下的杨过

Flash/Flex学习笔记(15):FMS 3.5之远程共享对象(Remote Shared Object)

FMS中的“远程共享对象”可以让多个Client端的flash应用共享同一个全局对象,并且当客户端中的任何一个改变该对象时,系统会自动将该对象回发到FMS服务器...

22380
来自专栏性能与架构

将 Redis 作为图数据库

1. 简介 Redis 在 4.0 中正式支持了Module模块系统,使其可以进行丰富的扩展 图数据库的应用越来越广泛,RedisGraph 就是一个 Redi...

47560
来自专栏流媒体人生

mpg文件切片之后,不能播放问题分析

对于大部分mpg文件切片都能正常播放,而少部分mpg切片之后只有第一个切片能播放,后续的切片视频播放均失败,只能播放视频。

10520
来自专栏写写代码吃吃瓜

OpenGL初学--环境配置和视景体初步接触

20250
来自专栏hightopo

基于 HTML5 WebGL 的 3D 网络拓扑图

20730
来自专栏Flutter入门

Android OpenGL ES(六) - 将输入源换成视频

上文中,我们是将相机提供的预览画面输入到Surface当中,然后进行滤镜处理和录制。 那我们可以切换输入源为视频吗?

65750
来自专栏前端杂货铺

不要使用浏览器嗅探,尽量使用特性检测和特性模拟

平淡的描述   在js中,能使用特征监测就尽量不要使用浏览器嗅探。嗅探浏览器目的是判断可否使用这个对象或者API,但是抛开浏览器 的各个版本的userAgent...

31350
来自专栏慎独

Unity自动寻路入门指南

18420
来自专栏全沾开发(huā)

项目结构——JavaScript版本的2048实现[0]

项目结构——JavaScript版本的2048实现[0] 最近在看一本书《HTML5 Canvas开发详解》 看到了一定程度,打算找...

39660

扫码关注云+社区

领取腾讯云代金券