1:心跳效果,并可去除心跳

- (void)initScaleLayer
{
self.view.backgroundColor=[UIColor blueColor];
UIButton *myTelButtom=[[UIButton alloc]initWithFrame: CGRectMake(, , , )];
UIImage *btnTelImage=[UIImage imageNamed:@"customer_tel_icon"];
[myTelButtom setBackgroundImage:btnTelImage forState:UIControlStateNormal];
[myTelButtom setBackgroundImage:[UIImage imageNamed:@"customer_tel_icon"] forState:UIControlStateHighlighted];
[myTelButtom addTarget:self action:@selector(btnSave:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:myTelButtom]; //设定剧本
CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
scaleAnimation.fromValue = [NSNumber numberWithFloat:1.0];
scaleAnimation.toValue = [NSNumber numberWithFloat:1.2];
scaleAnimation.autoreverses = YES;
scaleAnimation.fillMode = kCAFillModeForwards;
scaleAnimation.repeatCount = MAXFLOAT;
scaleAnimation.duration = 0.8; //开演
[myTelButtom.layer addAnimation:scaleAnimation forKey:@"scaleAnimation"];
} -(void)btnSave:(id)sender
{
UIButton *btn=(UIButton *)sender;
[btn.layer removeAnimationForKey:@"scaleAnimation"]; }

 

2:启动动画效果实现

原理:启动页同样是放一张静态图,只是在启动时再创建一个图片视图把一张跟启动页的图片做动画;如下:

@interface AppDelegate ()

@property (strong,nonatomic) UIImageView *niceView;

@end

@implementation AppDelegate

@synthesize niceView;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window.rootViewController = [[ViewController alloc]init];;
[self.window makeKeyAndVisible]; //圖片擴大淡出的效果开始; //设置一个图片;
niceView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
niceView.tag=;
niceView.image = [UIImage imageNamed:@"launch4.7.png"]; //添加到场景
[self.window addSubview:niceView]; //放到最顶层;
[self.window bringSubviewToFront:niceView]; CABasicAnimation *animation=[CABasicAnimation animationWithKeyPath:@"transform.scale"];
niceView.layer.anchorPoint = CGPointMake(.,.);
animation.fromValue = @1.0f;
animation.toValue = @1.3f;
animation.fillMode=kCAFillModeForwards; animation.removedOnCompletion = NO; [animation setAutoreverses:NO]; //动画时间
animation.duration=0.9;
animation.delegate=self; [niceView.layer addAnimation:animation forKey:@"scale"]; //结束; return YES; } -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
[niceView removeFromSuperview]; }

 

3:计算标签的宽度并计算是否换行显示

-(void)creatUI:(NSMutableArray *)tagArr{

    self.tagArr = [NSMutableArray arrayWithArray:[tagArr mutableCopy]];

    if (self.is_can_addTag) {//如果可以添加标签,那么数组就多一个添加标签按钮
[self.tagArr addObject:self.addTagStr.length>?self.addTagStr:@"添加标签"];
}
tagView_height = ; self.backgroundColor = self.tagViewBackgroundColor?self.tagViewBackgroundColor:[UIColor whiteColor]; previousFrame = CGRectZero; [self.tagArr enumerateObjectsUsingBlock:^(id value, NSUInteger idx, BOOL *stop) { //Tag标题(看传入的是字典还是字符串)
NSMutableString *titleStr = [NSMutableString stringWithString:self.tagStateType==?@" ":@""];
if ([value isKindOfClass:[NSString class]]) {
[titleStr appendString:value];
}else if([value isKindOfClass:[NSDictionary class]]){
if (!self.tagArrkey) {
//获取不到Value,因为没传入Key
NSLog(@"获取不到Value,因为没传入Key");
return ;
}
[titleStr appendString:[value valueForKey:self.tagArrkey]];
} //创建Label
UILabel*tagLabel = [[UILabel alloc]initWithFrame:CGRectZero];
[self creatTagUI:tagLabel];
tagLabel.text = titleStr;
tagLabel.tag = KTapLabelTag+idx; //计算label的大小
NSDictionary *attrs = @{NSFontAttributeName : [UIFont systemFontOfSize:self.tagFont?self.tagFont:KTagFont]};
CGSize Size_str = [titleStr sizeWithAttributes:attrs];
Size_str.width += K_Tag_Title_H_Marin*;
Size_str.height += K_Tag_Title_V_Marin*; CGRect newRect = CGRectZero; if (previousFrame.origin.x + previousFrame.size.width + Size_str.width + K_Tag_Right_Margin > JF_Screen_Width) { newRect.origin = CGPointMake(, previousFrame.origin.y + Size_str.height + K_Tag_Bottom_Margin);
tagView_height += Size_str.height + K_Tag_Bottom_Margin;
}
else {
newRect.origin = CGPointMake(previousFrame.origin.x + previousFrame.size.width + K_Tag_Right_Margin, previousFrame.origin.y); }
newRect.size = Size_str;
[tagLabel setFrame:newRect];
previousFrame=tagLabel.frame; //改变控件高度
if (idx==self.tagArr.count-) {
[self setHight:self andHight:tagView_height+Size_str.height + K_Tag_Bottom_Margin];
}
[self addSubview:tagLabel]; //新增删除、添加功能
if (self.is_can_addTag&&idx==self.tagArr.count-) {//能添加状态&&最后一个-->(进入添加tag界面不用显示删除图片) }else{
if (self.tagStateType==) {
//移除的图片
UIImageView *removeImage = [[UIImageView alloc] initWithFrame:CGRectMake(tagLabel.jf_right-Image_Width*1.5, tagLabel.jf_top+(tagLabel.jf_height-Image_Height)/, Image_Width, Image_Height)];
//删除图片可以换成自己的图片
removeImage.image = [UIImage imageNamed:@"btn_removeTag"];
[self addSubview:removeImage];
}
} //点击按钮
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(tagLabel.frame.origin.x, tagLabel.frame.origin.y, tagLabel.frame.size.width, tagLabel.frame.size.height)];
[button setTag:KButtonTag+idx];
[button addTarget:self action:@selector(clickTag:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button]; }];
}

 

4:Fabric增加脚本KEY的操作内容

把相应的DSYM文件也上传到官网;

5:通过xcrun atos查看dsym报错的详细地址(每次打包时要把当前对应的.DSYM文件保存下来,为后期定位错误做准备)

进入到DSYM文件的文件地方,

使用xcrun atos命令

atos -o YourApp.app.dSYM/Contents/Resources/DWARF/YourApp 0x00062867

实例:

从友盟或者其它地方可以获得报错的编码,通过上面的命令就可以查看到错误地址;

IOS开发基础知识--碎片29的更多相关文章

  1. IOS开发基础知识碎片-导航

    1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...

  2. IOS开发基础知识--碎片19

    1:键盘事件顺序 UIKeyboardWillShowNotification // 键盘显示之前 UIKeyboardDidShowNotification // 键盘显示完成后 UIKeyboar ...

  3. IOS开发基础知识--碎片33

    1:AFNetworking状态栏网络请求效果 直接在AppDelegate里面didFinishLaunchingWithOptions进行设置 [[AFNetworkActivityIndicat ...

  4. IOS开发基础知识--碎片42

    1:报thread 1:exc_bad_access(code=1,address=0x70********) 闪退 这种错误通常是内存管理的问题,一般是访问了已经释放的对象导致的,可以开启僵尸对象( ...

  5. IOS开发基础知识--碎片50

      1:Masonry 2个或2个以上的控件等间隔排序 /** * 多个控件固定间隔的等间隔排列,变化的是控件的长度或者宽度值 * * @param axisType 轴线方向 * @param fi ...

  6. IOS开发基础知识--碎片3

    十二:判断设备 //设备名称 return [UIDevice currentDevice].name; //设备型号,只可得到是何设备,无法得到是第几代设备 return [UIDevice cur ...

  7. IOS开发基础知识--碎片11

    1:AFNetwork判断网络状态 #import “AFNetworkActivityIndicatorManager.h" - (BOOL)application:(UIApplicat ...

  8. IOS开发基础知识--碎片14

    1:ZIP文件压缩跟解压,使用ZipArchive 创建/添加一个zip包 ZipArchive* zipFile = [[ZipArchive alloc] init]; //次数得zipfilen ...

  9. IOS开发基础知识--碎片16

    1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断对象类型 -(BOO ...

随机推荐

  1. 深入理解DOM事件类型系列第二篇——键盘事件

    × 目录 [1]类型 [2]顺序 [3]按键信息[4]应用 前面的话 鼠标和键盘是电脑端主要的输入设备,上篇介绍了鼠标事件,本文将详细介绍键盘事件 类型 键盘事件用来描述键盘行为,主要有keydown ...

  2. 基于Fragment的百度地图框架的使用

    博客:http://blog.csdn.net/developer_jiangqq (一)基本介绍(Fragment和SupportMapFragment): Fragment的使用现在安卓APP开发 ...

  3. 从零开始编写自己的C#框架(7)——需求分析

    本章内容虽然叫“需求分析”,实际上关于具体的需求分析操作步骤并没有深入去写,因为细化的话那将是一本厚厚的书,而需求分析在本系列中,是帮助大家了解项目的基本要求(主要针对本项目而已).而写本章的主要目的 ...

  4. Notes:indexedDB使用

    indexedDB是浏览器端保存结构化数据的一种数据库,类似于mysql,oracle等数据库,但indexedDB使用对象存储数据,而不是用表. indexedDB是全局的宿主对象,使用window ...

  5. Git-Notes

    1.Git安装,直接在官网下载安装即可. 2.Git配置,使用config选项,配置名字和邮箱,如下所示 C:\Users\1yyg>git config --global user.name ...

  6. # Hawk:开源贡献计划,设计,反思

    Hawk在发布之后,收到了不少朋友的感谢和使用反馈,沙漠君表示非常开心.软件肯定有很多的问题和不足,还有很多可扩展的空间,因此我希望更多的朋友,能够参与到改进Hawk的计划中来,为开源世界作出努力. ...

  7. T-SQL:毕业生出门需知系列(四)

    第4课 过滤数据 4.1 使用 WHERE 子句:过滤 只检索所需数据需要指定搜索条件(即过滤条件). WHERE 子句在表名(FROM 子句)后给出,根据 WHERE 子句中指定的条件过滤. SEL ...

  8. 【JUC】JDK1.8源码分析之CopyOnWriteArrayList(六)

    一.前言 由于Deque与Queue有很大的相似性,Deque为双端队列,队列头部和尾部都可以进行入队列和出队列的操作,所以不再介绍Deque,感兴趣的读者可以自行阅读源码,相信偶了Queue源码的分 ...

  9. [转]Teach Yourself Programming in Ten Years——用十年教会自己编程

    作者:Peter Norvig 译者:刘海粟 本文原文为:http://norvig.com/21-days.html 该翻译文档的PDF版可以在这里获得:http://download.csdn.n ...

  10. ASP.NET Core开发-后台任务利器Hangfire使用

    ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序. 可以使用于ASP.NET 应用也 ...