Yun's Blog

  • Home

  • Archives

快速上传图片到七牛(Alfred+七牛)

Posted on 2018-04-19 | Edited on 2018-10-10 | In Tool

快速上传图片到七牛(Alfred+七牛)

Mac 下可以使用 Alfred 实现快速上传图片到七牛,

需要

  1. Alfred 正式版
  2. 七牛帐号(个人账号就行,有免费空间)。七牛地址

使用方法

  1. 下载插件,按照作者说明安装配置。

注意事项

  1. 复制的文件不能有中文字符,不然上传失败,也无错误信息。大坑,害我重装

UIViewController 生命周期方法与业务逻辑

Posted on 2018-04-18 | Edited on 2019-01-08 | In iOS

UIViewController 生命周期方法与业务逻辑

UIViewController 生命周期的主要包括9个方法:

init

默认初始化

  • 业务逻辑

    可以初始化数据

  • 注意事项

    不要创建 view。不要调用 self.view。因为view是lazyinit的,调用 self.view,会导致viewcontroller创建view。

loadView

加载 view,如果是从 nib 文件或者 stroyboard加载,则加载相关文件,如果没有,则创建默认的 view。

  • 业务逻辑

    不要重载该方法,创建 view 可以在viewDidLoad中

  • 注意事项

    不要创建view。不要调用 self.view。要调用都在 [super loadView]后。

viewDidLoad

加载view完成。

  • 业务逻辑

    创建附加 view,但是 self.view 的 frame 不可用。

  • 注意事项

    该方法可能调用多次。

viewWillApper

view被添加到superview之前,切换动画之前调用。

  • 业务逻辑

    显示前的处理。如键盘弹出,状态条和navigationbar颜色。

  • 注意事项

    此时 View的 frame 不定,不能利用frame的值

viewDidApper

view 已经显示,动画切换完成

  • 业务逻辑

    业务处理 ,可以使用 self.view 的 frame

  • 注意事项

    暂无

viewWillDisapper

view移出之前,还未调用 removeFromSuperView

  • 业务逻辑

    根据具体业务处理

  • 注意事项

    暂无

viewDidDisapper

view移出完成,动画完成。

  • 业务逻辑

    处理view 不显示时的一些业务逻辑。

  • 注意事项

    暂无

viewDidUnload

一般发生在内存警告时,view置为nil

  • 业务逻辑

    可以释放其他view,比如viewcontroller的 self.view上加了一个label,而且这个label是viewcontroller的属性,那么你要把这个属性设置成nil,以免占用不必要的内存,而这个label在viewDidLoad时会重新创建。

  • 注意事项

    暂无

dealloc

销毁时调用

  • 业务逻辑

    移除观察者,定时器等

  • 注意事项

    在 ARC 环境下,不能主动调用 dealloc 方法。

iOS11 适配

Posted on 2018-04-17 | Edited on 2019-01-08 | In iOS

iOS11 适配

1、启动页

如果启动页采用 Launch Imaged Sourc,则需要添加iPhoneX的启动图,不然整个 App 上下将有部分不能显示区域。

启动图的尺寸为:1125*2436px 即:375*812@3x

2、safeArea

iOS11为UIViewController和UIView增加了两个新的属性safeAreaInsets和safeAreaLayoutGuide, 通过这两个属性我们可以获得安全区域的范围,
我们要做的是让那些不能被遮挡的内容和控件在安全区域范围内显示,

  • safeAreaInsets 适用于手动计算.
  • safeAreaLayoutGuide 适用于自动布局.

手动布局

新增方法,用于在 SafeArea 改变时,重新布局

  • (void)viewSafeAreaInsetsDidChange;

3、Masonry

由于引入了 safeArea,需要修改topLayoutGuide 和 bottomLayoutGuide。

1
2
3
4
5
6
7
// 对于
make.top.equalTo(self.topLayoutGuide);
make.bottom.equalTo(self.bottomLayoutGuide);

// 可直接改为
make.top.equalTo(self.view);
make.bottom.equalTo(self.view);

针对 iOS11,可以引入 safeArea

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (@available(iOS 11.0, *)) {
// crash
// make.edges.equalTo(self.view.mas_safeAreaLayoutGuide);

// error: self.view.mas_safeAreaLayoutGuide is self.view.mas_safeAreaLayoutGuideBottom

//ok
make.left.equalTo(self.view.mas_safeAreaLayoutGuideLeft);
make.right.equalTo(self.view.mas_safeAreaLayoutGuideRight);
make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop);
make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom);
} else {
make.edges.equalTo(self.view);
}

新增的 safeArea示例

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view.mas_safeArea).inset(10.0);
}];

[view2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view.mas_safeArea);
make.width.height.equalTo(self.view.mas_safeArea).sizeOffset(CGSizeMake(- 40.0, - 40.0));
}];

[view3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view.mas_safeArea);
make.width.equalTo(self.view.mas_safeArea).sizeOffset(CGSizeMake(- 60.0, - 60.0));
make.height.equalTo(self.view.mas_safeArea).sizeOffset(CGSizeMake(- 60.0, - 60.0));
}];

[leftTopView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(self.view.mas_safeArea);
make.width.height.equalTo(@(size));
}];

[rightTopView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.view.mas_safeAreaRight);
make.top.equalTo(self.view.mas_safeAreaTop);
make.width.height.equalTo(@(size));
}];

[leftBottomView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.view.mas_safeAreaLeft);
make.bottom.equalTo(self.view.mas_safeAreaBottom);
make.width.height.equalTo(@(size));
}];

[rightBottomView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.bottom.equalTo(self.view.mas_safeArea);
make.width.height.equalTo(@(size));
}];

[leftView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.centerY.equalTo(self.view.mas_safeArea);
make.width.height.equalTo(@(size));
}];

[rightView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.view.mas_safeAreaRight);
make.centerY.equalTo(self.view.mas_safeAreaCenterY);
make.width.height.equalTo(@(size));
}];

[topView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.view.mas_safeAreaTop);
make.centerX.equalTo(self.view.mas_safeAreaCenterX);
make.width.height.equalTo(@(size));
}];

[bottomView mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.centerX.equalTo(self.view.mas_safeArea);
make.width.height.equalTo(@(size));
}];

[centerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view.mas_safeArea);
make.width.height.equalTo(@(size));
}];

4、prefersLargeTitles

该属性简单理解为大标题,当设置为 YES 时,导航栏高度将变为:96px,正常情况下为:44px;

应该如果要设置该属性,则需要在实例 Vc 中去获取导航栏的高度。

如:

1
2
self.navigationController.navigationBar.prefersLargeTitles = YES;
self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAutomatic;

5、UITableView

UITableView莫名奇妙的偏移20pt或者64pt,

还有某些界面UITableView的sectionHeader、sectionFooter高度与设置不符的问题。

在iOS11中如果不实现

1
2
- tableView: viewForHeaderInSection: 
- tableView: viewForFooterInSection:

则

1
2
- tableView: heightForHeaderInSection: 
- tableView: heightForFooterInSection:

不会被调用,导致它们都变成了默认高度。
这是因为tableView在iOS11默认使用Self-Sizing,UITableView的estimatedRowHeight、estimatedSectionHeaderHeight、 estimatedSectionFooterHeight三个高度估算属性由默认的0变成了UITableViewAutomaticDimension。

解决办法:

  1. 实现对应的方法

  2. 三个属性设为0。

Objective-C 基础 - 属性

Posted on 2018-04-16 | Edited on 2018-09-26 | In iOS

Objective-C 基础 - 属性(property)

@property

用于声明属性,自动实现属性的读写方法。

属性特质

原子性、读写权限、内存管理语义、方法名、其他。

1、原子性

  • atomic -默认

    占用部分资源、效率一般、线程安全

  • nonatomic

    非原子、效率高、线程不安全

2、读写权限

  • readwrite -默认

    读写

  • readonly

    只读

3、内存管理

MRC时,有assign、retain、copy,ARC加入了strong、weak

  • assign -值类型默认

    简单赋值、用于值类型,如CGFloat、NSInteger等

  • strong (同retain -MRC) -引用类型默认

    强引用、用于引用类型

    赋值时,保留新值,新值引用计数+1,释放旧值(引用计数-1)。

    用于所有的实例变量和局部变量、其他常规对象引用。

    注意:可变对象应该使用strong,如NSMultiString

  • copy

    复制、用于引用类型

    赋值时,拷贝新值(新对象引用计数为1),释放旧值(引用计数-1),不改变新值(引用计数不变)。

    copy的本质为复制该内存所存储的内容,重新创建一个对象赋给其相同的内容,对于实现了NSCopying协议的对象有效。

    用于不可变对象:NSString、block、NSArray、NSDictionary等

    注意:用于可变对象时,设置值后,变为不可变对象

  • weak

    弱引用、用于引用类型

    赋值时、单纯的引用新对象地址,不改变新对象(引用计数不变),不改变旧对象(引用计数不变)

    当引用对象释放后,其值置为nil

  • __unsafe_unretained

    类似assign、适用于引用类型、不安全的弱引用

    功能类似于weak、对象摧毁后,不置nil、不安全,可用weak代替

4、方法名

  • getter=

    1
    2
    >   @property (nonatomic, getter=isOn) BOOL on;
    >
  • setter=

    1
    2
    >   @property (nonatomic, setter=setOnState) BOOL on;
    >

5、其他

nonnull, null_resettable, nullable

Mac 添加自定义脚本

Posted on 2018-03-29 | Edited on 2018-09-26 | In Mac

Mac 添加自定义脚本

将常用的命令做成脚本,添加到 terminal 会大大提高效率。

1、建立脚本文件

建立 xxx.sh 文件,内容为命令,如

1
2
## 添加 spring boot 默认目录
mkdir Controller Dao Entity Service

2、添加快捷键

查看bash文件

1
echo $SHELL

有可能是 ~/.bash_profile、~/.zshrc等,我的是zsh,因此应该添加到~/.zshrc

1
open ~/.zshrc

添加快捷命令,保存文件

alias mkspdir=’.sh文件路径’

重启 terminal,或者更新源

1
source ~/.zshrc

此时即可使用快捷命令执行脚本了。

附:登录的一个脚本例子

1
2
3
4
5
6
7
8
9
##命令登录ssh 用户名@ip
spawn ssh root@xxx.xxx.xxx.xxx
##这里是执行上一步后希望出现的文字提示,通常是密码输入提示
expect "**password:"
##利用send命令,发送你的server密码并回车即可
send "yourpassword\r"

##最后加上允许交互的命令
interact
123

Yun

25 posts
7 categories
20 tags
© 2019 Yun
Powered by Hexo v3.7.1
|
Theme – NexT.Gemini v6.4.1