最近刚完成了公司的一个项目,现在进入了改bug阶段,稍微闲了下来,对项目进行一些知识点的总结吧。都是些琐碎的点,因为自己之前没用到,现在记录下来,方便以后查阅。
1.label的宽高自适应
{
NSString *tempString = [NSString stringWithFormat:@"这是测试的string>>%@", self.viewModel.tempString];
CGSize size = [self sizeWithText:tempString font:[UIFont systemFontOfSize:18] maxSize:CGSizeMake(MAXFLOAT, MAXFLOAT)];
self.timesLabel.text = tempString;
self.timesLabel.frame.size.width = size.width + 20;
self.timesLabel.frame.size.height = size.height + 10;
}
2.图片动画CABasicAnimation的使用
这个主要是参考另外一位同学的总结“CABasicAnimation使用总结
”。
需要注意的点是:
- 给视图添加动画时,移动的不是视图本身,而是添加在视图上的 presentation layer的一个缓存,最后需要移除;
- 添加组合动画,给动画设置key-value加以区分;
- CAAnimation的delegate是strong类型,容易产生循环引用,可以声明一个单独的类去实delegate的回调。
- 一些常用的animationWithKeyPath值的总结
值 | 说明 | 使用形式 |
---|---|---|
transform.scale | 比例转化 | @(0.8) |
transform.scale.x | 宽的比例 | @(0.8) |
transform.scale.y | 高的比例 | @(0.8) |
transform.rotation | 围绕中心点旋转 | @(M_PI) |
transform.rotation.x | 围绕x轴旋转 | @(M_PI) |
transform.rotation.y | 围绕y轴旋转 | @(M_PI) |
transform.rotation.z | 围绕z轴旋转 | @(M_PI) |
cornerRadius | 圆角的设置 | @(50) |
backgroundColor | 背景颜色的变化 | (id)[UIColor purpleColor].CGColor |
bounds | 大小,中心不变 | [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)]; |
position | 位置(中心点的改变) | [NSValue valueWithCGPoint:CGPointMake(300, 300)]; |
contents | 内容,比如UIImageView的图片 | imageAnima.toValue = (id)[UIImage imageNamed:@"to"].CGImage; |
opacity | 透明度 | @(0.7) |
contentsRect.size.width | 横向拉伸缩放 | @(0.4)最好是0~1之间的 |
3.iOS的cookie管理
该项目的登录信息后台是放在cookie中返回的,后面需要登录才能访问的接口也是后台根据登录返回的cookie信息去判断,在iOS中,应用退出,会话结束的时候,Cookies是默认被丢弃的,而浏览器默认是保存的。这就导致了每次退出APP再进来,访问需要登录信息的接口是,会提示没有权限,请重新登录。解放方法:
1.对最近一次登录的账号密码做持久化保存,每次打开APP做一次自动登录的操作。在此不做细表。
2.对登录返回的cookie进行修改,更改cookie的过期时间,每次登录再去更新cookie信息。
/**
* 更改cookie保存时间(登录后调用该方法)
*/
- (void)saveLoginCookie
{
NSArray<NSHTTPCookie *> *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
// NSMutableArray<NSDictionary *> *propertiesList = [[NSMutableArray alloc] init];
[cookies enumerateObjectsUsingBlock:^(NSHTTPCookie * _Nonnull cookie, NSUInteger idx, BOOL * _Nonnull stop) {
NSMutableDictionary *properties = [[cookie properties] mutableCopy];
//将cookie过期时间设置为一年后
NSDate *expiresDate = [NSDate dateWithTimeIntervalSinceNow:3600*24*30*12];
properties[NSHTTPCookieExpires] = expiresDate;
//下面一行是关键,删除Cookies的discard字段,应用退出,会话结束的时候继续保留Cookies
[properties removeObjectForKey:NSHTTPCookieDiscard];
//重新设置改动后的Cookies
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:[NSHTTPCookie cookieWithProperties:properties]];
}];
}
但我总觉得这个设计有点问题,我上面的方法是把cookie的过期时间设置为了1年,意思是我登录了APP后,即便我每天都打开使用,一年后,它突然说我退出登录的,要我重新登录,虽然一年登录一次,并不会感觉到什么,但,还是有点不合理吧0.0。
4.转盘抽奖
先上效果图吧。


图中的奖品图片,文字描述都做了一定角度的旋转,这个其实没啥,附一个传送门:view的环形分布。主要是找了一个image的工具类,很全很实用,这里跟大家分享一下。照旧,传送门:UIImage工具

5.图片的局部拉伸
项目首页底部有个填充图片,当用户拉倒底部了,图片出现,继续往上拉,图片的局部就会被拉伸,类似于橡皮人路飞的手被不断拉长,效果如下。实现方法,主要是图片的局部拉伸

UIImage *originImage = [UIImage imageNamed:@"bottomImage"]; //203 * 64
UIImage *newImage = [originImage
//UIEdgeInsetsMake(上, 左, 下, 右), resizingMode:平铺还是拉伸
resizableImageWithCapInsets:UIEdgeInsetsMake(55, 0, 0, 0) resizingMode:UIImageResizingModeStretch];
self.bottomImageView.image = newImage;
capInsets
定义图片的不拉伸范围
(这个范围是相对于源图片大小而言),resizingMode定义了图片以拉伸/平铺的方式变换。在设置了四周的不拉伸范围后,中间的蓝色部分
将会以 拉伸/平铺的方式 被拉伸,是拉伸范围
。

6.关于图片的两个方法
//获取gif中的图片
-(NSArray *)getImagesFromGIF:(NSString *)gifName {
NSURL *gifImageUrl = [[NSBundle mainBundle]URLForResource:gifName withExtension:@"gif"];
//获取Gif图的原数据
CGImageSourceRef gifSource = CGImageSourceCreateWithURL((CFURLRef)gifImageUrl, NULL);
//获取Gif图有多少帧
size_t count = CGImageSourceGetCount(gifSource);
NSMutableArray *images = [[NSMutableArray alloc] init];
for (NSInteger i = 0; i < count; i++) {
//生成一张CGImageRef类型的图片
CGImageRef imageRef = CGImageSourceCreateImageAtIndex(gifSource, i, NULL);
UIImage *image = [UIImage imageWithCGImage:imageRef];
[images addObject:image];
CGImageRelease(imageRef);
}
//得到图片数组
return images;
}
//通过URL获得图片
- (UIImage *)getImageFromURL:(NSString *)fileURL
{
UIImage *targetImage;
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
targetImage = [UIImage imageWithData:data];
return targetImage;
}
7. WKWebView加载HTML
项目中经常会用到webview去展示一下信息,常见的是后台返回一个URL,然后前端只需要
[self.wkWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"后台返回的URL"]]];
但有时候后台又会直接返回一个HTML文本,其实加载方式也是一样
[self.wkWebView loadHTMLString:@"后台返回的HTML文本" baseURL:nil];
但是有时候后台对文本格式没有加以限制就会出现以下这些情况

文字很小,图片问题不大,但也没达到最理想的效果,我们需要加以修改
- 方法一:当然这时候你可以单独修改文字大小,在webview的delegate中执行以下方法
// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
//修改字体大小
[webView evaluateJavaScript:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '250%'" completionHandler:nil];
}
- 方法二:在webview加载HTML的时候,在头部添加CSS样式
- (void)webviewLoadHTML
{
NSString *headerString = @"<header><meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=0.5, user-scalable=no'></header>";
[self.wkWebView loadHTMLString:[headerString stringByAppendingString:@"后台返回的HTML文本"] baseURL:nil];
}
运行看看效果

字体是可以了,但图片,大图会超出屏幕宽度,导致可以左右滑动,体验不好,再次修改
- (void)webviewLoadHTML
{
NSString *headerString = [NSString stringWithFormat:@"<header><style>img{max-width:%fpx !important;height:auto !important;}</style><meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=0.5, user-scalable=no'></header>", kScreenWidth - 20];
[self.wkWebView loadHTMLString:[headerString stringByAppendingString:@"后台返回的HTML文本"] baseURL:nil];
}
运行,图片宽度最大是屏幕宽度减20,高度自适应。完美。

嗯,这次就先写到这里。后续AR再另外开一篇。
网友评论