日期: 2021 年 8 月 24 日

iOS常用方法——一个好用的获取导航栏高度和Tabbar高度的分类

开发中经常需要知道导航栏(系统)的高度和Tabbar的高度,一般是用来计算在ViewController中的位置和高度,我们可以写一个UIVIewController的分类,这样在调用的时候就很方便。代码如下:

#import “UIViewController+MYViewControllerBar.h”

@implementation UIViewController (MYViewControllerBar)

-(float)mStatusbarHeight{
//状态栏高度
return [[UIApplication sharedApplication] statusBarFrame].size.height;
}

-(float)mNavigationbarHeight{
//导航栏高度+状态栏高度
return self.navigationController.navigationBar.frame.size.height + [[UIApplication sharedApplication] statusBarFrame].size.height;
}

-(float)mTabbarHeight{
//Tabbar高度
return self.tabBarController.tabBar.bounds.size.height;
}

@end

iOS常用方法——URL编码和URL解码

URL编码是一种常见的编码方式,作用不多说,直接上代码。

URL编码:
– (NSString *)URLEncodedString
{
// CharactersToBeEscaped = @”:/?&=;+!@#$()~’,*”;
// CharactersToLeaveUnescaped = @”[].”;

NSString *unencodedString = self;
NSString *encodedString = (NSString *)
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)unencodedString,
NULL,
(CFStringRef)@”!*'();:@&=+$,/?%#[]”,
kCFStringEncodingUTF8));

return encodedString;
}

URL解码:
– (NSString *)URLDecodedString
{
NSString *result = [(NSString *)self stringByReplacingOccurrencesOfString:@”+” withString:@” “];
return [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}

建议这两个方法放在NSString的分类中,并且声明为实例方法,这样可以直接用NSString的对象去调用。
– 调用示例:

NSString * string = @”zhansan啦啦啦啦1234567″;
NSString * urlEncode = [string URLEncodedString];
NSString * urlDecode = [string URLDecodedString];
NSLog(@”urlEncode == %@”,urlEncode);
NSLog(@”urlDecode == %@”,urlDecode);

打印结果:
urlEncode == zhansan%E5%95%A6%E5%95%A6%E5%95%A6%E5%95%A61234567
urlDecode == zhansan啦啦啦啦1234567

可见URL编码只对中文部分进行了编码。

iOS UIView的圆角加阴影效果的实现

*近项目的界面都要改成卡片的形式,即需要投影的效果,还要削出圆角,我们都知道削圆角一般有两种方式,一种是直接用layer.cornerRadius来设置,我们知道的一般都是下面两行代码一起使用来实现圆角:

self.layer.cornerRadius = 10;
self.layer.masksToBounds=YES;
1
2
但是只要self.layer.masksToBounds=YES;有这句,投影的效果就出不来。
还有一种性能比较好的圆角设置方式,就是用UIBezierPath来设置,我试过用这个来设置圆角的话,投影一样也出不来。
还有在网上看到了加一层layer的,大体思路就是self.layer来设置圆角,新写一个layer来设置投影,然后把layer放到self.layer上,我试了之后发现没什么效果,而且偏移会很明显的看出来,但不是以投影的方式出现。
然后又找到了一篇文章,给出的方法代码如下:

@implementation TPShadowView

-(instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = kUIColorFromRGB(0x4b4773);
//v.layer.masksToBounds=YES;这行去掉
self.layer.cornerRadius = 10;
self.layer.shadowColor = kUIColorFromRGB1(0x000000, 1).CGColor;
self.layer.shadowOffset = CGSizeMake(2, 5);
self.layer.shadowOpacity = 0.5;
self.layer.shadowRadius = 5;

}
return self;
}

这个是我整理之后的写了个投影的view类,方便使用,核心就是注释着这行去掉的这个,当时看的时候,觉得有点不敢相信,但是那个博主给了投影效果,我就抱着试一下的心态写了,没想到还真的可以。。。
效果如图:

%title插图%num

真的是万万没想到啊,万分感谢那篇文章的博主啊~~

Mac下使用终端查看某个端口号对应的进程和杀死进程

查看端口号对应的进程
打开终端,输入lsof -i tcp:port,port即为端口号,如5037
如果端口号未被占用,回车之后结果如图:

%title插图%num

如果端口号被占用,则会出现占用该端口号的进程和进程的id,举个例子:

%title插图%num

这样我们就可以根据进程id来杀死进程了。

杀死端口号对应的进程
如果某个端口号正在被使用,使用上面的命令就可以查看到具体的进程,想要杀死这个端口号对应的进程,就需要用到命令:kill PID 进程id,PID就是上面我们查到的的PID。
下面是杀死5037端口号对应的进程的操作:

%title插图%num

*后可以看到,5037端口对应的进程是空的,也就是5037端口号未被占用。

iOS几种动画效果的实现

做过一个项目,里面涉及到的动画效果比较多,在这里做个小小的总结。

直线动画效果
实现一个物体在某段时间从一个点移动到另一个点。
效果如下:

动画相关代码如下:
动画模型:

@interface AnimationModel : NSObject

@property(nonatomic,strong) NSArray * images;
@property(nonatomic,assign) float fromX;
@property(nonatomic,assign) float fromY;
@property(nonatomic,assign) float toX;
@property(nonatomic,assign) float toY;
@property(nonatomic,assign) BOOL loop;
@property(nonatomic,assign) float time;

@end

 

动画实现:

-(void)addSingleLineAnimationToView:(UIView *)view animationModel:(AnimationModel *)model{
CABasicAnimation* moveAnimation = [CABasicAnimation animationWithKeyPath:@”position”];
moveAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(model.fromX,model.fromY)];
moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(model.toX,model.toY)];
moveAnimation.duration = model.time;
moveAnimation.removedOnCompletion = NO;
moveAnimation.repeatCount = MAXFLOAT;
if (model.loop == 0) {
moveAnimation.repeatCount = 1;
}
[view.layer addAnimation:moveAnimation forKey:@”singleLineAnimation”];
}

 

爆炸点赞动画效果
效果有点像撒花,效果如下:

这个效果的实现也是我在网上找到的,封装了一个View和一个button,调用很方便,下面我贴一下调用的代码,后面会给出完整代码的地址。
调用代码:

-(BZFireworkAnimationButton *)praiseButton{
if (!_praiseButton) {
_praiseButton = [[BZFireworkAnimationButton alloc] initWithFrame:CGRectMake(150, 200, 50, 50)];
_praiseButton.particleImage = [UIImage imageNamed:@”button_bulletin_board_collected”];
_praiseButton.particleScale = 0.05f;
_praiseButton.particleScaleRange = 0.02f;
[_praiseButton addTarget:self action:@selector(praiseAction:) forControlEvents:UIControlEventTouchUpInside];
[_praiseButton setImage:[UIImage imageNamed:@”button_bulletin_board_uncollect”] forState:UIControlStateNormal];
[_praiseButton setImage:[UIImage imageNamed:@”button_bulletin_board_collected”] forState:UIControlStateSelected];
}
return _praiseButton;
}

-(void)praiseAction:(BZFireworkAnimationButton *)button{
if (button.selected) {
[button popInsideWithDuration:0.4f];
}else{
[button popOutsideWithDuration:0.4];
[button animate];
}
button.selected = !button.selected;
}

 

心跳(放大缩小)动画效果
效果如下:

实现代码:

-(void)setupHeartbeatAnimationInView:(UIView *)view{
// 设定为缩放
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@”transform.scale”];
// 动画选项设定
animation.duration = 1.2; // 动画持续时间
animation.repeatCount = 10000000000; // 重复次数
animation.autoreverses = YES; // 动画结束时执行逆动画
// 缩放倍数
animation.fromValue = [NSNumber numberWithFloat:1.0]; // 开始时的倍率
animation.toValue = [NSNumber numberWithFloat:1.4]; // 结束时的倍率
animation.removedOnCompletion = NO;
// 添加动画
[view .layer addAnimation:animation forKey:@”scale-layer”];
}

 

上下浮动效果
效果如下:

代码实现如下:

@interface FloatViewController ()

//判断是否是当前ViewController,如果不是,则停止动画,否则动画一直在,且dealloc方法不会被调用
@property(nonatomic,assign) BOOL isCurrentVC;
@end

@implementation FloatViewController

– (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor orangeColor];

UIImageView * animationImageView = [[UIImageView alloc] initWithFrame:CGRectMake(30, 105, 144, 350)];
animationImageView.image = [UIImage imageNamed:@”image_city_angel_login_girl”];
[self setAnimationImageViewAnimation:animationImageView];
[self.view addSubview:animationImageView];
}

-(void)dealloc{
NSLog(@”FloatViewController dealloc”);
}

-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.isCurrentVC = YES;
}

-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
self.isCurrentVC = NO;
}

-(void)setAnimationImageViewAnimation:(UIImageView *)animationImageView{
[UIView animateWithDuration:1 animations:^{
animationImageView.frame = CGRectMake(30, 90, 144, 350);
}];
[UIView animateWithDuration:1 delay:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
animationImageView.frame = CGRectMake(30, 105, 144,350);

} completion:^(BOOL finished) {
if (self.isCurrentVC) {
[self setAnimationImageViewAnimation:animationImageView];
}
}];

}

 

这个动画效果有一点需要注意的就是需要手动停止,*好离开该页面的时候就手动让它停止,否则会造成内存泄漏。如果是push到下级页面,手动停止了动画,回到该页面时还需要动画启动的话,可以给动画的view一个tag值,然后在viewWillAppear中调用一下setAnimationImageViewAnimation方法。

图片序列gif效果
开发中经常遇到动图的效果,如果美术给的是gif图,那么可以使用SDWebImage中的方法进行播放,如果给的是图片序列,我们可以用UIImageView自带的属性来实现。
效果如下:

使用UIImageView自带属性实现代码如下:

NSArray * images = @[@”gif_ferriswheel1″,@”gif_ferriswheel2″,@”gif_ferriswheel3″,@”gif_ferriswheel4″,@”gif_ferriswheel5″,@”gif_ferriswheel6″];
UIImageView * imageViews = [[UIImageView alloc] init];
UIImage * image = [UIImage imageNamed:images[0]];
imageViews.frame = CGRectMake(120, 200, image.size.width, image.size.height);
NSMutableArray * imagesArray = [NSMutableArray array];
for (NSString * imagesName in images) {
UIImage * tempImage = [UIImage imageNamed:imagesName];
[imagesArray addObject:tempImage];
}
imageViews.animationImages = [imagesArray copy];
imageViews.animationDuration = 0.9;
imageViews.animationRepeatCount = 1000000000;
[imageViews startAnimating];
[self.view addSubview:imageViews];

这种方式需要注意的是animationImages这个数组里面的对象是UIImage,所以千万不要把图片名称的数组直接赋值,会造成崩溃。

直线+Gif效果
图片既有位移的改变,又在改变位移的同时自身在变,比如一个人走路。
效果如图:

实现动画主要代码如下:

-(void)initData{
NSString * jsonPath = [[NSBundle mainBundle] pathForResource:@”animation” ofType:@”json”];
NSData * data = [NSData dataWithContentsOfFile:jsonPath];
NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSArray * lineGifArray = dic[@”walk_animation”];
self.lineGifArray = [NSMutableArray array];
for (NSDictionary * item in lineGifArray) {
AnimationModel * model = [[AnimationModel alloc] init];
[model setValuesForKeysWithDictionary:item];
[self.lineGifArray addObject:model];
}
}

-(void)setupLineGifAnimation{
for (AnimationModel * model in self.lineGifArray) {
UIImageView * animationImageView = [[UIImageView alloc] init];
animationImageView.image = [UIImage imageNamed:model.images[0]];
animationImageView.frame = CGRectMake(model.toX, model.toY, animationImageView.image.size.width, animationImageView.image.size.height);
NSMutableArray * imagesArray = [NSMutableArray array];
for (NSString * imagesName in model.images) {
UIImage * tempImage = [UIImage imageNamed:imagesName];
[imagesArray addObject:tempImage];
}
animationImageView.animationImages = [imagesArray copy];
animationImageView.animationDuration = 1.2;
animationImageView.animationRepeatCount = 1000000000;
[animationImageView startAnimating];
[self.view addSubview:animationImageView];
[self addSingleLineAnimationToView:animationImageView animationModel:model];
}
}

-(void)addSingleLineAnimationToView:(UIView *)view animationModel:(AnimationModel *)model{
CABasicAnimation* moveAnimation = [CABasicAnimation animationWithKeyPath:@”position”];
moveAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(model.fromX,model.fromY)];
moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(model.toX,model.toY)];
moveAnimation.duration = model.time;
moveAnimation.removedOnCompletion = NO;
moveAnimation.repeatCount = MAXFLOAT;
if (model.loop == 0) {
moveAnimation.repeatCount = 1;
}
[view.layer addAnimation:moveAnimation forKey:@”lineGifAnimation”];
}

这个动画效果涉及到两个时间,一个位移从起点到终点的时间和一个完成一套动作的时间,这两个时间需要去调才能做出*自然的效果,我这里提供的是思路,两个时间没有花时间去调,请见谅~

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速