控件的封装,总结过往收藏的技术文章

最近项目不算紧,于是就学了学 Swift ,看了一大神写的项目

最近开始学习Swift,想将公司从OC转移到这上面来,毕竟Swift发展势头迅猛。于是想将公司原有经常用的UI及工具控件重新写一遍,有利于自己对Swift的了解!

swift 轮播图无限滚动 控件的封装

图片 1

先分享一些学习资料:
  • 学习网站:

    • 苹果官方为开发者提供的 Swift 学习资源:

    • 官方的 API Design:

  • 学习书籍:

    • TheSwiftProgrammingLanguage: 链接: 密码:dqho

    • The Swift Programming Language 中文版: 链接: 密码:xay1

  • 其它学习资料

练习的 demo 地址:

  • 主要包括以下功能:
    • 多页面滑动视图
    • 图片轮播
    • 导航栏渐变
    • 瀑布流练习
    • UIScrollView 练习
    • 照相功能,更换头像
    • 二维码扫描及识别
    • 随机图片验证码封装
    • 圆形输入框封装
    • 第三方库 SnapKit 用法
    • ............

练习 demo 的简单介绍,前方高能预警,大量图片请注意手机流量!

图片 2多页面滑动视图

  • 核心代码
 // MARK: 点击了标签栏 func titlesClick(button: UIButton) { selectedButton!.isEnabled = true selectedButton!.setTitleColor(UIColor.gray, for: .normal) button.isEnabled = false selectedButton = button selectedButton?.setTitleColor(UIColor.red, for: .normal) var offset = contentView!.contentOffset offset.x = CGFloat(button.tag) * (contentView?.frame.size.width)! contentView!.setContentOffset(offset, animated: true) } // MARK: 点击了右边搜索框 func rightBarButtonClick() { navigationController?.pushViewController(NNSearchController(), animated: true) } // MARK: 点击了箭头 func arrowButtonClick(button: UIButton) { UIView.animate(withDuration: 0.25) { button.imageView?.transform = button.imageView!.transform.rotated(by: CGFloat(Double.pi)) } } // MARK: - UIScrollViewDelegate 代理 // MARK: scrollViewDidEndScrollingAnimation func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { let index = Int(scrollView.contentOffset.x / scrollView.frame.size.width) // 取出子控制器 let vc = childViewControllers[index] vc.view.frame.origin.x = scrollView.contentOffset.x vc.view.frame.origin.y = 0 // 设置控制器的 view 的 height 值为整个屏幕的高度 vc.view.frame.size.height = scrollView.frame.size.height scrollView.addSubview } // MARK: scrollViewDidEndDecelerating func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { scrollViewDidEndScrollingAnimation(scrollView) // 当前索引 let index = Int(scrollView.contentOffset.x / scrollView.frame.size.width) // 点击 Button let button = titlesView.subviews[index] as! UIButton titlesClick(button: button) }

图片 3图片轮播

  • 核心代码:

轮播图的封装

 // MARK: - 懒加载轮播视图 private lazy var shufflingFigureView : NNShufflingFigureView = { let frame = CGRect(x: 0, y: 0, width: NNScreenWidth, height: 180) let imageView = ["shuffling1", "shuffling2", "shuffling3", "shuffling4"] let shufflingFigureView = NNShufflingFigureView(frame: frame, images: imageView as NSArray, autoPlay: true, delay: 3, isFromNet: false) shufflingFigureView.delegate = self return shufflingFigureView }()

通过代理处理图片的点击事件

// MARK: - 轮播代理方法,处理轮播图的点击事件extension NNItemTableViewController: NNShufflingFigureViewDelegate { func addShufflingFigureView(addShufflingFigureView: NNShufflingFigureView, iconClick index: NSInteger) { print }}

图片 4导航栏渐变

  • 核心代码

页面滚动时调用

// MARK: - UIScrollViewDelegate 滚动页面时调用extension NNItemTableViewController { override func scrollViewDidScroll(_ scrollView: UIScrollView) { if type == tableViewType.haveHeader { return } currentPostion = scrollView.contentOffset.y if currentPostion > 0 { if currentPostion - lastPosition >= 0 { if topBool { topBool = false bottomBool = true stopPosition = currentPostion   64 } lastPosition = currentPostion navigationController?.navigationBar.alpha = 1 - currentPostion / 500 } else { if bottomBool { bottomBool = false topBool = true stopPosition = currentPostion   64 } lastPosition = currentPostion navigationController?.navigationBar.alpha = (stopPosition - currentPostion) / 200 } } }}

图片 5瀑布流练习

  • 核心代码

基础设置

 // 布局 let layout = NNItemCollectionViewFlowLayout() // 创建collectionView let collectionView = UICollectionView.init(frame: view.bounds, collectionViewLayout: layout) view.addSubview(collectionView) collectionView.dataSource = self collectionView.delegate = self collectionView.backgroundColor = UIColor.white collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: NNItemCollectionViewControllerID)

自定义 UICollectionViewFlowLayout

 // MARK: - 更新布局 override func prepare() { super.prepare() // 清除所有的布局属性 attrsArray.removeAll() columnHeightsAry.removeAll() for _ in 0 ..< columnCountDefault { columnHeightsAry.append(edgeInsetsDefault.top) } let sections : Int = (collectionView?.numberOfSections)! for num in 0 ..< sections { let count : Int = (collectionView?.numberOfItems(inSection: num))! for i in 0 ..< count { let indexpath : NSIndexPath = NSIndexPath.init(item: i, section: num) let attrs = layoutAttributesForItem(at: indexpath as IndexPath)! attrsArray.append } } } // MARK: - cell 对应的布局属性 override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { let attrs = UICollectionViewLayoutAttributes.init(forCellWith: indexPath) let collectionWidth = collectionView?.frame.size.width // 获得所有 item 的宽度 let itemW = (collectionWidth! - edgeInsetsDefault.left - edgeInsetsDefault.right - CGFloat(columnCountDefault-1) * columnMargin) / CGFloat(columnCountDefault) let itemH = 50   arc4random_uniform // 找出高度最短那一列 var dextColum : Int = 0 var minH = columnHeightsAry[0] for i in 1 ..< columnCountDefault{ // 取出第 i 列的高度 let columnH = columnHeightsAry[i] if minH > columnH { minH = columnH dextColum = i } } let x = edgeInsetsDefault.left   CGFloat(dextColum) * (itemW   columnMargin) var y = minH if y != edgeInsetsDefault.top{ y = y   itemMargin } attrs.frame = CGRect(x: x, y: y, width: itemW, height: CGFloat // 更新最短那列高度 columnHeightsAry[dextColum] = attrs.frame.maxY return attrs }

图片 6UIScrollView 练习

  • 核心代码
 // MARK: - 放大缩小 // MARK: 放大 func amplificationBtnClick() { var zoomScale = scrollView.zoomScale // 当前缩放 zoomScale  = 0.1 if zoomScale >= scrollView.maximumZoomScale { return } self.scrollView.setZoomScale(zoomScale, animated: true) } // MARK: 缩小 func narrowDownBtnClick() { var zoomScale = scrollView.zoomScale // 当前缩放 zoomScale -= 0.1 if zoomScale <= scrollView.minimumZoomScale { return } self.scrollView.setZoomScale(zoomScale, animated: true) }// MARK: - NNItemBtnViewDelegate 上下左右点击代理extension NNItemScrollView { // MARK: 向左 func leftBtnClickDelegate() { var point = self.scrollView.contentOffset point.x  = 100 point.x = point.x >= self.scrollView.contentSize.width ? 0 : point.x scrollView.setContentOffset(point, animated: true) } // MARK: 向右 func rightBtnClickDelegate() { var point = self.scrollView.contentOffset point.x -= 100 point.x = point.x <= -NNScreenWidth ? 0 : point.x scrollView.setContentOffset(point, animated: true) } // MARK: 向上 func topBtnClickDelegate() { var point = self.scrollView.contentOffset point.y  = 50 point.y = point.y >= self.scrollView.contentSize.height ? 0 : point.y scrollView.setContentOffset(point, animated: true) } // MARK: 向下 func bottomBtnClickDelegate() { var point = self.scrollView.contentOffset point.y -= 50 point.y = point.y <= -NNScreenHeight ? 0 : point.y scrollView.setContentOffset(point, animated: true) }}

图片 7照相功能,更换头像

  • 核心代码
// MARK: - 点击头像按钮,更换头像 func changePicture() { let alertcontroller = UIAlertController(title: "请选择相片", message: nil, preferredStyle: .actionSheet) let alertaction = UIAlertAction(title: "从相册选取", style: .destructive) {  in let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = .photoLibrary imagePicker.allowsEditing = true self.present(imagePicker, animated: true, completion: nil) } let alertaction2 = UIAlertAction(title: "拍照", style: .destructive) {  in if (!UIImagePickerController.isSourceTypeAvailable { print("设备不支持相机") return } let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = .camera imagePicker.allowsEditing = true self.present(imagePicker, animated: true, completion: nil) } let alertAction3 = UIAlertAction(title: "取消", style: .cancel) {  in print } alertcontroller.addAction(alertaction) alertcontroller.addAction(alertaction2) alertcontroller.addAction(alertAction3) present(alertcontroller, animated: true, completion: nil) } // MARK: - UIImagePickerControllerDelegate func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { let image = info[UIImagePickerControllerOriginalImage] as! UIImage imageView.image = image self.dismiss(animated: true, completion: nil) }

图片 8二维码扫描及识别

  • 核心代码
// MARK: - 扫描设备设置 func setupScanSession() { do { // 设置捕捉设备 let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) // 设置设备输入输出 let input = try AVCaptureDeviceInput(device: device) let output = AVCaptureMetadataOutput() output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) // 设置会话 let scanSession = AVCaptureSession() scanSession.canSetSessionPreset(AVCaptureSessionPresetHigh) if scanSession.canAddInput { scanSession.addInput } if scanSession.canAddOutput { scanSession.addOutput } // 设置扫描类型 output.metadataObjectTypes = [ AVMetadataObjectTypeQRCode, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeCode39Mod43Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode93Code] // 预览图层 let scanPreviewLayer = AVCaptureVideoPreviewLayer(session:scanSession) scanPreviewLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill scanPreviewLayer!.frame = view.layer.bounds view.layer.insertSublayer(scanPreviewLayer!, at: 0) // 设置扫描区域 NotificationCenter.default.addObserver(forName: NSNotification.Name.AVCaptureInputPortFormatDescriptionDidChange, object: nil, queue: nil, using: {  in output.rectOfInterest = (scanPreviewLayer?.metadataOutputRectOfInterest(for:self.scanImageView.frame))! }) // 保存会话 self.scanSession = scanSession } catch { // 摄像头不可用 return } }

扫描完成后调用

// MARK: - AVCaptureMetadataOutputObjectsDelegate 扫描捕捉完成extension NNScanCodeController : AVCaptureMetadataOutputObjectsDelegate { func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { // 停止扫描 scanLine.layer.removeAllAnimations() scanSession!.stopRunning() // 扫完完成 if metadataObjects.count > 0 { if let resultObj = metadataObjects.first as? AVMetadataMachineReadableCodeObject { print(resultObj.stringValue) scanResult.text = "扫描结果:"   resultObj.stringValue } } }}

识别验证码,从相册中选择

// MARK: - UIImagePickerControllerDelegate, UINavigationControllerDelegateextension NNScanCodeController : UIImagePickerControllerDelegate , UINavigationControllerDelegate { func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { // 判断是否能取到图片 guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else { return } // 转成ciimage guard let ciimage = CIImage(image: image) else { return } // 从选中的图片中读取二维码 // 创建探测器 let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy : CIDetectorAccuracyLow]) let resoult = (detector?.features(in: ciimage))! scanResult.text = "无法识别" for result in resoult { guard (result as! CIQRCodeFeature).messageString != nil else { return } scanResult.text = "扫描结果:"   (result as! CIQRCodeFeature).messageString! } picker.dismiss(animated: true, completion: nil) }}

图片 9随机图片验证码封装

  • 核心代码
 // MARK: - 绘制图形验证码 override func draw(_ rect: CGRect) { if charString.isEmpty { return; } let textString:String = charString let charSize = textString.substring(to: textString.startIndex).size(attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 14)]) let width = rect.size.width / CGFloat(charCount) - charSize.width - 15; let hight = rect.size.height - charSize.height; var point: CGPoint var pointX: CGFloat var pointY: CGFloat for i in 0..<textString.characters.count { let char = CGFloat pointX = (arc4random() % UInt32(Float   rect.size.width / (textString.characters.count) * char pointY = (arc4random() % UInt32(Float point = CGPoint(x: pointX, y: pointY) let charStr = textString[textString.index(textString.startIndex, offsetBy:i)] let string = String string.draw(at: point,withAttributes:([NSFontAttributeName : UIFont.systemFont(ofSize: 14)])) } drawLine } // MARK: - 绘制干扰线 func drawLine(_ rect: CGRect) { let context = UIGraphicsGetCurrentContext() context!.setLineWidth var pointX = 0.0 var pointY = 0.0 for _ in 0..<lineCount { context!.setStrokeColor(randomColor().cgColor) pointX = Double(arc4random() % UInt32(Float(rect.size.width))) pointY = Double(arc4random() % UInt32(Float(rect.size.height))) context?.move(to: CGPoint(x: pointX, y: pointY)) pointX = Double(CGFloat(arc4random() % UInt32(Float(rect.size.width)))) pointY = Double(CGFloat(arc4random() % UInt32(Float(rect.size.height)))) context?.addLine(to: CGPoint(x: pointX, y: pointY)) context!.strokePath() } }

OC版本:iOS开发 - 随机图片验证码封装-

图片 10圆形输入框封装

  • 核心代码
 // MARK: - 监听文本输入 核心操作 func textFieldDidChange(_ textField: UITextField) { let i = textField.text?.characters.count if i! > labelCount { return } if i == 0 { ((labelArr.object as! UILabel).text = "" ((labelArr.object as! UILabel).layer.borderColor = defaultColor.cgColor } else { ((labelArr.object(at:  as! UILabel).text = (textField.text! as NSString).substring(with: NSMakeRange(i! - 1, 1)) ((labelArr.object(at:  as! UILabel).layer.borderColor = changedColor.cgColor ((labelArr.object(at:  as! UILabel).textColor = changedColor if labelCount > i! { ((labelArr.object) as! UILabel).text = "" ((labelArr.object) as! UILabel).layer.borderColor = defaultColor.cgColor } } } // MARK: - setupUI func setupUI() { setupTextField() var labelX = CGFloat() let labelY : CGFloat = 0.0 let labelWidth = self.width / CGFloat(labelCount) let sideLength = labelWidth < self.height ? labelWidth : self.height for i in 0..<labelCount { if i == 0 { labelX = 0 } else { labelX = CGFloat * (sideLength   labelDistance) } let label = UILabel(frame: CGRect(x: labelX, y: labelY, width: sideLength, height: sideLength)) self.addSubview label.textAlignment = NSTextAlignment.center label.layer.borderColor = UIColor.black.cgColor label.layer.borderWidth = 1.0 label.layer.cornerRadius = sideLength / 2.0 labelArr.add } } // MARK: - UITextFieldDelegate // MARK: 监听输入框 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // 允许删除 if (string.characters.count == 0) { return true } else if (textField.text?.characters.count)! >= labelCount { return false } else { return true } } // MARK: 回车收起键盘 func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return false }

OC版本:iOS开发 - 圆形验证码输入框的封装-

图片 11第三方库 SnapKit 用法

  • 示例代码
 func addRedView() { redView.backgroundColor = UIColor.red view.addSubview // redView 距离父视图四条边的距离都是 50 redView.snp.makeConstraints {  in make.edges.equalTo.inset } } func addBlueView() { blueView.backgroundColor = UIColor.blue view.addSubview // blueView 左边距离父视图为 0;上边距离父视图为 0;size 是 blueView.snp.makeConstraints {  in make.left.equalTo make.top.equalTo make.size.equalTo(CGSize(width: 50, height: 50)) } } func addBlackView() { blackView.backgroundColor = UIColor.black view.addSubview(blackView) // blackView 左边和 redView 的右边距离为 0;大小与 blueView 相同;且与 blueView 上对齐 blackView.snp.makeConstraints {  in make.left.equalTo(redView.snp.right) make.size.equalTo make.top.equalTo } } func addCyanView() { cyanView.backgroundColor = UIColor.cyan view.addSubview // cyanView 与 blueView 左对齐;cyanView 的顶部距离 redView 的底部 10;cyanView 的高是40;cyanView 与 blueView 等宽 cyanView.snp.makeConstraints {  in make.trailing.equalTo make.top.equalTo(redView.snp.bottom).offset make.height.equalTo make.width.equalTo } } func addYellowView() { yellowView.backgroundColor = UIColor.yellow view.addSubview(yellowView) // yellowView 顶部与 redView 的底部对齐;yellowView 与 blackView 左对齐;yellowView 与 blueView 相同大小 yellowView.snp.makeConstraints {  in make.top.equalTo(redView.snp.bottom) make.trailing.equalTo(blackView) make.size.equalTo } } func addWhiteView() { whiteView.backgroundColor = UIColor.white redView.addSubview(whiteView) // whiteView 的父视图是 redView,距离父视图四条边的距离分别是(30,10,30,10) whiteView.snp.makeConstraints {  in // 第一种方式 make.edges.equalTo.inset(UIEdgeInsets(top: 30, left: 10, bottom: 30, right: 10)) // 第二种方式// make.top.equalTo.offset// make.left.equalTo.offset// make.bottom.equalTo.offset// make.right.equalTo.offset // 第三种方式// make.top.left.bottom.right.equalTo.inset(UIEdgeInsets(top: 30, left: 10, bottom: 30, right: 10)) } }

图片 12demo.gif

图片 13

短腿的反击

详情代码,请移步到 中查看,如有疑问或有建议的地方,欢迎讨论。另外代码中有一个名为 guide.swift 的类,简单标出了代码的结构,更方便阅读。

使用代码

轮播图动画1.gif

图片 14

会持续更新......
 let imgArray = [ "http://www.netbian.com/d/file/20150519/f2897426d8747f2704f3d1e4c2e33fc2.jpg", "http://www.netbian.com/d/file/20130502/701d50ab1c8ca5b5a7515b0098b7c3f3.jpg", NSURL(string: "http://www.netbian.com/d/file/20110418/48d30d13ae088fd80fde8b4f6f4e73f9.jpg")!, UIImage(named: "carouse_1")!, UIImage(named: "carouse_2")!, UIImage(named: "carouse_3")! ] self.silenceCarouselView = SilenceCarouselView( frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.size.width, 200), imageArray: imgArray, silenceCarouselViewTapBlock: { (carouselView, index) in print;

这篇文章主要记录自己是怎么一步一步封装一个 轮播图, 记录了整个过程和遇到的一些问题和解决办法.

小摩丝.jpg

此轮播效果实现的结构如下:

我是在 oc 项目中 用swift 写了一个轮播图
如何在 oc 项目中
使用 swift 文件 可以看我这篇文章 OC 中 使用 swfit 代码.

综合类型

  • 综合类型指的是学习资源,博客,demo地址,个人总结,软文等

1.iOS学习资源汇总(开源项目、第三方库、技术博客等等)
2.【工具】ios博客订阅及rss阅读器介绍
3.27个iOS开源库,让你的开发坐上火箭吧
4.iOS项目开发必备总结的一些项目开发必备知识和关键点
5.hexo创建个人博客(附加插入音乐、分享、评论、标签页、搜索)
6.iOS之常用知识点汇总
7.让iOS开发变得更有效率-分类、工具类
8.(iOS)希望这本《iOS自定义控件剖析》书籍能够让学习中的你有所收获
9.重读 Effective Objective-C 2.0 小记
10.iOS10个实用小技巧(总有你不知道的和你会用到的)
11.iOS第三方框架集合
12.iOS被开发者遗忘在角落的NSException-其实它很强大
13.iOS 7 StatusBar介绍
14.iOS超全开源框架、项目和学习资料汇总(4)数据库、缓存处理、图像浏览、摄像照相视频音频篇
15.iOS超全开源框架、项目和学习资料汇总(1)UI篇
16.iOS超全开源框架、项目和学习资料汇总(2)动画篇
17.iOS超全开源框架、项目和学习资料汇总(3)网络和Model篇
18.成为iOS顶尖高手,你必须来这里(这里有最好的开源项目和文章)
19.iOS 高级工程师是怎么进阶的(补充版20 点)
20.通过分析微信app,学学如何使用@2x,@3x图片
21.干货!老司机工作中用到的自定义控件,总有一个适合你的(一)(tableView的透明度渐变效果、自定义的开关控件、一个仿网易的Segment)
22.干货!老司机工作中用到的自定义控件,总有一个适合你的(二)(一个强大的UITextView分类,让系统TextView自带placeholder属性、自动高度、支持输入图片三大功能、一句话实现一个可以自动计算年龄和星座的DatePicker、一句话实现一个带有文字闪动渐变的标签)
23.研发直播APP的收获-iOS
24.iOS 实用小功能
25.iOS- 收藏 (专题文章分类)
26.11大类,123个iOS demo
27.iOS 开源项目集合
28.iOS开发—常用的iOS第三方资源(持续更新)
29.iOS 无规律总结[UI基础篇]
30.iOS开发常用三方库、插件、知名博客等等

图片 15轮播结构.png

  • iOS 轮播图的实现逻辑(四种方法)

使用demo

  • 实用性demo,外加高仿

1.iOS之选择汽车品牌小demo
2.个人demo仿斗鱼、喵播、自定义转场、下订单界面、瀑布流、WMPlayer、微博、、、
3.(IM,直播,跑马灯,瀑布流,手势解锁...)开发中实用的组件(持续更新......)
4.仿简书导航栏图片随着UIScrollView的滚动放大缩小
5.iOS 支持多任务、断点下载(图片、音频、视频)
6.一劳永逸,iOS引导蒙版封装流程
7.iOS-项目中的图片上传
8.iOS开发仿电商类APP首页
9.iOS开发仿【喵播】之快速集成tableView头部缩放视图 视图为模糊效果
10.仿半塘下拉刷新: 下拉文字转贝塞尔曲线效果 和 下拉刷新基本原理
11.(仿美团)城市选择器 自动定位 字母索引
12.仿『即刻』首页滚动效果
13.[iOS 交互]浅析饿了么/手淘全屏下拉进入活动会场
14.iOS-哔哩哔哩动画_开机动画
15.高仿微博图片浏览器
16.图片浏览器
17.无数据、无网络界面【更多的是开源思想】
18.iOS那些“垃圾”的轮播
19.iOS 双波浪动画-类似淘宝个人信息状态栏,京东金融等
20.关于iOS动态启动图的一点思考
21.iOS UITableView中的下拉列表
22.iOS开发——做购物车,看我就够了
23.一行代码集成表空白视图
24.一劳永逸,iOS多选弹窗封装流程
25.iOS 搜索页面—— 热门搜索和历史记录

UIView两个子View:UIScrollView、UIPageControlUIScrollView两个子UIImageView

这篇文章给了实现轮播图的四种思路, 嗯, 我选择了使用 collectionView 这个思路

AVFoundaion、定义相机、美颜

  • AVfoundaion多媒体相关、定义相机、美颜等

1.30分钟搞定iOS自定义相机
2.写一个iOS中可以方便实现自定义相机(QQ,微信录小视频...)的CameraView
3.iOS开发实用功能-自定义相机结合画板
4.还在用UIImagePickerController? ——iOS相册选择器
5.基于GPUImage的实时美颜滤镜
6.GPUImage详细解析(七)文字水印和动态图像水印
7.iOS开发-AVFoundation 自定义视频录制
8.iOS开发--AVFoundation自定义相机
9.基于GPUImage的自定义相机2.0版
10.GPUImage 实现自定义相机
11.iOS-AVFoundation-AudioRecorder-RecorderAndPlay-语音录制和播放
12.iOS视频处理之增加动画挂件和Image边框
13.听说你想找一个可以自定义的相机demo,最好还可以自定义裁剪
14.iOS视频处理之增加Title
15.iOS视频处理之增加边框
16.iOS Demo合集:照片墙、图像对比、图像的放大镜、图像裁剪、浏览商品图片、滑动时Cell播放视频
17.iOS开发直播app(GPUImage原理
18.iOS开发直播app-美颜滤镜GPUImageBeautifyFilter
19.播放系统音的方法和遇到的坑
20.iOS仿微信录音控件Demo
21.iOS中自定义相册(下)
22.iOS 视频合成 (图片和视频的合成 ,视频跟音频的合成)
23.IOS 录制视频
24.GPUImageVideoCamera帧时间计算与GPU Report中Fram Time不一致的推测
25.程序员取悦女票的正确姿势---Tip1(iOS美容篇)
26.iOS-自定义照片选择器 裁剪图片
27.GPUImage详细解析(十一)美颜 人脸识别
28.iOS语音提醒开发总结

UIScrollView的宽度:widthUIScrollView的高度:height两个UIImageView: currentImgView、otherImgView,并且他们的宽高与UIScrollView的宽高相等

下面的思路和代码都是来自于 使用 collectionView 实现 无限轮播图

  • 使用 collectionView 实现轮播图

最初的思路, 创建collectionView 有一个section , section中有 n 个items.
这里面有个问题, 就是当滑动到最后一个items 时 怎么回到第一个items 实现无限滑动?

换一种思路, 设置 3 个 section
默认显示中间那一组(第2组)的 section
当滑动到 第2组的最后一个 items 时, 再次滚动显示第3组的第一个items
当在第3组的第一个items 继续往后滚动时, 显示第2组的第2个item , 然后保持在第2组中往后滚动, 直到最后一个items 重复上面的步骤.
无限滚动代码实现.

//MARK: - selector event 下一页
    @objc private func nextPage(){
        //print("下一页")
        // 获取当前 inexPath
        let currentIndexPath = self.collectionView?.indexPathsForVisibleItems.last!
        // 获取中间组 indexPath (所有的图片都是最中间的那一组 为主)
        let middleIndexPath = IndexPath(item: (currentIndexPath?.item)!, section: 1)

        // 直接显示中间那一组
        collectionView?.scrollToItem(at: middleIndexPath, at: .left, animated: false)

        // 要动画挪动的下一个 图片
        var nextItem = middleIndexPath.item   1
        var nextSection = middleIndexPath.section
        if nextItem==imageUrls?.count{
            // 当最后一张图片时, 要回到第一个图片显示. 这里借用了第二组的第一个 item
            nextItem = 0
            nextSection  = 1
        }
        let nextIndexPath = IndexPath(item: nextItem, section: nextSection)
        //pageControl?.currentPage = nextItem
        collectionView?.scrollToItem(at: nextIndexPath, at: .left, animated: true)
    }
  • 方法collectionView?.scrollToItem(at: middleIndexPath, at: .left, animated: false) 的理解
// 这句代码, 要理解 animated 参数, 
// 当 animated=true 时候, 有动画效果.
// 当 animated=false , 没有动画效果, 直接就出现 要挪动到的 idnexPath
collectionView?.scrollToItem(at: middleIndexPath, at: .left, animated: false)
  • 关于手动拖动滚动, 有两种方式实现效果.
      1. 使用代理 scrollViewWillEndDragging 这里要做大量的判断才行
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

        let currentIndexPath = collectionView?.indexPathsForVisibleItems.last

        // 防止 手动滑动图片到 第一个或者最后一个 不循环滑动的问题

        // 向左滑
        if velocity.x > 0 {
            if currentIndexPath?.section == (maxSections - 1) {
                let nextIndexPath = IndexPath(item: (currentIndexPath?.item)!, section: 1)
                collectionView?.scrollToItem(at: nextIndexPath, at: .left, animated: false)
            }
        }else{

        // 向右滑
            if currentIndexPath!.section == 0 {
                let nextIndexPath = IndexPath(item: currentIndexPath!.item, section: 1)
                collectionView?.scrollToItem(at: nextIndexPath, at: .right, animated: false)
            }
        }
    }

 - 2. 使用代理 `scrollViewDidEndDecelerating` 这里只有简单的一句代码就可以实现

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        collectionView?.scrollToItem(at: IndexPath(item: (pageControl?.currentPage)!, section: 1), at: .left, animated: false)
    }
  • scrollViewDidEndDeceleratingscrollViewDidEndScrollingAnimation 的区别
    • scrollViewDidEndScrollingAnimation和scrollViewDidEndDecelerating的区别
      scrollViewDidEndDecelerating: 当手动拖动 scrollView 动画停止时, 会触发
      scrollViewDidEndScrollingAnimation: 使用代码实现scrollView 滚动动画停止时 , 会触发
  • collectionView的内容向下偏移了一段位移

百度, 得知, 要在控制器中添加这句代码 self.automaticallyAdjustsScrollViewInsets = NO;
automaticallyAdjustsScrollViewInsets 默认是 YES 这时候控制器会自动把 [scrollView , tableview, collectionView] 中的内容向自适应挪动一段距离, 这样可以防止遮住 stateBar navigationBar toolBar SearchBar等. 一般我们都是自己管理collectionView的显示范围, 不需要自动调整

AVPlayer封装

  • AVPlayer相关知识点

1.AVAudioPlayer本地音乐播放、后台播放、歌词同步,都告诉你
2.AVPlayer 本地、网络视频播放相关
3.iOS播放远程网络音乐的核心技术点
4.iOS-视频播放器的简单封装
5.iOS通过AVPlayer打造自己的视频播放器
6.基于 AVPlayer 自定义播放器

图片 16scrollview的ContentSzie.png

关于 swift 三方库的使用

  • OC项目 中 在swift 文件中 使用 swift 三方库
    直接 import 三方库
    就可以使用

  • OC 项目中 在 oc 文件中 使用 swift 三方库
    要在 oc 项目中 引入文件 三方库名-Swift.h 文件, 这个文件是系统自动生成的.
    这样就可以在 OC 文件中调用 swift 三方库的方法了, 系统会自动把swift 方法映射为 oc 方法.
    不过, 某些swift 特性不能转化为 oc , 故 很多swift 方法不会映射为 oc 方法, 所以有一部分swfit方法 oc 文件不能使用
    更多详细介绍看这篇文章 Swift和Objective-C混编的注意啦

    • [新手小记]记录Objective-C调用Swift第三方库

图片处理相关

  • 图片处理、绘制

1.iOS CGImageCreateWithImageInRect将若干规则小图片组成的大图片剪切
2.iOS之使用CoreImage进行人脸识别
3.UIImage图片处理,旋转、截取、平铺、缩放等操作,持续更新中
4.iOS 怎么为GIF图片添加水印
5.IOS图片相似度检测(opencv)
6.OpenCV学习开发笔记一(iOS9)
7.仿美图图片旋转裁剪封装

// 设置内容宽度为3倍的尺寸self.scrollView?.contentSize = CGSizeMake(self.bounds.size.width * 3, self.bounds.size.height)

Snapkit

swift 中使用自动布局库 Snapkit (跟oc 中的 masonry 用法相似)
参考文章 Swift编程(六):Snapkit的启示录

使用过程:
pod 集成Snapkit : pod 'SnapKit', '~> 3.2.0'

在oc 自动布局库 masonry 中, 子控件必须全部都加入到父视图之后, 才对每一个子视图进行布局
在 swift 'Snapkit' 中好像不需要, 加入父视图后, 可以立即进行布局
```
pageControl!.snp.makeConstraints { (make) in
        make.left.right.equalTo(0)
        make.bottom.equalTo(-20)
        make.height.equalTo(30)
    }
```

三方库的使用

  • 三方库的介绍和经典使用,讲解分析等

1.iOS三方库IQKeyBoardManager的集成及使用
2.使用UITableView FDTemplateLayoutCell高度缓存以及实现文本展开全文和收起功能
3.IM 即时通讯技术在多应用场景下的技术实现,以及性能调优( iOS 视角)(附 PPT 与 2 个半小时视频
5.iOS 使用Charts框架 折线,柱状,K线,饼状,雷达全攻略
6.iOS - Masonry 使用中的一些整理
7.ReactiveCocoa添加cocoapods 配置图文教程及坑总结
8.iOS 走进Facebook POP的世界
9.基于GPUImage的实时美颜滤镜
6.GPUImage详细解析(七)文字水印和动态图像水印
7.iOS AFNetworking上传多张照片简单封装
8.GPUImage之裁剪篇
9.高仿QQ、微信效果的图片浏览器(支持原图和缩略图、多种手势、CocoaPods
10.AFNetworking到底做了什么?
11.Masonry解析
12.D3View
13.iOS 阿里云多图上传
14.WebRTC入门:iOS工程

图片 17两个UIImageView的位置.png

Kingfisher

开始添加网络图片
轮播图 , 有个本地默认图片, 和网络加载后的图片
当网络加载还没有完成时, 显示本地图片, 当网络加载结束后, 用网络图片代替本地图片

swfit 中 网络图片框架 Kingfisher 竟然是喵神的作品,
开始学习 Kingfisher 的用法, 先简单的接触, 会加载网络图片就好, 等手头的项目结束后再去仔细读源码

  • Kingfisher 3.x 学习(一)

学习步骤.

  • pod 集成 Kingfisher : pod 'Kingfisher', '~> 3.10.4'

网络图片素材:
http://61.144.248.2:8085/carManager/html/ueditor/jsp/upload/info/2017/08/11/pic_1502416479862.jpg
http://61.144.248.2:8085/carManager/html/ueditor/jsp/upload/info/2017/08/10/pic_1502331229612.jpg
http://61.144.248.2:8085/carManager/html/ueditor/jsp/upload/info/2017/08/07/pic_1502085582890.jpg
http://61.144.248.2:8085/carManager/html/ueditor/jsp/upload/info/2017/08/07/pic_1502085108072.jpg
http://61.144.248.2:8085/carManager/html/ueditor/jsp/upload/info/2017/08/04/pic_1501819284994.jpg
http://61.144.248.2:8085/carManager/html/ueditor/jsp/upload/info/2017/07/31/pic_1501466845618.jpg

这里只需要用到 下面的方法就好

cell.bannerImage?.kf.setImage(with: <#T##Resource?#>, placeholder: <#T##Image?#>, options: <#T##KingfisherOptionsInfo?#>, progressBlock: <#T##DownloadProgressBlock?##DownloadProgressBlock?##(Int64, Int64) -> ()#>, completionHandler: <#T##CompletionHandler?##CompletionHandler?##(Image?, NSError?, CacheType, URL?) -> ()#>)

这个方法里, 我们只需要传入参数,
Resource: URL 要缓存的网络图片
placeholder: UIimage 站位图片
options: 操作类型 数组 [KingfisherOptionsInfoItem]
progressBlock(receivedSize, totalSize) 图片下载过程回调
completionHandler(image,error,type,url) 图片下载完成 回调
这个方法, 和 SDWebimage 的图片缓存方法差不多.

  • 自定义 初始化方法,
    一直没有走出 OC 的语言区域, 导致自定义初始化方法失败.

    //失败的自定义初始化方法:
    initWithArr(imageArr:[UIImage], titleArr:[String]){
    
    }
    
    // 正确的自定义初始化方法
    convenience init(imageArr:[UIImage], titleArr:[String]){
    
    }
    
  • 轮播图 点击回调事件, 打算用代理来写 逻辑更清晰.
    将点击事件使用代理的方式传递出去.
    注意: swift 中的协议前面需要加上 @objc(协议名字), 如下面的例子, 只有这样才能在 oc 文件中使用该代理
@objc(BannerViewDelegate)
public protocol BannerViewDelegate:NSObjectProtocol{
  • iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包,swift 3.0

全部封装完毕, 当我们项目需要用到 轮播图模块时 ,只需要把文件引入, 在工程中添加下面的代码就好.

BannerView *banner = [[BannerView alloc] initWithFrame:frame viewController:self  imageArr:self.imageUrlArr placeHoldImage:placeImage titleArr:self.titleArr];
    [self.view addSubview:banner];
  • 遇到的其他问题
    • 关于 闭包 闭包(Closures)

UITableView,UICollectionView相关

  • 关于UITableView,UICollectionView的缓存,计算,动画等

1.使用UITableView FDTemplateLayoutCell高度缓存以及实现文本展开全文和收起功能
2.当UICollectionView遇上动画拖动效果、圆形放大、书籍播放
3.实现collectionViewCell的移动(长按或者直接拖拽)
4.详细分享UICollectionView的自定义布局(瀑布流, 线性, 圆形...)
5.iOS UICollectionView高级用法(长按自由移动cell)-新
6.iOS 即时聊天界面优化心得
7.tableview性能优化之coreText
8.《iOS UITableView 优化》 直播笔记
9.UITableViewCell图片自适应填坑之旅
10.iOS开发仿【喵播】之快速集成tableView头部缩放视图 视图为模糊效果
11.论坛类应用双Tableview翻页效果实现
12.超炫的tableview缩放展开效果封装
13.iOS:根据内容动态计算高度的UITableViewCell
14.iOS开发--创建一个可以四面滑动的表格
15.iOS 仿热门话题界面(tableView)
16.UITableView自动计算cell高度并缓存,再也不用管高度啦
17.iOS两个 TableView 联动. 思路简单明了,无bug!

// 设置显示的位置self.scrollView?.contentOffset = CGPointMake(self.bounds.size.width, 0)

为什么要单独封装 一个轮播器出来呢.

直播相关内容

  • 直播相关涉及聊天列表优化,直播间动画

1.快速集成iOS基于RTMP的视频推流
2.iOS 即时聊天界面优化心得
3.iOS直播APP-点赞动画的实现
4.撸一个直播点赞动画
5.直播间点赞,直播间鼓掌动画
6.直播APP常用动画效果
7.《iOS UITableView 优化》 直播笔记
8.在直播应用中添加Faceu效果
9.最全的连麦直播技术点整理-AnyRTC
10.研发直播APP的收获-iOS
11.测弹动画
12.iOS直播:评论框与粒子系统点赞动画
13.iOS直播弹幕效果(礼物连击)
14.IOS视频直播:高仿腾讯旗下<NOW直播>映客直播类型
15.直播初探,仿全民TV
16.如何开发出一款仿映客直播APP项目实践篇 -【原理篇】
17.iOS开发中音视频的获取、压缩上传
18.iOS直播相关(快速集成基于RTMP的视频推流与拉流)
19.iOS开发、教你一步步实现直播间评论效果功能
22.仿映客刷礼物效果---代码优化我用的就是这个demo
23.仿映客直播系统送礼物动画完善版本
24.iOS 基于 IM 实现仿映客刷礼物连击效果
25.iOS 动画队列-仿映客刷礼物效果
26.直播模块开发总结
27.IOS 自定义弹幕实现
28.iOS弹幕的原理分析与实现
30.直播类app中推流技术的实现
31.弹幕控件MMDanmaku
32.视频直播之webp礼物解决方案
33.WebP进阶篇--Gif2WebP
34.沉淀之直播元年做直播

左右滑动时改变otherImgView的frame属性让其分别移至currentImgView的左或右两端,并设置图片,滑动结束后交换两张图片的内容并设置重置UIScrollview的滚动位置

 /** 定义手指滑动方向枚举 - DirecNone: 没有动 - DirecLeft: 向左 - DirecRight: 向右 */ enum CarouselViewDirec { case DirecNone case DirecLeft case DirecRight }// 监听scrollView滚动事件public func scrollViewDidScroll(scrollView: UIScrollView) { // 设置手指滑动方向 self.currentDirec = scrollView.contentOffset.x > scrollView.bounds.size.width ? .DirecLeft : .DirecRight; // 向右滑 if self.currentDirec == .DirecRight { // 将其他图片显示到左边 self.otherImgView!.frame = CGRectMake(0, 0, scrollView.bounds.size.width, scrollView.bounds.size.height); // 下一索引-1 self.nextIndex = self.currIndex - 1 // 当索引 < 0 时, 显示最后一张图片 if self.nextIndex < 0 { self.nextIndex = self.imageArray!.count - 1 } } // 向左滑动 else if self.currentDirec == .DirecLeft { // 将其他图片显示到右边 self.otherImgView!.frame = CGRectMake(CGRectGetMaxX(self.currentImgView!.frame), 0, scrollView.bounds.size.width, scrollView.bounds.size.height); // 设置下一索引 self.nextIndex = (self.currIndex   1) % self.imageArray!.count } // 去加载图片 self.loadImg(self.otherImgView!, index: self.nextIndex) } /** 设置整个轮播图片的显示逻辑 */ private func reloadImg() -> (){ self.currentDirec = .DirecNone;//清空滚动方向 //判断最终是滚到了右边还是左边 let index = self.scrollView!.contentOffset.x / self.scrollView!.bounds.size.width; //等于1表示最后没有滚动,返回不做任何操作 if index == 1 {return} //当前图片索引改变 self.currIndex = self.nextIndex; self.pageControl!.currentPage = self.currIndex // 将当前图片的位置放到中间 self.currentImgView!.frame = CGRectMake(self.scrollView!.bounds.size.width, 0, self.scrollView!.bounds.size.width, self.scrollView!.bounds.size.height) // 将其他图片对象的图片给当前显示的图片 self.currentImgView!.image = self.otherImgView!.image // 设置视图滚到中间位置 self.scrollView!.contentOffset = CGPointMake(self.scrollView!.bounds.size.width, 0) } /** 加载图片 - parameter imgView: 需要加载图片的 UIImageView - parameter index: 加载图片的索引 */ private func loadImg(imgView:UIImageView,index:Int){ let imgData = self.imageArray![index] // 如果是字符串类型,就去拼接URL if imgData is String { // MARK: - 此处可以换成别的网络图片加载逻辑 imgView.kf_setImageWithURL(NSURL(string: imgData as! String)!, placeholderImage: nil) } // 如果是NSURL类型则直接去加载 else if imgData is NSURL { // MARK: - 此处可以换成别的网络图片加载逻辑 imgView.kf_setImageWithURL(imgData as! NSURL, placeholderImage: nil) } // 图片类型 else if imgData is UIImage { imgView.image = imgData as? UIImage } // 其他未找到为空 else{ imgView.image = nil } }

 /** 初始化计时器 */ private func initTimer() -> (){ //如果只有一张图片,则直接返回,不开启定时器 if self.imageArray!.count <= 1 { return } //如果定时器已开启,先停止再重新开启 if timer != nil { timer?.invalidate() } timer = NSTimer.scheduledTimerWithTimeInterval(self.time, target: self, selector: #selector(SilenceCarouselView.timerFunction), userInfo: nil, repeats: true) // timer?.fire() NSRunLoop.currentRunLoop().addTimer(self.timer!, forMode: NSDefaultRunLoopMode) } /** 定时调用的方法 */ func timerFunction() -> (){ //动画改变scrollview的偏移量就可以实现自动滚动 self.scrollView?.setContentOffset(CGPointMake(self.scrollView!.bounds.size.width * 2, 0), animated: true) }//MARK: - UIScrollView代理方法 public func scrollViewWillBeginDragging(scrollView: UIScrollView) { // 开始拖动时停止自动轮播 self.timer?.invalidate() } public func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) { // 结束拖动时开启自动轮播 self.initTimer() } public func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) { // 带动画的设置scrollview位置后会调用此方法 self.reloadImg() // 设置图片 } public func scrollViewDidEndDecelerating(scrollView: UIScrollView) { // 结束滚动时重置方向 self.currentDirec = .DirecNone // 设置图片 self.reloadImg() }

封装意味着 我的业务逻辑不必被实现细节所污染

runtime相关

  • runtime相关应用、解释

1.runtime快速入门和实战
2.Runtime 10种用法(没有比这更全的了)
3.iOS 万能跳转界面方法 (runtime实用篇一)
4.OC核心 - RunTime - 基础
5.runtime小序曲,从运行时多态看这股神秘力量

以上就是大概的原理逻辑代码,如需要源码请查看Demo-github

我只想实现最简单的功能,因为这样方便日后的扩展修改,当封装的东西越多,你想改的难度和时间成本就越高,所有我就从简了! (如果你想实现更多的功能,把代码拿走,你的代码你做主!)

1、参考资料:高效图片轮播,两个ImageView实现2、轮播控件中用到的第三方框架:onevcat 的 Kingfisher 网路图片加载框架

把业务逻辑和功能实现细节分离开. 降低了程序的耦合性.

demo 暂时先不放出来了, 大家可以自己封装一个玩一玩,
如果需要救急的话, 私信我, 给你扔demo

runloop相关

  • runloop解释、应用、利用runloop优化程序

1.iOS RunLoop漫谈
2.RunLoop解决内存峰值方法记录

多线程

  • 多线程 NSOperation,Dispatch

1.iOS多线程--彻底学会多线程之『RunLoop』
2.iOS多线程--彻底学会多线程之『NSOperation』
3.iOS 实用小功能
4.iOS 支持多任务、断点下载(图片、音频、视频)
5.iOS多线程-归纳与总结
6.延迟执行函数方法
7.关于iOS多线程浅析
8.Runloop实际应用中如何优化app流畅度

block相关

  • block相关应用解析

1.Block是什么?
2.循环引用,看我就对了
3.iOS中block技术小结
4.iOS开发-Block实践

网络相关

  • 网络相关-ASI与AFN的封装、利用网络进行缓存处理

1.iOS网络请求之ASI与AFN的二次封装及意义
2.LXNetwork - 基于AF3.0封装的iOS网络请求库
3.iOS网络请求缓存:NSURLCache详解
4.AFNetworking之UIKit扩展与缓存实现
5.AFNetworking到底做了什么?(二)
6.AFNetworking之于https认证
7.AFNetworking到底做了什么?(终)
8.基于AFNetwoking的对网络请求的二次封装
9.【iOS】AFN多张图片上传及PHP端接收
10.iOS开发-网络缓存封装
11.Swift3.0系列之基于Alamofire4.0网络层封装
12.监测网络状态

数据库相关

  • 常用数据库FMDB,realm

1.移动端数据库新王者:realm
2.Realm数据库 从入门到“放弃”
3.从零开始,对iOS FMDB简单易懂的封装
4.数据存储之NSUserDefaults
5.CoreData基本操作封装
6.【进阶篇】如何优雅的设计coredata的离线缓存策略
7.使用FMDB(查询、增加、删除)

文件管理相关

  • 沙盒存储,文件管理

1.APP缓存文件清理

iOS生命周期,响应链

  • iOS生命周期、相应链、视图

1.iOS应用的生命周期

JS、UIWebView 、WKWebView,热更新

  • JS、UIWebView 、WKWebView,热更新交互热更新相关

1.iOS JavaScriptCore实现OC与JS的交互
2.WebView添加头视图并下拉放大
3.JSPatch (实时修复App Store bug)学习(一)
4.iOS开发--内嵌HTML编辑器 Objective-C 与 JavaScript 交互
5.JavaScript:浅谈iOS与H5的交互-JavaScriptCore框架
6.使用WKWebView替换UIWebView
7.iOS网络—UIWebView、WKWebView使用详解
8.获取UIWebView的显示内容的高度
9.WKWebView使用及注意点(keng)
10.ObjC&JavaScript交互,在恰当的时机注入对象
11.WebView与JS的几种交互
12.外部浏览器跳转到APP的指定页面
13.关于使用WKWebView时,ViewController不调用dealloc方法的记录
14.JS和OC交互问题之-JS怎么调用相册
15.WKWebView的使用和各种坑的解决方法(OC+Swift)
16.OC和H5交互 并且H5自适应高度
17.现有iOS项目中嵌入几个 React Native 页面
18.【iOS】WKWebView和Javascript的互调
19.IOS进阶之WKWebView
20.WKWebView详解&WKWebVieW和JS交互
21.【瞎搞iOS开发08】WKWebView (含JS交互) 踩坑、填坑小结
22.iOS与HTML混编(端内JS与OC交互)基础
23.从用户点击屏幕到程序作出反应之间都发生了什么? --- iOS事件响应

三方服务:登录、支付、分享、云存储

  • 具体就是一些支付 、登录、分享细节过程

1.两步快速集成使用ShareSDK、微信支付、支付宝支付
2.iOS 微信支付,显示一个确定按钮的坑
3.ApplePay最全支付界面调用和获取Payment参数,银联扣款流程
4.iOS微信第三方支付onResp方法不被回调的解决办法
5.微信和支付宝支付-看我的,用我的就够了
6.ShareSDK自定义分享平台UI
7.iOS开发微信支付傻瓜式教程

UI功能相关

*UI特效功能,高仿某个app的具体UI功能

1.(iOS)可以显示图片的类似网易新闻的头部滚动条
2.动手写一个快速集成网易新闻,腾讯视频,头条首页的ScrollPageView,显示滚动视图
3.iOS<咸鱼APP>新特性界面-视频动画 开机欢迎由4个动画组成
4.仿手机QQ下拉菜单框架(FFDropDownMenu) -- 自定义菜单样式(非xib)
5.iOS-UIWindow的巧用<装逼必备>,点击状态栏后UIScrollView滚动到最顶部
6.MG--iOS9.0之后点击状态栏回到顶部
7.iOS仿美团外卖饿了吗App点餐动画
8.分享我所知道的实现navigationBar渐变的几种方法
9.透明导航栏 && 非透明导航栏---一句代码
10.模仿QQ好友动态中的一个弹窗
11.最简单的badgeValue设置(文字都行)
12.仿简书导航栏图片随着UIScrollView的滚动放大缩小
13.iOS开发之UITableView数据为空的提示页面
14.简单易用的标签列表界面(宝宝用了都不哭了 )
15.[iOS 交互]浅析饿了么餐厅页交互的实现
16.KVO 设置 navigationBar 渐变透明效果
17.headerView NavigationBar渐变
18.NavigationBar&tabBar调色那些事儿
19.iOS 10 UIVisualEffectView 毛玻璃效果并添加阴影
20.[Objective-c] 自定制 tabBar
21.UINavigationBar和UITabBar 上滚渐变显示 下拉渐变隐藏
22.下拉图片变大
23.iOS一行代码集成悬浮球,代码已开源
24.iOS-实现映客首页TabBar和滑动隐藏NavBar和TabBar
25.iOS大神留步,你确定你会 (优雅) 的隐藏和显示导航栏吗?
26.安卓和iOS实现上滑停靠顶部悬浮框
27.自定义navigationToolBar实现TableViewCell编辑器
28.iOS UIScrollView实现非全屏卡片效果
29.ios 网易新闻详情页上拉关闭当前页面效果

自定义控件相关

*自定义控件,视图

1.iOS开发-轻松学会封装自定义视图view(自定义弹框封装详解)
2.iOS开发-超链接富文本-coreText框架
3.iOS-自定义控件制作及封装
4.自定义键盘工具栏——KeyboardToolBar
5.[iOS 动画]实现一个Material Design风格的Loading
6.自定义按钮之:文字图片位置随意定制
7.自定义控件之引导页(开端)

屏幕旋转相关

*收录各种屏幕旋转知识点

1.详解iOS开发中处理屏幕旋转的几种方法
2.iOS 个别页面强制横屏,其他页面竖屏
3.iOS 屏幕旋转,单个屏幕旋转的实现
4.关于iOS横竖屏的问题
5.NSInvocation 的使用之——强制屏幕旋转
6.屏幕横竖屏旋转系统整理
7.IOS屏幕开启旋转,UIAlertController 弹窗后,禁止屏幕旋转
8.iOS屏幕自动旋转问题 以及横屏模式打开APP出现的问题

绘图Quartz 2D 贝塞尔曲线相关

*iOS中绘图上下文,截屏相关

1.玩转iOS中的绘图(Quartz 2D基础篇)
2.分享iOS中常用的绘图, 截屏方法
3.iOS UIImage拉伸,CALayer蒙版整理
4.小方块跟随线的痕迹的动画
5.iOS 使用Charts框架 折线,柱状,K线,饼状,雷达全攻略
6.iOS仿美团外卖饿了吗App点餐动画
7.iOS-UIBezierPath和各种layer把我玩坏了
8.我们来谈谈贝塞尔曲线
9.路径动画 手绘文字效果
10.加入购物车的粒子动画
11.UITouch绘图,不使用贝塞尔曲线
12.使用贝塞尔曲线画饼图
13.用贝塞尔曲线与基础动画做一个iOS欢迎页效果
14.iOS CoreGraphics 学习与使用
15.iOS 画布(Core Graphics)
16.再做一次可爱的猫咪switch开关动画吧~
17.iOS开发-绘制渐变色圆环(圆弧)
18.iOS-CALayer上的动画 如何暂停和恢复?
19.iOS使用CAShapeLayer做一个WebView浏览器进度条
20.�如何理解CGAffineTransform

动画相关

*涵盖各种直播动画,跳转,过渡动画等

1.分享iOS中实现navigationController全屏手势滑动pop
2.iOS中应该知道的自定义各种Controller的转场过渡动画
3.谈UIView Animation编程艺术
4.QuartzCore 之 CAAnimation 动画详解
5.iOS 走进Facebook POP的世界
6.iOS开发之——从零开始完成页面切换形变动画
7.iOS之UIView动画
8.测弹动画
9.iOS 自定义动画以及自定义加载框
10.iOS UIView 动画-基础api讲解
11.老司机带你走进Core Animation 之CAAnimation
12.iOS开发基础知识:Core Animation(核心动画)
13.简单快速实现一张图上下动图效果
14.iOS动画-通篇详解
15.iOS核心动画1——认识图层CALayer
16.Adobe源码泄漏?3行代码搞定,Flash动画无缝导入Android/iOS/cocos2dx(一)
17.Adobe源码泄漏?3行代码搞定,Flash动画无缝导入Android/iOS/cocos2dx(二)
18.CoreAnimation之CALayer基础
19.animateWithDuration动画循环AnimationRepeatCount
20.CoreAnimation之变换
21.iOS Demo合集 礼花(烟花)效果、逐层刷新图片、飘落的雪花、自己画个旋转的太极图
22.使用CAGradientLayer实现背景颜色渐变和特效
23.iOS动画-按钮动画
24.破碎动画(iOS)
25.iOS Core Animation(一)- 属性、iOS Core Animation(二)- 属性、iOS Core Animation(三)- 属性
26.利用CAShapeLayer和CADisplayLink制作波浪效果
27.Core Animation 第三章 图层几何
28.SpriteKit学习笔记10-flying bird仿制(一)
29.[iOS]过渡动画之高级模仿 airbnb
30.UI Dynamic 毛毛虫练习
31.UIView 动画 (整理笔记)
32.核心动画:Core Animation (整理笔记)
33.iOS 神奇的果冻效果
34.FJFloatingView 可停靠任意位置悬浮窗
35.Core Animation 第五章 变换
36.波浪效果的实现
37.iOS 常用特效篇
38.iOS动画详解(学习动画看这一篇就够了)
39.转圈菜单栏的实现《一》
40.五分钟就能学会的运动刻度动画效果
41.IOS转场动画

内存管理、性能优化、离屏渲染使用

*程序内存管理、优化相关、Instrument学习使用

1.深入OC的内存管理
2.iOS内存、缓存及存储优化
3.Xcode - 使用 Instruments 做 iOS 程序性能调试
4.iOS项目工程崩溃日志分析和采集,成为一名合格iOS程序员必须掌握的技能
5.一次iOS App优化(踩坑)之旅
6.iOS 性能调优,成为一名合格iOS程序员必须掌握的技能
7.iOS开发之Xcode常用调试技巧总结
8.iOS 圆角性能问题
9.iOS 高效添加圆角效果实战讲解
10.大话iOS之“离屏渲染”
11.iOS开发技巧:快速实现 圆角 描边
12.使用 ASDK 性能调优 - 提升 iOS 界面的渲染性能
13.ios性能优化
14.内存管理-dealloc方法到底应该怎么写?
15.深入浅出谈iOS应用优化
16.一句话设置图片圆角,高性能,避免离屏渲染,畅享丝滑
17.iOS~图片裁剪圆角矩形
18.TabelView图片圆角的性能优化测试

软件架构思想 MVC MVVM MVP 组件化 链式语法

*收录其他人iOS架构思维

1.说说view与model解耦
2.TableView之MVVM与MVC之对比
3.使用MVVM减少控制器代码实战(减少56%)
4.5年iOS经验做的基础工程送给你,起步就领先别人
5.iOS 开发 -- 使用拦截器来取代基类
6.iOS使用链式语法自定义UIButton
7.控制器瘦身之Tableview抽取<二>

系统控件使用方法以及扩展

  • 系统控件的使用方法以及扩展
  1. 扩大按钮(UIButton)点击范围(随意方向扩展哦)
  2. 史上最全的iOS之访问自定义cell的textField.text的N种方法
    3.含有Emoji表情的文本计算高度
    4.statusBar 背景以及字体颜色设置
    5.UITextView 的Placeholder(分类�和继承实现)
    6.模拟网易新闻、今日头条的textView高度自适应输入框、frame和masonry两种方式实现
    7.iOS防止按钮快速连续点击造成多次响应的方法
    8.UITextView高度随内容自增长,只有这样才是对的
    9.带徽章提醒的Button开发过程
    10.iOS 地址选择器-
    11.猫猫学iOS之UITextField右边设置图片,以及UITextField全解
    12.给UIbutton加两个category,扩大点击区域和增加点击间隔
    13.嘴爷发飙,逐字生敲,图文详解UIButton的imageEdgeInsets和titleEdgeInsets设置
    14.iOS 获取 Label 高度的正确方式
    15.【Objective-c】 键盘遮挡看我的就行了(特别是UITextView)
    16.UILabel属性大全
    17.iOS开发基础:自定义UILabel
    18.iOS开发-UITextField的那点事
    19.iOS开发——让自定义button简单易行
    20.iOS一个字符一个框的验证码输入框
    21.iOS中文行间距富文本高度与显示那些坑
    22.iOS10之后 NavgationBar 透明
    23.使用UIToolbar的坑

真机相关

  • 涵盖推送、发布、测试证书、内购流程、上架审核问题

1.iOS 邀请用户评价
2.iOS-private-api-checker私有API检测工具使用详细步骤
3.最详细iOS打包流程
4.关于缓存清理和版本监测更新
5.【iOS】苹果IAP(内购)中沙盒账号使用注意事项
6.iOS快速上手应用内购(IAP)附Demo
7.app自定义弹出通知的声音震动控制
8.iOS开发 内购流程 手把手教你还不学?
9.iOS 内购笔记以及一些坑的总结
10.iOS 内购IAP 2017年最新填坑
11.最新iOS 应用发布到AppStore详细流程(第二篇)
12.iOS打包上架流程

定时器相关

  • 定时器相关文档内容

1.一个play方法实现全屏炫酷倒计时的小demo
iOS轮播图:CADisplayLink实现轮播和自定义动画的时间曲线算法(渐入渐出等)
2.CADisplayLink && 双击 home 键的时候, 动画不会暂停
3.CADisplayLink的基础 以及CADisplayLink与NSTimer的比较
4.点击获取短信验证码倒计时(iOS)
5.定时器的三种使用方式

后台任务

*研究一波吧

1.iOS 后台任务
2.NSTimer的基础用法以及程序挂起后NSTimer仍然可以在后台运行计时
3.iOS语音提醒开发总结
4.iOS 后台任务

少用的知识点、功能点相关

  • 包括iOS 指纹识别等了流程,底磁感应,App的版本更新,蓝牙

1.iOS指纹识别登录流程及实现
2.多层present,dismiss回到首次present的控制器
3.iOS 时间计算,label段落显示
4.为App添加行为录制功能ReplayKit框架入门指南
5.[iOS]中修改导航栏下阴影线的尺寸和颜色
6.iOS开发之图文混编
7.iOS 自定义字体设置与系统自带的字体
8.APP直接跳转设置页面
9.时间戳与时间之间的转换
10.图文混排(自动调节高度)和多媒体
11.iOS开发中隐藏导航栏的分割线
12.iOS开发技巧:实现电话号码文本框
13.IOS类似图片验证码的实现
14.iOS 时间校准解决方案
15.【Objective-c】 神奇的热修复(JSPath)
16.QQ等APP版本更新(iOS)
17.iOS与Unity3d交互
18.iOS录屏开发——目前公开的情报
19.iOS上面自定义字体
20.iOS指纹识别
21.iOS蓝牙知识快速入门(详尽版)
22.iOS导入自定义字体,艺术字体
23.带你了解UIKit动力学

面试总结

  • 常用知识点 涵盖各种iOS知识

1.iOS 懒加载 strong,weak,retain,assign, copy set和get方法 __weak和__block
2.iOS即时通讯,从入门到“放弃”?

Xcode工具、开发工具、程序调试

  • Xcode工具、开发工具、程序调试

1.解决pod setup缓慢及失败的另一种方式
2.iOS 如何在程序上线期间做隐藏功能
3.最新的CocoaPods的使用教程(二)
4.AvoidCrash -- 远离常见的崩溃
5.iOS 常用的lldb命令
6.测试驱动的 iOS 开发-简介与技巧
7.项目常见崩溃(陆续更新)
8.iOS崩溃日志处理-- Crashlytics
9.项目常见崩溃4(陆续更新)
10.解决CocoaPods慢的小技巧
11.Xcode 8 Instruments 学习(一)...Xcode 8 Instruments 学习(二)...Xcode 8 Instruments 学习(三)...Xcode 8 Instruments 学习(四)...About Instruments官方文档翻译整理 一...About Instruments官方文档翻译整理 二..About Instruments官方文档翻译整理 三
12.Xcode里的Instruments工具:Leaks、Allocations、Time Profiler、Automation
13.iOS-Main -关于Instruments-Leaks工具的归纳总结
14.使用Xcode7的Instruments检测解决iOS内存泄露

基础知识点

  • 涵盖布局、控件等知识点

1.setNeedsDisplay, setNeedsLayout
2.使用Block何时需要WeakSelf和StrongSelf
3.iOS-哔哩哔哩动画_富文本的使用
4.实现UIViewController隔页跳转(不销毁控制器)
5.iOS四大对象之UIApplication对象
6.iOS四大对象之AppDelegate及UIApplicationMain函数/程序启动过程
7.iOS四大对象之UIWindow及四大对象之间的关系
8.iOS-启动时候隐藏状态栏
9.AppDelegate生命周期(一些函数回调的方法) 、iOS应用程序的前后台切换以及点击手机home键的相关知识
10.iOS-理解 : UDID、UUID、IDFA、IDFV
11.手势-操作图片,一根手指就够了!
12.iOS 修改状态栏字体颜色(亲测,好用)
13.iOS投影效果
14.iOS让导航返回按钮可以选择性的pop
15.iOS开发之时间戳、NSString、NSDate三者的相互转化
16.IOS 设置状态栏风格
17.iOS开发的一些奇巧淫技3

解决特殊问题

  • 比如系统下划线 超出视图问题

1.一句话去掉导航栏下的黑线
2.[iOS]中修改导航栏下阴影线的尺寸和颜色
3.iOS开发中隐藏导航栏的分割线
4.通过拦截 hitTest:withEvent 方法,解决超出父视图的子视图不能接受点击事件的问题
5.iOS UIAlertController 弹出延迟

屏幕适配、图文混排

  • CoreText emoji表情 适配方法 三方库 以及 图文混排

1.iOS—emoji表情处理
2.是时候了解一下UILayoutGuide了
3.CoreText实现图文混排之文字环绕及点击算法
4.自己总结的一些关于Masonry适配姿势
5.Masonry初探
6.Masonry自适应cell高度,同时实现cell折叠和展开

本文由星彩网app下载发布于计算机编程,转载请注明出处:控件的封装,总结过往收藏的技术文章

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。