0%

判断View是否显示在当前窗口

写一个分类

1
2
3
4
5
6
7
#import <UIKit/UIKit.h>

@interface UIView (VCHFrame)

- (BOOL)isShowingOnKeyWindow;

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (BOOL)isShowingOnKeyWindow {
UIWindow *window = [UIApplication sharedApplication].keyWindow;
CGRect newRect = [window convertRect:self.frame fromView:self.superview];
BOOL intersects = CGRectIntersectsRect(newRect, window.bounds);
return intersects && !self.isHidden && (self.alpha > 0.01) && (self.window == window);
}
~~~

### 判断控制器是否显示到当前窗口
可以用一种简单的方法,判断view是否已经加载,再判断window是否存在。用这两个条件正常情况下都可以判断出来。
**这种方法不是绝对的。**

~~~ objc
- (BOOL)isShowing {
return self.isViewLoaded && self.view.window;
}

坐标转变方法

CGRect newRect = [view1 convertRect:view2.frame toView:view3];
CGRect newRect = [view3 convertRect:view2.frame fromView:view1];

view1:view2的父类(view2的frame相对的坐标系的view)
view2:需要转换坐标的view
view3:转换后坐标所在的view

前言

学习下怎样将自己的代码上传到CocoaPods

1.在GitHub上创建新的仓库,并clone到本地

此时将库文件但放到一个单独的文件夹内,并将相关的演示Demo写好。

2.创建podspec文件

1
2
cd path****
pod spec create VCHKit

3.修改podspec文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
s.name         = "VCHKit"
s.version = "0.0.1"
s.summary = "this is summary"
s.description = <<-DESC
this is description
DESC
s.homepage = "https://github.com/vhuichen/VCHKit"
s.license = "MIT"
s.author = { "vhuichen" => "vhuichen@163.com" }
s.platform = :ios, "8.0"
s.source = { :git => "https://github.com/vhuichen/VCHKit.git", :tag => "#{s.version}" }
s.source_files = "VCHMapKit/*.{h,m}", "VCHMapKit/XXXX/*.{h,m}"
s.frameworks = "UIKit"
s.requires_arc = true

*注意:描述description必须填写,并且不能和summary相同

验证pod

1
pod lib lint

如果验证成功则会显示成功信息
VCHMapKit passed validation.

4.提交库到CocoaPods trunk

如果没有注册,则先注册trunk

1
pod trunk register vhuichen@163.com 'vhuichen'  --verbose

向trunk服务器查询自己的注册信息

1
pod trunk me

打上和GitHub上相同的tag

1
2
set the new version to 0.0.1
set the new tag to 0.0.1

5.提交代码到GitHub

将代码提交到GitHub后,再打上tag

1
2
git tag 0.0.1   
git push --tags

6.上传或更新trunk

1
pod trunk push

7.出现的问题

1、Unable to find a pod with name, author, summary, or description matching VCHMapKit
解决方法,先删除缓存,然后在重新搜索

1
2
rm ~/Library/Caches/CocoaPods/search_index.json
pod search VCHMapKit

前言

这个问题花了我2天的时间没解决,记下来!

项目需求

由于项目需要定制化,需要在原来的项目上修改部分图片以及部分接口,然后上一个新的APP。于是想到用Target来实现。copy一个新的Target。

编译后,发现旧的Target编译成功,而新创建的Target编译失败。
报错提示:

Command failed due to signal: Segmentation fault: 11

在文件上方提示:

An internal error occurred.Editing functionality may be limited
An internal error occurred. Soucre Editor functionality is limited,Attempting to restore

Xcode版本:8.3.3

解决方法

rm -rf ~/Library/Developer/Xcode/DerivedData/

或者

Xcode –> Preferences –> Location –> DerivedData

点进路径链接后,删除里面的所有内容

使用上面的方法可以解决问题,但是。。。。
当我修改了Swift的代码后问题又出现了同样的问题(Swift类中添加一个新的空函数),编译报错:

Command failed due to signal: Segmentation fault: 11

但这种情况只有copy的Target会出现,原来的Target编译通过,代码是没有问题的,只能重新删除DerivedData里面的数据

相关连接

stackoverflow相关问题
但是很遗憾无法从根本上解决这个问题

总之

这是一个奇葩的问题
1、为什么旧的Target没有问题,新的Target就有问题?
2、多个Target下 Objective-C Generated Interface Header Name 中设置的名称要不要一样,如果一样的话,是不是对应同一个文件?
3、为什么修改了Swift文件后,编译出错?(语法没问题)

前言

项目有个需求,比较两个字符串的大小,百度一下发现这个方法,记录下来!

代码

方法名

1
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;

代码实现:

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

NSString *str0 = @"F0FF23FF";
NSString *str1 = @"F0FF023FF";
NSLog(@"%@ compare %@ == %zd", str0, str1, [str0 compare:str1 options:NSNumericSearch]);
//log : F0FF23FF compare F0FF023FF == 0
//理解:compare方法内部可以理解为把两个字符串拆分成
//F0FF23FF --> F 0 FF 23 FF
//F0FF023FF --> F 0 FF 023 FF
//结果等于:0(两者相等)
//说明这个方法会将相邻的数字当成一个整体

str0 = @"E0FF23FF";
str1 = @"F0FF23FF";
NSLog(@"%@ compare %@ == %zd", str0, str1, [str0 compare:str1 options:NSNumericSearch]);
//log : E0FF23FF compare F0FF23FF == -1
//理解:compare方法内部可以理解为把两个字符串拆分成
//E0FF23FF --> E 0 FF 23 FF
//F0FF23FF --> F 0 FF 23 FF
// E < F , 结果等于:-1(前者小于后者)
//说明非数字也会进行比较

str0 = @"EF0FF23FF";
str1 = @"F0FF23FF";
NSLog(@"%@ compare %@ == %zd", str0, str1, [str0 compare:str1 options:NSNumericSearch]);
//log : EF0FF23FF compare F0FF23FF == -1
//理解:compare方法内部可以理解为把两个字符串拆分成
//EF0FF23FF --> EF 0 FF 23 FF
//F0FF23FF --> F 0 FF 23 FF
//从左到右进行比较,E < F , 结果等于:-1(前者小于后者)
//说明此处是将"EF"中的"E" 和 "F" 比较,非数字不当成一个整体

str0 = @"E1FF23FF";
str1 = @"F0FF23FF";
NSLog(@"%@ compare %@ == %zd", str0, str1, [str0 compare:str1 options:NSNumericSearch]);
//log : E1FF23FF compare F0FF23FF == -1
//理解:compare方法内部可以理解为把两个字符串拆分成
//E0FF23FF --> E 1 FF 23 FF
//F0FF23FF --> F 0 FF 23 FF
//说明从左到右开始判断,数字有没优先权

str0 = @"1";
str1 = @".1";
NSLog(@"%@ compare %@ == %zd", str0, str1, [str0 compare:str1 options:NSNumericSearch]);
//log : 1 compare .1 == 1
//理解:compare方法内部可以理解为把两个字符串拆分成
//1 --> 0 1
//.1 --> . 1
//空格处应该不补充了一个数字,"."的ASCII码小于补充数字0的ASCII码。结果等于:1(前者大于后者)

str0 = @"1";
str1 = @":1";
NSLog(@"%@ compare %@ == %zd", str0, str1, [str0 compare:str1 options:NSNumericSearch]);
//log : 1 compare :1 == -1
//1 --> 0 1
//.1 --> : 1
//空格处应该不补充了一个数字,":"的ASCII码大于补充数字0的ASCII码。结果等于:-1(前者小于后者)

总结

NSNumericSearch options 会将相邻数字作为一个整体,然后两个字符串的数字整体左对齐,首位补0后进行比较。
(以上结论纯属个人理解🙂)

控制器结构图


设置

self.navigationItem.title = “123”

运行,但设置的navigationItem.title并没有显示出来。

查找问题

打开Debug View Hierarchy(视图层次结构调试),可以看到下面的结构图
左边:

右边:

可以看到总共有两个UINavgationBar,我们自己设置title并没有显示到顶层(被遮住了),所以会看不到设置的title。

解决方法1

将第一个Navigation Controller删掉,Tab Bar Controller 直接作为根控制器,如下图:

还有其他的方法一样也是可以解决的。

0.前言

有些项目不想公开,但使用GitHub Desktop比较方便,于是尝试看看能否通过GitHub Desktop管理别的远程仓库,还好找到了,记下来。

1.假设当前已经安装好GitHub Desktop

2.以coding为例子,在coding上创建新的仓库

3.打开终端,cd到指定的目录。使用命令 git clone 将远程仓库clone下来。

git clone https://git.coding.net/xxxxxx/xxx.git

4.打开GitHub Desktop 点击右上角的“➕”号,选中add,Choose刚才clone的项目,确定。

5.完成,至此可以通过GitHub Desktop操作这个仓库了。

创建NSString的分类,用来获取字符串的字节长度
用两种方法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//
// NSString+VCHProperty.h
// SmartWatch
//
// Created by chenhui on 2016/11/22.
// Copyright © 2016年 vhuichen. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSString (VCHProperty)

- (NSUInteger)convertToByteLength;
- (NSUInteger)asciiLength;

@end

实现方法

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
//
// NSString+VCHProperty.m
// SmartWatch
//
// Created by chenhui on 2016/11/22.
// Copyright © 2016年 vhuichen. All rights reserved.
//

#import "NSString+VCHProperty.h"

@implementation NSString (VCHProperty)

- (NSUInteger)convertToByteLength {
NSUInteger selfLength = 0;
char *p = (char *)[self cStringUsingEncoding:NSUnicodeStringEncoding];
NSUInteger encodingLength = [self lengthOfBytesUsingEncoding:NSUnicodeStringEncoding];
for (int i = 0; i < encodingLength; i++) {
if (*p) {
selfLength++;
}
p++;
}
return selfLength;
}

- (NSUInteger)asciiLength {
NSUInteger selflLength = 0;
for (int i = 0; i < self.length; i++) {
unichar uc = [self characterAtIndex:i];
selflLength += isascii(uc) ? 1 : 2;
}
return selflLength;
}

@end

经测试两种方法都可以获取到字符串的字节长度

序言

早前,上班时发现刚刚搭建好的本地SVN服务器无法连接 O(∩_∩)O~一脸懵逼,打开活动监视器发现SVN服务并没有自动开启,手动开启后发现还是不能连接,查看IP地址后才明白,IP是自动获取的啊,亲!so,先将IP改为手动分配,so easy。然后。。。。

在命令行新建.sh文件

需要路径可以自己加上去

vi SVNServe.sh

或者

touch SVNServe.sh

修改文件权限

具体怎么改比较合适不清楚,反正直接777肯定没问题

chmod 777 SVNServe.sh

编辑.sh文件

加入以下内容

#!/bin/bash
svnserve -d -r ~/svn

#!/bin/bash 表示用根目录bin文件夹下的bash来解析这个脚本(bash是shell的一种)**#!是特殊的表示符,据说一定要放在文件的第一行才起作用。不管,没试**。
svnserve -d -r ~/svn 就是开启SVN服务器的命令,表示要执行这条指令。
~/svn表示在用户根目录下svn这个文件夹下开启SVN服务

添加自启动项

进入系统偏好设置->用户与群组->登录项,点击+号,添加上面编辑好的.sh文件。

注意:不要在隐藏栏中打钩
Alt text

以上

搞定。。。。。。

#备注
将Mac的ID地址改为手动获取,防止下次开机IP地址改变