iOS有单行和多行显示文本的控件对象:
- UITextField:简单的单行
- UITextView:可滚屏的多行
在这里使用的是多行文本,即UITextView。
贝塞尔曲线,可以通过三个点,来确定一条平滑的曲线。在计算机图形学应该有讲。是图形开发中的重要工具。
实现的是一个图形做圆周运动。不过不是简单的关键帧动画那样,是计算出了很多点,当然还是用的关键帧动画,即使用CAKeyframeAnimation。有了贝塞尔曲线的支持,可以赋值给CAKeyframeAnimation 贝塞尔曲线的Path引用。
iOS有时候需要判断是否touch到某个图的区域中。这里做了个小示例,通过CGPath创建一个区域,区域是由路径做两点间线段并闭合成的区域,比如这里创建了一个简单的矩形。然后就可以用CGPath相关函数判断点是否在区域里了。
- (void)viewDidLoad {
[super viewDidLoad];
CGMutablePathRef pathRef=CGPathCreateMutable();
CGPathMoveToPoint(pathRef, NULL, 4, 4);
CGPathAddLineToPoint(pathRef, NULL, 4, 8);
CGPathAddLineToPoint(pathRef, NULL, 10, 4);
CGPathAddLineToPoint(pathRef, NULL, 4, 4);
CGPathCloseSubpath(pathRef);
CGPoint point=CGPointMake(5,7);
CGPoint outPoint=CGPointMake(5,10);
if (CGPathContainsPoint(pathRef, NULL, point, NO)) {
NSLog(@"point in path!");
}
if (!CGPathContainsPoint(pathRef, NULL, outPoint, NO)) {
NSLog(@"outPoint out path!");
}
日志引用
参考了:http://iphonedevelopertips.com/xcode/how-to-fix-subversion-in-xcode-3.html
需要在~/.subversion/config文件中设置一下。
找到:
# global-ignores
在下面添加:
global-ignores = build *~.nib *.so *.pbxuser *.mode* *.perspective*
因为build目录是不需要提交的,是构建出来的文件。另外,还有后缀是mode1v3和pbxuser等文件,这是Xcode用户文件。另外一些也是临时文件或者构建出来的文件。
Xcode的SVN功能,和Eclipse中的subclipse或者windows下的tortoiseSVN比较起来功能还差很多。
我是索性不用的,直接用命令行。我看有的朋友是用subclipse,其实也挺好,不过,为了使用SVN功能要单独开一个耗费资源的Eclipse。
但是,不论使用什么SVN工具,都会遇到Xcode固有的问题,即project.pbxproj文件的提交冲突问题。
project.pbxproj文件里面包含了构建过程所需的所有文件,如果你在项目目录下增加了新文件,比如没有通过Xcode,该文件就不在project.pbxproj文件中,就不会生成到app中。同理,如果你从SVN中更新到其他项目成员增加的文件,而没有更新project.pbxproj文件(或者该成员根本就没有提交这个文件),则也会出现相同的现象。
翻译学习了一下Apple官方的《Getting started with Graphics and Animation》,原文见这里。
概述
iOS包括一些框架用于图形和动画:
UIKit包括一个objc的库,用于用户界面和2D绘图,也可以通过UIKit做用户界面动画。
Core Graphics是基于C的API,用于绘制矢量图形、位图和PDF内容。(注意,Quartz 2D是指2D画图引擎的术语,Core Graphics是框架的名称。这两个术语是同义词。
Core Animation是基于objc的API,用于增加用户图形界面的平滑效果和动态的反馈
OpenGL ES是OpenGL的移动版本,用于在移动设备上高性能的2D和3D绘图。苹果的OpenGL ES框架包括EAGL,这是一种基于objc的API,它在Core Animation层和UIKit视图上集成了OpenGL ES的渲染功能。
可使用UIKit实现典型的用户界面图形操作,比如绘制图片,设置颜色,填充矩形。另外,图形的转换(Transaction),比如移动、缩放和反转等,平滑的从一个视图或者屏幕过渡(Transition)到另外一个,以及在一个视图或者层中的动画内容。
当需要更强大的2D绘图能力,需要使用Core Graphics框架。它是绘制矢量图、线、形状、模式、渐变、图形,甚至PDF文档的主力。更高层的框架,比如UIKit,使用Core Graphics。
Core Animation是UIKit框架用于层以及过渡的编程接口。大多数时候,开发者不需要直接使用Core Animation。除非当应用中需要细粒度的动画控制。
当开发游戏或者其他需要依赖GPU的高级图形能力时,需要用到OpenGL ES。
在java中,向方法中传递复杂参数,一般使用对象来传递。因为这样便于扩展。不需要改变方法的声明部分。
在objc中,开始是发送多个参数。这样很麻烦。那么可以用到c里面的方式来做,通过struct传递参数。把相关的参数写在一个struct里面。
声明struct需要在头文件中:
#define MIN_VELOCITY 10
#define LOOP_COUNT 100@interface AnimationView : UIView <UIGestureRecognizerDelegate>{
CALayer *startLayer;
CALayer *startLayer2;
}struct PanLocationData{
CGPoint currentLocation;
CGPoint currentVelocity;
CGPoint panLocation;
};
objc不像java,有静态常量。比如:
public static final RADIAS=180;
目前我的做法是,使用c的预处理#define。比如,在头文件中:
#define MIN_VELOCITY 10
#define LOOP_COUNT 100@interface AnimationView : UIView <UIGestureRecognizerDelegate>{
在代码中使用:
if (data.panLocation.x<MIN_X) {
data.panLocation.x=MIN_X;
}
这些预定义常量,会在编译器编译的时候用define中定义的字符串替代。
在如何通过手势捕获CALayer基础上做了个示例,两个CALayer的联动,当拖动左侧的Layer的时候,右侧的Layer随动。因为右侧的动画没有关闭,有延迟,产生随动的效果。如果不想延迟,可参考拖动动画的问题及解决。