2019独角兽企业重金招聘Python工程师标准>>>

1. app间跳转

跳转到appstore

  1. 找到应用程序的描述链接,比如:http://itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8
  2. 然后将 http:// 替换为 itms:// 或者 itms-apps://:( itms://itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8, itms-apps:// itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8)
  3. 然后打开这个链接地址: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms://itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8"]];

其它应用中打开app, 通过app的 URL Schemes

实验证明, 在浏览器中跳转到appstore页面的时候, 系统会自动拦截并打开appstore应用, 跳转到指定的APP页面.

浏览器中打开应用的话, 可以通过打开app相应的 URL Schemes 来打开app, 还可以传递参数, 以打开指定的页面.

2.关于开发中未使用的函数返回值的警告信息

//定义函数的时候, 函数前面添加如下的注解, 则未使用的返回值会得到警告信息
@warn_unused_result
//函数前面添加如下的注解, 未使用的返回值不会得到警告信息
@discardableResult

3.iflet, guardlet

swift开发也有一段时间了, 今天get一个iflet的新技能, 如下代码所示, iflet之后, 可以直接进行条件判断. 不得不说这个功能还是非常有用的, 在过去的一个swift项目中初次遇到这个问题, 由于没人指导只能再加个if判断来解决, 这是一个好方法!

iflet和guardlet都支持条件判断!

var num: Int? = 30if let num = num, num > 30 {print("num: \(num)")
}else{print("num不符合条件")
}

4.app启动图和icon的尺寸

icon尺寸: notification@2x.png(40×40), notification@3x.png(60×60) spotlight5-11@2x.png(58×58), spotlight5-11@3x.png(87x87) spotlight7-11@2x.png(80×80), spotlight7-11@3x.png(120x120) appicon@2x.png(120×120), appicon@3x.png(180×180) appstore.png(1024x1024)

启动图尺寸: 640 × 1136 1242 × 2208 640 × 960 750 × 1334 iPhone X: 1125*2436

5.OptionSet

在Objective-C中, 我们可以这样定义一个enum, 然后我们可以通过 &, | 等符号将多个合并在一起形成一个集合Options, 在Objective-C中我们使用NS_OPTIONS这样的类型.

在swift中我们也可以定义相似的类型, 不过是使用OptionSet类型,如下声明一个WHHero类型的方法如下. 通过声明一些静态常量来标记不同的状态.

public struct WHHero: OptionSet {public var rawValue: UIntpublic init(rawValue: UInt) {self.rawValue = rawValue}public static let hero1 = WHHero(rawValue: 1 << 0)public static let hero2 = WHHero(rawValue: 1 << 1)public static let hero3 = WHHero(rawValue: 1 << 2)public static let hero4 = WHHero(rawValue: 1 << 3)public static let hero5 = WHHero(rawValue: 1 << 4)
}

OptionSet类型本身就是可包含一个也可以包含多个类型的OptionSet, 示例代码如下所示.

let h1: WHHero = .hero3
var h2: WHHero = [.hero1, .hero2, .hero4]
let h3: WHHero = .hero4h2 == h3
h2.contains(h3)     //判断是否包含
h2.insert(h1)       //set中插入新的set
h2.remove(h1)       //重set中移除指定的setprint(h1)
h1.rawValue
h2.rawValue

6.label的lineBreakMode

addrView.titleLabel?.lineBreakMode = .byTruncatingTail

7.iPhone7p, 太多url重定向报错

项目使用http测试没有任何问题, 切换到线上的https的时候所有网络请求都报错"太多url重定向", 这次解决方法: 1.关闭appstore, 2.清除safari缓存和浏览记录,3.重启手机. 4.删除重装app,好使了! 卧槽, 这是社么问题? 也是奇葩!

8.适配iOS 11

四行代码适配iOS 11中的ScrollView. 以下代码放在AppdelegatedidFinishLaunchingWithOptions中即可.

if (@available(ios 11.0,*)) {UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;UITableView.appearance.estimatedRowHeight = 0;UITableView.appearance.estimatedSectionFooterHeight = 0;UITableView.appearance.estimatedSectionHeaderHeight = 0;}

9.where的用法, 给符合某种指定条件的类型添加扩展

extension ArraySlice where Element == String {/// Returns a new string by concatenating the elements of the sequence,/// adding the given separator between each element.////// The following example shows how an array of strings can be joined to a/// single, comma-separated string://////     let cast = ["Vivien", "Marlon", "Kim", "Karl"]///     let list = cast.joined(separator: ", ")///     print(list)///     // Prints "Vivien, Marlon, Kim, Karl"////// - Parameter separator: A string to insert between each of the elements///   in this sequence. The default separator is an empty string./// - Returns: A single, concatenated string.public func joined(separator: String = default) -> String
}

10. 五分钟实现label轮播的广告

思路就是使用CATransition, 简单粗暴, 转场动画直接完事, 需要注意的是, 动画移动过程中, label边界可能会超出父类view的边界, 解决就是设置父类的clipToBounds = true, 这样超出的就会被剪切掉, 完美!

这种可以实现从上到下, 从下到上, MoviIn, Puhs等效果, 如果文字比较长, 需要右到左展示, 额能需要解决scrollview实现方便一点. 就这样.

var ransitionAnimation: CATransition {let ani = CATransition()ani.type = kCATransitionPushani.subtype = kCATransitionFromTopani.duration = 0.3ani.isRemovedOnCompletion = truereturn ani}

11. 关于swift中的锁和defer关键字

objc_sync_enter, objc_sync_exit

如下所示, 是一个模拟Objective-C中的dispatch_once的代码, 其中锁定使用了objc_sync_enter这种方法, 使用objc_sync_enterobjc_sync_exit 包裹的代码会被有序、同步地执行。

但是,需要谨记,一旦 sync_enter 以后,整个应用就会被锁定,直至 sync_exit。所以,在 lock 的代码区域中,要多加留意,看是否存在死锁的现象。

public extension DispatchQueue {private static var _onceTracker = [String]()/**Executes a block of code, associated with a unique token, only once.  The code is thread safe and willonly execute the code once even in the presence of multithreaded calls.- parameter token: A unique reverse DNS style name such as com.vectorform. or a GUID- parameter block: Block to execute once*/public class func once(token: String, closure:()->Void) {objc_sync_enter(self)defer { objc_sync_exit(self) }if _onceTracker.contains(token) {return}_onceTracker.append(token)closure()}
}

defer

延迟执行, defer代码块里面的代码会在return之前执行, 使用defer的好处是方式忘记一些关键代码, 比如打开一个文件后, 可以在defer的代码块里面关闭文件, 防止忘记关闭文件.

12. where关键字的应用

扩展一个类, 指定实现Equatable协议的类型才有扩展中的方法和变量. 这时候可以使用where关键字做过滤.

// MARK: - 数组元素操作(AnyClass类型)
public extension Array where Array.Element : Equatable  {/// 移除数组中的一个指定元素////// - Parameter obj: 指定的元素public mutating func removeObject(_ obj: Array.Element) {guard let idx = self.index(of: obj) else {return}remove(at: idx)}
}

13. 关于UICollectionView header和footer的悬停效果

iOS 9以后系统提供了一下两个属性可以方便的实现悬停效果, 考虑到iOS 9以前用户比例比较少, 所以可以放弃考虑了.

// Set these properties to YES to get headers that pin to the top of the screen and footers that pin to the bottom while scrolling (similar to UITableView).@available(iOS 9.0, *)open var sectionHeadersPinToVisibleBounds: Bool@available(iOS 9.0, *)open var sectionFootersPinToVisibleBounds: Bool

14. Cell高度自适应问题

自从第一次做就一直在纠结到底哪种方式计算自适应高度才是最合理的, ? , 总结两个自己最常用的方式.

ios8以后可以用这种方法:

//1.这总方法. 在cell中不能设置label高度的约束, 使其自适应即可
self.tableView.estimatedRowHeight = 150;//估算高度
self.tableView.rowHeight = UITableViewAutomaticDimension;//注释掉这个方法
//func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
//        return App.relSize(128)
//    }//2. 另一种方法就是计算高度, 使用masonry或者snapkit设置约束了.

转载于:https://my.oschina.net/whforever/blog/994731

原 记录一下iOS开发中琐碎的点点_6相关推荐

  1. iOS开发中多线程的那些事

    iOS开发深入之后还是要接触多线程和runloop的,写篇博客讲解.记录下iOS开发中的多线程技术. 线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比 ...

  2. iOS开发中打电话发短信等功能的实现

    在APP开发中,可能会涉及到打电话.发短信.发邮件等功能.比如说,通常一个产品的"关于"页面,会有开发者的联系方式,理想情况下,当用户点击该电话号码时,能够自动的帮用户拨出去,就涉 ...

  3. iOS开发中标签控制器的使用——UITabBarController

    iOS开发中标签控制器的使用--UITabBarController 一.引言 与导航控制器相类似,标签控制器也是用于管理视图控制器的一个UI控件,在其内部封装了一个标签栏,与导航不同的是,导航的管理 ...

  4. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  5. iOS开发中键盘样式和自定义键盘。

    文章目录 系统自带的样式 自定义键盘 在系统自带键盘基础上自定义键盘 完全自定义键盘 自定义全部类型键盘 系统自带的样式 在iOS开发中系统自带键盘已经有很多样式,但是有时候并不能满足我们都开发需求, ...

  6. iOS开发中的Web应用概述

    为了更好的阅读体验,建议阅读原文 插播广告 -- 几十行代码完成资讯类App多种形式内容页 HybridPageKit :一个针对资讯类App高性能.易扩展.组件化的通用内容页实现框架. 想和我一起全 ...

  7. iOS开发中MD5加密算法的实现

    一.MD5算法简介 MD5的全称是Message Digest Algorithm 5(消息摘要算法第五版),是计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.在90年代初由MIT L ...

  8. iOS开发中遇到的一些问题及解决方案【转载】

    iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // //  MyScrollView.m //  Creat ...

  9. IOS开发中巧用Photoshop的通道功能

    有时候在IOS开发中需要一些简单的.小的png图片时,便可以自己动手用Photoshop来做了(有时候UI设计师大大也不是那么情愿来给你做这些小东西啊!) 设置一张图片的颜色:可使用魔棒工具选中要改变 ...

最新文章

  1. C++ 汇编代码查看
  2. 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------剑指offer系列
  3. sql join 与where的区别
  4. hashmap另一种初始化
  5. python实现新闻网站_Python 教你 4 行代码开发新闻网站通用爬虫
  6. active mq topic消费后删除_天天在用消息队列,却不知道为啥要用 MQ ,这就尴尬了...
  7. 程序员的mysql经典pdf_程序员的SQL金典 杨中科著 中文 PDF版
  8. 主流锂电池保护板原理
  9. 运动控制芯片 Motion Control ICs
  10. 自带win10系统换win7的那些坑
  11. 无限纷争怎么看以前的服务器,无限纷争怎么切换角色 无限纷争切换角色方法...
  12. python写邮箱系统_Python django实现简单的邮件系统发送邮件功能
  13. 笔记本电脑设备管理器找不到独立显卡的解决方案
  14. 如何在Node.js应用程序中使用RethinkDB
  15. 关于html5外文翻译三千字,推荐5个功能强大的外文文献学术论文翻译工具
  16. AH8669_DC650V/AC265V高压IC,输出5V12V24V500MA电源芯片方案
  17. LightOJ 1079 Just another Robbery【概率DP】
  18. 生不逢时的360搜索
  19. 2022全年度烘干机十大热门品牌销量榜单
  20. 安卓adb命令启动wifi方法

热门文章

  1. 《JAVA与模式》之模板模式(转载)
  2. 基于Html5的爱情主题网站–表白神器(第二版)
  3. Spring mvc3的ajax
  4. JAVA web项目转客户端(nativefier)
  5. 如何给英特尔致命一击——高通公布10纳米ARM服务器芯片
  6. Oracle中序列(Sequence)详解
  7. Java集群优化——dubbo+zookeeper构建高可用分布式集群
  8. 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小...
  9. 学习IT技术你需要的是书?视频教程?还是老师?
  10. 宽带服务价值链之:ISP,ICP,ASP,IDC,CDN