1、UITabBar 在ipad上显示图片和文字上下不对称以及UITabBarItem不均等分布时候要用到一下方法
swift 方法
extension UITabBar {
override open var traitCollection: UITraitCollection {
if UIDevice.current.userInterfaceIdiom == .pad {
return UITraitCollection(horizontalSizeClass: .compact)
}
return super.traitCollection
}
}
OC方法
- (UITraitCollection *)traitCollection {
return [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassUnspecified];
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
self.tabBar.itemPositioning = UITabBarItemPositioningCentered;
}
iOS 11以后,iPad上的tababr从竖排变成了横排,虽然不是bug,但谁叫老板觉得不好看那。
首先我的机器是iPad air 12.4
解决方案:
在我的tabbarcontroller中重写UITrationCollection,代码如下:
- (UITraitCollection *)traitCollection
{
UITraitCollection *curr = [super traitCollection];
UITraitCollection *compact = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
return [UITraitCollection traitCollectionWithTraitsFromCollections:@[curr, compact]];
}
2、iOS 动态绘制渐变色圆环
https://juejin.cn/post/6844903933912023054
https://github.com/TynnPassBy/TYCircleView
3、ios 判断用户密码
密码有如下要求:由数字和字母组成,并且要同时含有数字和字母,且长度要在8-16位之间。
如何分析需求?拆分!这就是软件设计的一般思路了。于是乎,拆分需求如下:
1,不能全部是数字
2,不能全部是字母
3,必须是数字或字母
只要能同时满足上面3个要求就可以了,写出来如下:
^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$
分开来注释一下:
^ 匹配一行的开头位置
(?![0-9]+$) 预测该位置后面不全是数字
(?![a-zA-Z]+$) 预测该位置后面不全是字母
[0-9A-Za-z] {8,16} 由8-16位数字或这字母组成
$ 匹配行结尾位置
注:(?!xxxx) 是正则表达式的负向零宽断言一种形式,标识预该位置后不是xxxx字符。
/**
* @author KaKa, 15-07-31 14:07:02
*
* 判断用户输入的密码是否符合规范,符合规范的密码要求:
1. 长度大于8位
2. 密码中必须同时包含数字和字母
*/
+(BOOL)judgePassWordLegal:(NSString *)pass{
BOOL result = false;
if ([pass length] >= 8){
// 判断长度大于8位后再接着判断是否同时包含数字和字符
NSString * regex = @"^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
result = [pred evaluateWithObject:pass];
}
return result;
}
4、ios NFNetworking 网络请求验证SSL安全验证即Https请求
(1)、AFSecurityPolicy
安全模式设置
AFSecurityPolicy是AFNetworking中三种安全策略模块,提供了证书锁定模式
-
AFSSLPinningModeNone
:完全信任服务器证书; -
AFSSLPinningModePublicKey
:只比对服务器证书和本地证书的Public Key是否一致,如果一致则信任服务器证书; -
AFSSLPinningModeCertificate
:比对服务器证书和本地证书的所有内容,完全一致则信任服务器证书;
选择那种模式呢? AFSSLPinningModeCertificate
最安全的比对模式。但是也比较麻烦,因为证书是打包在APP中,如果服务器证书改变或者到期,旧版本无法使用了,我们就需要用户更新APP来使用最新的证书。 AFSSLPinningModePublicKey
只比对证书的Public Key,只要Public Key没有改变,证书的其他变动都不会影响使用。 如果你不能保证你的用户总是使用你的APP的最新版本,所以我们使用AFSSLPinningModePublicKey
。
是否信任过期证书
是否信任非法证书,默认是NO。
/**
默认值是No,不信任过期证书
*/
@property (nonatomic, assign) BOOL allowInvalidCertificates;
是否验证域名
是否校验证书中DomainName字段,它可能是IP,域名如*.google.com,默认为YES,严格保证安全性。
/**
验证域名是否和证书Common Name一致,默认值是YES
*/
@property (nonatomic, assign) BOOL validatesDomainName;
2、AFNetworking实现
创建自定义安全策略
// 自定义安全策略
- (AFSecurityPolicy *)customSecurityPolicy {
// 获取证书
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"github2020" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
NSSet *pinnedCertificates = [[NSSet alloc] initWithObjects:certData, nil];
/*
安全模式
AFSSLPinningModeNone:完全信任服务器证书;
AFSSLPinningModePublicKey:只比对服务器证书和本地证书的Public Key是否一致,如果一致则信任服务器证书;
AFSSLPinningModeCertificate:比对服务器证书和本地证书的所有内容,完全一致则信任服务器证书
*/
AFSecurityPolicy *securityPolicy =
[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey
withPinnedCertificates:pinnedCertificates];
// allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
// 如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;
/*
validatesDomainName 是否需要验证域名,默认为YES;
假如证书的域名与你请求的域名不一致,需把该项设置为NO;
如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。
因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;
当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
如置为NO,建议自己添加对应域名的校验逻辑。
*/
securityPolicy.validatesDomainName = YES;
return securityPolicy;
}
创建网络会话管理
- (AFHTTPSessionManager *)manager {
if (!_manager) {
// 设置BaseUrl
NSURL *baseUrl = [NSURL URLWithString:@"https://github.com"];
AFHTTPSessionManager *manager =
[[AFHTTPSessionManager manager] initWithBaseURL:baseUrl];
manager.securityPolicy = [self customSecurityPolicy];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
_manager = manager;
}
return _manager;
}
发送请求
// 发送请求
- (void)sendRequest {
NSString *urlStr = @"https://github.com/AFNetworking/AFNetworking";
[self.manager GET:urlStr
parameters:nil
headers:nil
progress:nil
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSString *str = [[NSString alloc] initWithData:responseObject
encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@", error);
}];
}