Swift - Framework的制作与使用教程1(纯Swift实现)
在开发中我们常常会用到一些第三方 SDK 库,使用时只需将 framework 文件添加到项目中即可,十分方便。同样地,我们也可以创建自己的 framework 框架,用来封装一些常用的工具方法、框架类等。一来不会使源代码完全暴露在外,二来也便于代码复用。
下面演示如何制作一个自定义的图片处理框架,用来实现 UIImage 的高斯模糊与马塞克化。效果图如下:
下面演示如何制作一个自定义的图片处理框架,用来实现 UIImage 的高斯模糊与马塞克化。效果图如下:



一、framework的制作(使用纯Swift)
1,创建framework工程项目
(1)新建项目的时候选择“Cocoa Touch Framework”。

(2)项目名就叫做“HanggeSDK”。

(3)为了让制作出的 framework 在低版本的系统上也能使用,可以在“General”->“Deployment Info”里设置个较低的发布版本。(这里选择 8.0)

(4)创建一个功能实现类(ImageProcessor.swift),代码如下。
import Foundation public class ImageProcessor { //保存原始图片 var image:UIImage? lazy var context: CIContext = { return CIContext(options: nil) }() //初始化 public init(image:UIImage?) { self.image = image } //返回像素化后的图片 public func pixellated(scale:Int = 30) -> UIImage? { if image == nil { return nil } //使用像素化滤镜 let filter = CIFilter(name: "CIPixellate")! let inputImage = CIImage(image: image!) filter.setValue(inputImage, forKey: kCIInputImageKey) //设置像素版半径,值越大马赛克就越大 filter.setValue(scale, forKey: kCIInputScaleKey) let fullPixellatedImage = filter.outputImage let cgImage = context.createCGImage(fullPixellatedImage!, from: fullPixellatedImage!.extent) return UIImage(cgImage: cgImage!) } //返回高斯模糊后的图片 public func blured(radius:Int = 40) -> UIImage? { if image == nil { return nil } //使用高斯模糊滤镜 let filter = CIFilter(name: "CIGaussianBlur")! let inputImage = CIImage(image: image!) filter.setValue(inputImage, forKey: kCIInputImageKey) //设置模糊半径值(越大越模糊) filter.setValue(radius, forKey: kCIInputRadiusKey) let outputCIImage = filter.outputImage let rect = CGRect(origin: CGPoint.zero, size: image!.size) let cgImage = context.createCGImage(outputCIImage!, from: rect) return UIImage(cgImage: cgImage!) } }注意:对于那些需要暴露出来,即在框架外部也能访问使用的类、方便、变量前面需要加上关键字 Public。如果还允许 override 和继承的话,可以使用 open 关键字。(关于访问控制的详细说明,可以参考我之前的这篇文章:Swift - 访问控制(fileprivate,private,internal,public,open))
2,生成framework库文件
生成的 framework 文件是分为模拟器使用和真机使用这两种。
(1)发布编译目标选择“Generic iOS Device”后,使用快捷键 command+B 或者点击菜单 Product > Build 进行编译。这时生成的是真机调试使用的 framework。

(2)如果发布编译目标选择的是模拟器,那么编译出来的模拟器使用的 framework。

(3)编译后右键点击项目中生成的 framework,选择“Show in Finder”,即可打开 framework 所在的文件夹。



二、framework的使用
1,引入framework
(1)将生成的 HanggeSDK.framework 添加到项目中来。(注意:要根据你是使用真机调试还是模拟器调试选择对应的 framework)

(2)接着在“General”->“Embedded Binaries”中把 HanggeSDK.framework 添加进来。

2,使用样例
import UIKit import HanggeSDK class ViewController: UIViewController { @IBOutlet weak var imageView: UIImageView! //原图 var defaultImage = UIImage(named: "image1.jpg") override func viewDidLoad() { super.viewDidLoad() } //显示原图按钮点击 @IBAction func btn1Click(_ sender: AnyObject) { imageView.image = defaultImage } //显示像素化图片按钮点击 @IBAction func btn2Click(_ sender: AnyObject) { imageView.image = ImageProcessor(image: defaultImage).pixellated() } //显示高斯模糊图片按钮点击 @IBAction func btn3Click(_ sender: AnyObject) { imageView.image = ImageProcessor(image: defaultImage).blured() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }源码下载:

三、功能改进
上面样例中我们自定义库中的图像工具类(ImageProcessor)是初始化的时候传入一个 UIImage,然后调用方法返回处理后的图片。我们也可以换种方式实现,改成扩展 UIImage 类,在其之上添加两个新的处理方法。1,ImageProcessor.swift代码
import Foundation extension UIImage { //返回像素化后的图片 public func pixellated(scale:Int = 30) -> UIImage { //使用像素化滤镜 let filter = CIFilter(name: "CIPixellate")! let inputImage = CIImage(image: self) filter.setValue(inputImage, forKey: kCIInputImageKey) //设置像素版半径,值越大马赛克就越大 filter.setValue(scale, forKey: kCIInputScaleKey) let fullPixellatedImage = filter.outputImage let cgImage = CIContext().createCGImage(fullPixellatedImage!, from: fullPixellatedImage!.extent) return UIImage(cgImage: cgImage!) } //返回高斯模糊后的图片 public func blured(radius:Int = 40) -> UIImage { //使用高斯模糊滤镜 let filter = CIFilter(name: "CIGaussianBlur")! let inputImage = CIImage(image: self) filter.setValue(inputImage, forKey: kCIInputImageKey) //设置模糊半径值(越大越模糊) filter.setValue(radius, forKey: kCIInputRadiusKey) let outputCIImage = filter.outputImage let rect = CGRect(origin: CGPoint.zero, size: self.size) let cgImage = CIContext().createCGImage(outputCIImage!, from: rect) return UIImage(cgImage: cgImage!) } }
2,使用样例
import UIKit import HanggeSDK class ViewController: UIViewController { @IBOutlet weak var imageView: UIImageView! //原图 var defaultImage = UIImage(named: "image1.jpg") override func viewDidLoad() { super.viewDidLoad() } //显示原图按钮点击 @IBAction func btn1Click(_ sender: AnyObject) { imageView.image = defaultImage } //显示像素化图片按钮点击 @IBAction func btn2Click(_ sender: AnyObject) { imageView.image = defaultImage?.pixellated() } //显示高斯模糊图片按钮点击 @IBAction func btn3Click(_ sender: AnyObject) { imageView.image = defaultImage?.blured() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
四、常见问题
1、我们制作的Framework是动态库、还是静态库?
(1).framework 文件可以是动态库,也可以是静态库。创建 framework 的时候默认是 Dynamic Library(即动态库),像本文样例就是动态库。(2)如果要制作静态库,只需要编译 framework 时指定 Mach-O Type 为 Static Library

2,项目中如果使用了自制的动态库,能否上传到AppStore?
虽然本文中我们创建的 framework 是动态库,但要在工程的 General 里 Embedded Binaries 添加这个动态库才能使用。苹果把这种 Framework 称为 Embedded Framework。
也就是说我们创建的这个动态库其实也不能给其他程序使用,只能是在我们的 App Extension 和 APP 之间共用。所有这种情况对 AppStore 上架没有影响,可以正常发布。
航哥 我是果啤 我又来了.
请问你在此教程中的制作的.framework文件是静态库还是动态库?
另外现在苹果审核应用的时候如果包含自制的动态库,能否通过审核?
楼主 能写个二维码的扫描 及扫描的处理结果的案列吗 跪求啊