一年工作总结的零散的点(一)

1、

编译错误 compile error:

fatal error: file '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UITableViewCell.h' has been modified since the precompiled header was built


the answer of stackoverflow:

   I had this exact same problem after applying the recent Xcode patch. I ended up deleting the DerivedData folder for my app at:

~/Library/Developer/Xcode/DerivedData/{project name + gobly-gook}

关于 this "~/Library/Developer/Xcode/DerivedData" directory

 This directory contains built products and indexes for the project. It is OK to delete it because it only contains items generated by Xcode. Xcode will regenerate everything next time the project is opened.

       之前我可能修改过那个头文件,然后引起这个错误。

2、

hitTest:withEvent:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;   

// recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system(递归调用 -pointInside:withEvent:函数)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;   

// default returns YES if point is in bounds


遍历父视图下的每个子视图 返回距离用户最近的(最上层的)并且point位置在view中的那个View。

3、

UIImageView设置好图片不设置frame ,这时将其加入到一个UIView实例上 则UIImageView会自动以自己的原大小(原像素)加入到UIView的左上角


4、

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

UIEdgeInsetsMake(0.0f, 35.0f, 0.0f, 10.0f) 方向是 “上左下右”

这个函数是自动 将边缘内的矩形自动缩放大小。

5、

问题:xib not be opened   could not read archive  

哪也没动,同步了一下svn上的文件就出现了这个错误。是因为有人和你提交了相同的文件,导致你的文件可能被损坏或者怎样,处理的方法,我把本地下的xib文件删除,然后再次更新就没有这个问题了。

6、

关于图片旋转的问题:以前的总结备份到这里

1、先用最简单的生活中常用的方式去表示角度,比方说90度就是直角 angle=90;

2、设置旋转动画的时候

  iv.transform=CGAffineTransformMakeRotation(M_PI) #M_PI 就是π 3.1415926...# 

   以上这句话的作用就是让原图形旋转90度。     #旋转方向,如果旋转90或者90度以上,旋转方向会是逆时针旋转,反之为顺时针#

正常使用的情况iv.transform=CGAffineTransFormMakeRotation(angle*(M_PI/180.0f)); #这就是你想要旋转的角度angle#

-------针对时钟的情况

    每过5分钟  分针会转过30度         即 每分钟分针转6度   每分钟时针转 0.5度(6.0/12.0f)12进制

    要算几小时几分钟的角度 则把小时也转化成分钟算比较简单 直接乘以角度就OK了。

7、

关于

  • -(UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets
  • - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;
  • 前者是在iOS5中新加入的方法,同时后者宣布过时。
  • 它们的区别在于”填充物”的区别。。

一段测试代码:

   // UIImage * background=[[UIImage imageNamed:@"2.png"]   stretchableImageWithLeftCapWidth:35.0f topCapHeight:10.0f];

   //  UIImage * background=[[UIImage imageNamed:@"2.png"]  resizableImageWithCapInsets:UIEdgeInsetsMake(0.0f, 35.0f, 0.0f, 35.0f)];                          

    UIImageView * iv=[[UIImageView alloc]          

    initWithFrame:CGRectMake(0, 0, 200, background.size.height)]; 

    iv.image=background;

    [self.view addSubview:iv];

    [iv release];

8、

问题 : "Unable to Open Project  Project ‘++++’ cannot be opened because the project file cannot be parsed."

原因:关于SVN 上冲突的问题

   

 参考: http://stackoverflow.com/questions/361799/xcode-unable-to-open-project-cannot-be-opened-because-the-project-file-canno


右键单击您的projectname.xcodeproj文件, projectname将是您的项目名称。 现在,右键点击后选择显示包内容 。 之后,文件在文本编辑器打开你的projectname.pbxproj 。 现在搜索的行<<<<<<< .mine , =======和>>>>>>> .r 。 例如,在我的情况下,它看起来喜欢这个

<<<<<<< .mine 

 9ADAAC6A15DCEF6A0019ACA8 /*…. in Resources */,

 =======  

52FD7F3D15DCEAEF009E9322 /*... in Resources */, 

>>>>>>> .r269


现在删除这些

<<<<<<< .mine , =======和>>>>>>> .r线,

它会看起来像这样

 9ADAAC6A15DCEF6A0019ACA8 /* BuyPriceBtn.png in Resources */,  

52FD7F3D15DCEAEF009E9322 /* discussionForm.zip in Resources */,


现在,保存和打开您的Xcode项目,并构建它。 一切都会好起来

9、

修改图片后,提交代码,已提交的代码在自己的电脑上可以跑,但是别人同步之后就出现错误,

可能的原因是:自己那其实也不能跑 ,所以在自己测试的时候,

a /  Xcode有一个clean的选项 那个不确定的话 也执行一下  

b / 将测试机还有真机上的应用都删掉

c / 将Xcode下的DerivedData文件夹下的缓冲文件也删掉  

d / 应该把缓冲文件都删除掉

e / 如果还有问题 则把刚修改过的文件解除关系 再重新添加一下 

 这样应该就不会有问题了。

10、

再一个UIView实例上 加另外一个UIView实例  (使用addsubview方法) 如果改变底层的alpha 则上层的alpha也会跟着改变 

可以使用- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview; 这个方法将其放在下面。

原来在上面的UIView的实例就不会改变了。

参考这篇文章:http://mobile.51cto.com/iphone-282623.htm 

11、

Debug体会:

之前调试程序一直都是打NSLog ,通过输出看程序运行到哪一步  几乎没有用过断点,单步调试 。今天顺平给调试了一下 (其实昨天帮我调试了一下。。我没太在意) 看那个调试 发现比NSLog方便了许多。

加断点非常方便,全速运行非常方便,单步调试非常方便!

最方便的是在outPut输出区域 可以 执行调试命令  po 打印OC对象 


参考:http://blog.csdn.net/kesalin/article/details/7222153  

调试技巧


po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 description 消息获得的字符串信息)

print 命令:有点类似于格式化输出,可以输出对象的不同信息:

info 命令:我们可以查看内存地址所在信息

show 命令:显示 GDB 相关的信息。如:show version 显示GDB版本信息

help 命令:如果忘记某条命令的语法了,可以使用 help 命令名 来获取帮助信息。如:help info 显示 info 命令的用法。

12、

父视图会影响子视图的行为,改变父视图的尺寸会连带着改变子视图的尺寸和位置。

在这种情况下,你可以通过合适的配置视图来重定义子视图的尺寸。其他会影响到子视图的改变包括隐藏父视图,改变父视图的alpha值,或者转换父视图。

有关响应者链条 :视图层次的安排也会决定着应用如何去响应事件。在一个具体的视图内部发生的触摸事件通常会被直接发送到该视图去处理。然而,如果该视图没有处理,它会将该事件传递给它的父视图,在响应者链中以此类推。具体视图可能也会传递事件给一个干预响应者对象,像视图控制器。如果没有对象处理这个事件,它最终会到达应用对象,此时通常就被丢弃了。

APPLE 资源库中的文章: http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html#//apple_ref/doc/uid/TP40009503-CH2-SW1

13、

问题:先增加了一个xib文件,后来又删除了,但是再编译就出现问题(删除之前没事)

"'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "MyViewController" nib but the view outlet was not set.'"

解决:当你从工程中删除文件的时候,文件并没有从设备(模拟器)中删除,iOS还是会看见你的旧文件,你需要手动的将设备(模拟器)中的app删除掉,然后从新安装, 另一个方法是你重命名这个文件 。同时两个方法都要将工程中清理,或清除dievrie Data文件夹中的文件。

参考:http://stackoverflow.com/questions/10884640/added-then-deleted-a-ipad-xib-now-nsinternalinconsistencyexception-when-runni

14、

Code Sign error: Provisioning profile can't be found

一般是配置文件不正确引起的。从iTunes那下载一个或者从同事那拷贝一个。

15、UIButton  setShowsTouchWhenHighlighted问题。

一段测试代码:关于按钮的高亮问题。

    UIImageView * iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

    iv.image = [UIImage imageNamed:@"1.png"];

    iv.userInteractionEnabled = YES; // 必须要打开它 (也就是button的父视图的交互属性)

    [self.view addSubview:iv];

    UIButton * b = [UIButton buttonWithType:UIButtonTypeCustom];

    b.frame = CGRectMake(10, 10, 30, 20);

    [b setImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal];

    [b addTarget:self action:@selector(aa:) forControlEvents:UIControlEventTouchUpInside];

    [b setShowsTouchWhenHighlighted:YES]; //设置点击高亮

    [iv addSubview:b]; //必须把button放到UIImageView上去。

16、定义一些显示控件名字的时候,尽量保留这些控件的基本特性,比如继承于UIScrollView,UITableView.的控件的类名还有变量名要以ScrollView结尾。

MyScrollView….

17、一个视图 只有一个父视图,当该视图从 视图1 加入到视图2 后 它将不再是1视图的子视图 并且它不在1视图上继续显示。切记。

18、

  1. //获得指定图片内的指定的屏幕图像  
  2. - (UIImage *)imageFromView: (UIView *) theView  
  3. {  
  4. UIGraphicsBeginImageContext(theView.frame.size);   // 创建一个位图基准的绘图上下文,并使它成为当前的上下文 
  5. CGContextRef context = UIGraphicsGetCurrentContext();   // 拿到当前上下文
  6. CGContextSaveGState(context);   //当前图形状态的副本推到图形状态栈的上下文。
  7. [theView.layer renderInContext:context];   //用theView.layer 给指定的上下文 着色
  8. UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();   //获得当前上下文的图片
  9. UIGraphicsEndImageContext();   //把当前的位图的上下文,从上下文栈顶移走
  10. return  theImage;
19、

把tableView上的整个row的图给截下来,需要将tableView嵌入到scrollView里面,并且让scrollView的大小等于tableView全部显示的大小。这样tableView就能全部显示,可以直接将tableView 传入函数:

  1. - (UIImage *)imageFromView: (UIView *) theView  
  2. {  
  3. UIGraphicsBeginImageContext(theView.frame.size);   // 创建一个位图基准的绘图上下文,并使它成为当前的上下文 
  4. CGContextRef context = UIGraphicsGetCurrentContext();   // 拿到当前上下文
  5. CGContextSaveGState(context);   //当前图形状态的副本推到图形状态栈的上下文。
  6. [theView.layer renderInContext:context];   //用theView.layer 给指定的上下文 着色
  7. UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();   //获得当前上下文的图片
  8. UIGraphicsEndImageContext();   //把当前的位图的上下文,从上下文栈顶移走
  9. return  theImage;

得到整个tableView的位图。


判断一个tableView是否全部显示完毕,用函数

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

在里边判断(indexPath.row 要显示的所有row )是否相等,如果相等 则显示完毕了

注意:比如你往上拉了下tableView,又往下拉了下tableView并见底了 那么该函数会再次执行的。

20、

判断一个字串中是否和另一个相等 用一下方法

[str1 caseInsensitiveCompare: str2] == NSOrderedSame

参考:http://stackoverflow.com/questions/8001643/how-to-best-compare-two-nsstring-objects-while-ignoring-case

用equalTo也行吧。。

21、

测试函数

理解convertRect:toView:, convertRect:FromView 

Demo:

    UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(200, 100, 100, 100)];

    label.text = @"      father";

    [self.view addSubview:label];

    NSLog(@"label.frame = %@",NSStringFromCGRect(label.frame));

    [label release];

    UILabel * testLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 50, 50)];

    testLabel.text = @"test";

    [label addSubview:testLabel];

    NSLog(@"testLabel.frame = %@",NSStringFromCGRect(testLabel.frame));

    [testLabel release];

    CGRect newFrame = [label convertRect:testLabel.frame toView:self.view];

    NSLog(@"newFrame = %@",NSStringFromCGRect(newFrame));

    testLabel.frame = newFrame;

    [self.view addSubview:testLabel];


2012-12-05 19:04:45.645 test[14465:c07] label.frame = {{200, 100}, {100, 100}}

2012-12-05 19:04:45.647 test[14465:c07] testLabel.frame = {{20, 20}, {50, 50}}

2012-12-05 19:04:45.648 test[14465:c07] newFrame = {{220, 120}, {50, 50}}


上边俩坐标的和等于下边

但是要注意 这是这三个View必须是在层次关系上相互挨着的。

22、

数据不同的时候,查看内存地址 是否相同 是个最直接的方法

23、

- (void)scrollViewDidEndDecelerating //结束 减速

- (void)scrollViewWillBeginDecelerating //开始 减速


注意 这两个函数的执行时机 

手动拖动时,这两个函数不会执行的。


在egofresh上两个函数

先执行:

scrollView.contentInset = UIEdgeInsetsMake(64.0f, 0.0f, 0.0f, 0.0f);

  多出来的64 .0f 算做scrollView的content (其实本来就是加到scrollView上的)

并且执行完毕后 scrollView的contentOffset变成了 64.0f,这也就是为什么当你再往上拉,它没有重复叠加,还是显示64的高,

其实这个函数的本质就是改变contentOffset把围绕在原来scrollView周围的content拿来显示. 此时contentSize并不改变!

再执行:

[scrollView setContentInset:UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 0.0f)];

 scrollView的content还原  会看到scrollView向上移动的过程 

但是这个过程中 会触发

-(void)scrollViewDidScroll 函数


 只要scrollView的contentOffset改变 那么-(void)scrollViewDidScroll 必然执行


并不会触发 

- (void)scrollViewDidEndDecelerating 这个函数 而且 scrollView的 offset也根本不会改变,改变的只是scrollView.content.size

--切记

24、

myImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"1.png"] highlightedImage:[UIImage imageNamed:@"1_highlighted.png"]];

myImageView.highlighted = YES

上一行代码设置的时候,记得要设置下一行代码. 也是很容易出的错误。

25、

UIImageView的一些属性和方法

用于:一个播放序列帧的程序,第一时间想起来的就是apple中UIImageView的属性animationImages,将一系列帧添加到一个数组里面,然后设置animation一系列属性,如动画时间,动画重复次数

Animating Images

  • property animationImages  
  • property highlightedAnimationImages  
  • property animationDuration  
  • property animationRepeatCount 
  •  
  • method  -startAnimating
  • method – stopAnimating
  • method – isAnimatin
26、 iv.contentMode属性的作用。

// 1.png 46*52

UIImageView * iv = [[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 40, 100)];

    iv.backgroundColor = [UIColor yellowColor];

    iv.contentMode = UIViewContentModeScaleToFill;

    iv.image = [UIImage imageNamed:@"1"];

    [self.view addSubview:iv];

    self.view.backgroundColor = [UIColor blueColor];

    [iv release];

    iv.contentMode = UIViewContentModeScaleAspectFill;

iv.contentMode = UIViewContentModeScaleAspectFit;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值