kysonyangs

Stay Hungry, Stay Foolish


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 搜索

iPhoneX适配

发表于 2018-01-20 | 更新于 2020-05-17 | 阅读次数:

iPhoneX适配

push 和 pop时,页面偏移

在有 UIScrollView 或 UIScrollView 子类(如tableView)的控制器中,push 到第二个几面和 pop 回去,scrollView 都会往下偏移。

在 AppDelegate 中用 UISCrollView 的 UIAppearance 修改

1
2
3
4
// AppDelegate 进行全局设置 不然iOS 11 push时界面会有个下滑的效果,pop回去会有个上划的效果
if (@available(iOS 11.0, *)) {
[[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}

TabBar 在 push 的时候会向上弹,然后还会有黑块

自定义 navigationController 重写的 push 方法里面修改 tabbar 的 frame

1
2
3
4
5
6
7
8
9
10
// 修改tabBar的frame 不然iPhone X push的时候tabBar上会向上弹
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
if (self.viewControllers.count > 0) {
viewController.hidesBottomBarWhenPushed = YES;
}
[super pushViewController:viewController animated:animated];
CGRect frame = self.tabBarController.tabBar.frame;
frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height;
self.tabBarController.tabBar.frame = frame;
}

TableView 添加 MJFooter 时,底部显示 MJFooter

修改 MJFooter 偏移位置

1
self.tableView.mj_footer.ignoredScrollViewContentInsetBottom = kSalfBottomSpace;

CocoaPods/Carthage

发表于 2017-12-05 | 更新于 2020-05-17 | 阅读次数:
  • CocoaPods (默认)自动建立和更新一个 Xcode workspace,用来管理你的项目和所有依赖。Carthage 使用 xcodebuild 来编译出二进制库,剩下的集成工作完全交给开发人员。
  • CocoaPods 使用起来方便, Carthage 更加灵活并且对现有项目没有太多的侵略性。
  • CocoaPods 希望建立一个生态系统,可以更加方便的发现和集成第三方代码库。 Carthage 希望变成一个去中心化的依赖管理系统,不提供中心化的项目列表,减少维护成本和单点失败的概率。不过这样给开发人员寻找项目带来不便。
  • CocoaPods 的项目需要配置 podspec 文件,包含了项目和第三方库的信息。 Carthage 并不使用类似的配置文件,第三方库的依赖关系是通过 Xcode 项目来配置的。
阅读全文 »

Alfred使用

发表于 2017-10-16 | 更新于 2020-05-17 | 阅读次数:

设置

Alfred 启动后,点击帽子图标,选择 Preferences... 打开设置面板

阅读全文 »

iOS MVC、MVP、MVVM

发表于 2017-10-16 | 更新于 2020-05-16 | 阅读次数:

MVC

  • Model:负责封装数据,存储和处理数据运算等工作
  • View:负责数据展示、监听用户触摸等操作
  • Controller:负责业务逻辑、事件响应、数据加工等工作

用户操作View,在Controller层完成业务逻辑处理,更新Model层,将数据显示在View层。

View把控制权交给Controller层,自己不执行业务逻辑;Controller层执行业务逻辑并且操作Model层,但不会直接操作View层;View和Model层的同步消息是通过观察者模式进行,而同步操作是由View层自己请求Model层的数据,然后对视图进行更新,观察者模式可以做到多视图同时更新。

  • 优点:View、Model可以重复利用
  • 缺点:导致Controller臃肿,代码特别多,视图一复杂起来,代码量过长,不好维护;写在Controller里View的代码无法复用;
阅读全文 »

方法替换

发表于 2017-10-05 | 更新于 2020-05-17 | 阅读次数:

Aspects

Aspects 是一个基于 Method Swizzle 的函数替换的第三方库,支持在方法执行前(AspectPositionBefore)/执行后(AspectPositionAfter)或替代原方法执行(AspectPositionInstead)

使用

  1. HOOK一个类的所有实例的指定方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /// 为一个指定的类的某个方法执行前/替换/后,添加一段代码块.对这个类的所有对象都会起作用.
    ///
    /// @param block 方法被添加钩子时,Aspectes会拷贝方法的签名信息.
    /// 第一个参数将会是 `id<AspectInfo>`,余下的参数是此被调用的方法的参数.
    /// 这些参数是可选的,并将被用于传递给block代码块对应位置的参数.
    /// 你甚至使用一个没有任何参数或只有一个`id<AspectInfo>`参数的block代码块.
    ///
    /// @注意 不支持给静态方法添加钩子.
    /// @return 返回一个唯一值,用于取消此钩子.
    + (id<AspectToken>)aspect_hookSelector:(SEL)selector
    withOptions:(AspectOptions)options
    usingBlock:(id)block
    error:(NSError **)error;
  2. HOOK一个类实例的指定方法

    1
    2
    3
    4
    5
    /// 为一个指定的对象的某个方法执行前/替换/后,添加一段代码块.只作用于当前对象.
    - (id<AspectToken>)aspect_hookSelector:(SEL)selector
    withOptions:(AspectOptions)options
    usingBlock:(id)block
    error:(NSError **)error;
  3. Example

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    +(void)Aspect {
    // 在类UIViewController所有的实例执行viewWillAppear:方法完毕后做一些事情
    [UIViewController aspect_hookSelector:@selector(viewWillAppear:)
    withOptions:AspectPositionAfter
    usingBlock:^(id<AspectInfo> info) {
    NSString *className = NSStringFromClass([[info instance] class]);
    NSLog(@"%@", className);
    } error:NULL];

    // 在实例myVc执行viewWillAppear:方法完毕后做一些事情
    UIViewController* myVc = [[UIViewController alloc] init];
    [myVc aspect_hookSelector:@selector(viewWillAppear:)
    withOptions:AspectPositionAfter
    usingBlock:^(id<AspectInfo> info) {
    id instance = info.instance; //调用的实例对象
    id invocation = info.originalInvocation; //原始的方法
    id arguments = info.arguments; //参数
    [invocation invoke]; //原始的方法,再次调用
    } error:NULL];
    // HOOK类方法
    Class metalClass = objc_getMetaClass(NSStringFromClass(UIViewController.class).UTF8String);
    [metalClass aspect_hookSelector:@selector(ClassMethod)
    withOptions:AspectPositionAfter
    usingBlock:^(id<AspectInfo> info) {
    NSLog(@"%@", HOOK类方法);
    } error:NULL];
    }

Swift技巧

发表于 2017-10-03 | 更新于 2020-05-17 | 阅读次数:

cell分割线置顶

1
tableView.separatorInset = UIEdgeInsets.zero

Swift中lazy作惰性求值

函数式编程中有惰性求值的概念,即一次计算在真正需要时才执行,尽可能推迟求解表达式。
假如我们有一个数组,我们对每个元素作 element*2 的 map 操作,获取其中某一个元素,我们会如下代码处理:

1
2
3
let array = [1, 2, 4, 5, 3, 7]
let element = array.map{ $0 * 2 }[3]
print(element)

这个计算对每个元素都*2,最后我们只取了其中一个值,也就是说在这个场景中另外5次计算是无意义的。

这时使用惰性求值就可以避免这算浪费。我们知道Swift中有个lazy关键字,如果用来修饰属性之类的,可以实现属性的惰性求值。同样,Swift扩展了LazySequenceProtocol协议,提供了一个lazy属性,用于处理map,filter等操作的惰性求值,定义如下代码所示:

1
2
3
4
extension LazySequenceProtocol {
/// Identical to `self`.
public var lazy: Self { get }
}

所以,上面这个例子如果要实现惰性求值,则可以如下代码处理:

1
2
3
let array = [1, 2, 4, 5, 3, 7]
let element = array.lazy.map{ $0 * 2 }[3]
print(element)

阅读全文 »

导出p12文件

发表于 2017-06-20 | 更新于 2020-05-17 | 阅读次数:

为什么要导出.p12文件?

当我们用大于等于三个MAC设备开发应用时,想要申请新的证书,如果在我们的证书里,包含了2个发布证书,2个开发证书,可以发现再也申请不了开发证书和发布证书了(一般在我们的证书界面中应该只有一个开发证书,一个发布证书,没必要生成那么多的证书,证书一般在过期之后才会重新添加。)

导出.p12文件

我们的每一个证书都可以生成一个.p12文件,这个文件是一个加密的文件,只要知道其密码,就可以供给所有的mac设备使用,使设备不需要在苹果开发者网站重新申请开发和发布证书,就能使用。​​

注意:一般.p12文件是给与别人使用的,本机必须已经有一个带秘钥的证书才可以生成.p12文件

如果你发现该证书没有秘钥,则删除钥匙串中的该证书,重新下载并双击打开加入到钥匙串即可!​

打开钥匙串,先选择左侧钥匙串中的登录(不是系统!!!),再点击种类中的证书,选择我们需要的证书,右击,选择“导出“iPhone Distribition/Developer:

为.p12文件填一个名字,设置密码

使用描述文件

拿到这两个文件后,依次双击“证书”,“.p12“文件(需要输入密码,密码就是当时生成.p12时设定的密码,),作用是加入钥匙串中,使我们的电脑具备开发的证明,”描述文件“(作用是置于Xcode中,让Xcode知道我们开发的合法性),添加完后就可以使用了。

Mac终端

发表于 2017-02-10 | 更新于 2020-05-17 | 阅读次数:

复制粘贴无效解决

1
2
3
4
launchctl list | grep com.apple.pboard

launchctl stop com.apple.pboard
launchctl start com.apple.pboard
阅读全文 »

Info.plist属性

发表于 2017-01-05 | 更新于 2020-05-17 | 阅读次数:

阅读全文 »

Git命令

发表于 2016-11-05 | 更新于 2020-08-11 | 阅读次数:

放弃修改,强制覆盖本地代码

1
2
3
git fetch --all
git reset --hard origin/master
git pull

合并单个commit到指定的分支上

1
2
3
git log  //查看提交的日志,复制要合并的那个分支的commit id</span>
git checkout 要合并的分支 // 切换到要合并的分支上
git cherry-pick 上面复制的那个要合并的commit id // 提交该commit到当前分支

合并多个commit到指定的分支上

1
2
3
4
1. 基于逆向改变的分支拉出一个分支
2. rebase这个新分支的commit到master
# 代表从7dcada开始到该分支结束
git rebase --onto master 76cada^

从O开始

1
2
3
4
5
git init
git remote add origin xxx.git
git add .
git commit -m "xxx"
git push origin master

查看远程仓库地址

1
git remote -v

打标签

1
2
3
4
git tag -a '0.0.1' -m "xxx"
git tag #查看
git push --tags #提交本地所有标签
git push origin 0.0.1 #提交某个标签

删除标签

1
2
git tag -d 0.0.1
git push origin :0.0.1 #删除远程标签

git push 403 错误

原因: 本地储存了用户名和密码,重新设置就好了

1
git remote set-url origin 用户名@git.coding.xxx.git

Git常用命令

  1. git init: 初始化一个Git仓库:把某个目录变成Git可以管理的仓库
  2. git add test.h: 把文件test.h添加到仓库
  3. git commit -m "添加了test.h文件": 把文件提交到仓库。(git commit命令,-m后面输入的是本次提交的说明)
  4. git push (origin master(分支名称)): 推送到远程仓库,其中()里面是可选的
  5. git pull (origin master(分支名称)): 拉取远程仓库最新,其中()里面是可选的
  6. git status: 查看工作区的状态
  7. git diff test.h: 查看test.h文件修改了什么(diff—>difference)
  8. git log: 显示从最近到最远的提交日志。如果嫌输出信息太多,看得眼花缭乱的,可以试试加上–pretty=oneline参数
  9. git remote add origin git@...: 关联一个远程库
  10. git push -u origin master: 当远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
  11. git clone git@...: 克隆
  12. git remote: 要查看远程库的名称
  13. git remote -v: 显示更详细的远程库信息。显示可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址
  14. git fetch: 个人粗浅的理解为将远程所有的分支信息拉取到本地
    1

回退与撤销

  1. git reset --hard HEAD^: 回到上一个版本
  2. git reset --hard HEAD^^: 回到上上个版本
  3. git reset --hard HEAD~100: 回到上100个版本
  4. git reset --hard 791c95aa44cc5540d93a146d6d341e5d38936762: 根据提交的版本号进行版本的回退
  5. git reflog: 查看命令历史,以便确定要回到未来的哪个版本。
  6. git checkout -- readme.txt: 让这个文件回到最近一次git commit或git add时的状态。这里是把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
    a. 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
    b. 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
  7. git reset HEAD 文件(readme.txt):
    a. 可以把暂存区的修改撤销掉(unstage),重新放回工作区。若要丢弃工作区的修改,还需要git checkout – readme.txt
    b. git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

分支与合并

  1. git branch dev: 创建一个名称叫dev的分支
  2. git checkout dev: 当前的分支切换为dev分支
  3. git checkout -b dev: 创建一个dev分支,并且切换到dev分支(相当于是是前面两句命令的合并)
  4. git branch: 列出所有分支,当前分支前面会标一个*号
  5. git merge dev: 把dev分支的工作成果合并到当前分支上, git merge命令用于合并指定分支到当前分支
  6. git branch -d dev: 删除dev分支
  7. git branch -D dev: 若dev分支还没合并到所切出来的分支,则git branch -d dev将不能删除dev分支,可以通过git branch -D dev强行删除dev分支
  8. git log --graph: 查看分支合并图 git log --graph --pretty=oneline --abbrev-commit
  9. git merge --no-ff -m "备注的信息" dev: 将dev分支合并到当前分支的时候强制禁用Fast forward模式
    a. 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
    b. 合并分支时,加上–no-ff 参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward 合并就看不出来曾经做过合并。
  10. git branch -r: 查看远程分支
  11. git branch -a: 查看所有分支(会显示本地分支和远程分支)

标签 tag

  1. git tag: 列出所有 tag
  2. git add tag xxxx: 新建一个tag
  3. git push --tags: 推送tag到远程

git多账号的使用/体验

  1. 生成 ssh key

    1
    2
    ssh-keygen -t rsa -C "your-email-address1"
    ssh-keygen -t rsa -C "your-email-address2"
  2. 将key添加到ssh agent上

    1
    ssh-add ~/.ssh/id_rsa ssh-add ~/.ssh/id_rsa_2
阅读全文 »
1…3456

kysonyangs

kysonyangs个人站,备忘

54 日志
13 标签
GitHub
© 2015 — 2020 kysonyangs
由 Hexo 强力驱动 v3.7.1
|
主题 — NexT.Mist v6.3.0