Archive for the ‘iPhone开发’ Category.

iPhone:针对不同设备,使用不同CSS

上个文章聊了一下怎么检测iPhone/iPod/iPad, 接下来我们就需要实施CSS了

if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))){ 
    document.write('<link href="iphone.css" rel="stylesheet" type="text/css">'); 
} 
if((navigator.userAgent.match(/iPad/i))){ 
    document.write('<link href="ipadwoflash.css" rel="stylesheet" type="text/css">'); 
}

以上的javascript在检测到是iphone和ipod touch的时候就会写入iphone的css, 在检测到ipad的时候就会使用一个为ipad准备的没有flash的css结构~

南无阿弥陀佛 南无本师释迦牟尼佛 南无药师琉璃光如来

iPhone:Javascript/PHP检测iPhone/iPod/iPad

PHP的比较简单可爱:

	if (strpos($_SERVER['HTTP_USER_AGENT'],"iPhone"))  
	{ 
		echo '在用户代理信息里面如果有iPhone, 执行您的代码'; 
		//别忘了给iPod和iPad也加上去当条件阿~~
	}

javascript的也不错,不过我一直不喜欢浪费太多的iPhone资源,不过这回佛典的html文件还是需要使用javascript,因为所有的xml文件都是简单的转换成html,如果再将php搀和进来就很麻烦了

	if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))) 
	{ 
		document.write(navigator.userAgent);
	}
	else
	{
		document.write(navigator.userAgent);
	}

我们可以看一下上面代码的输出:
如果是一台Mac:
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.86 Safari/533.4

如果是一台iPhone:
Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9(KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7

其实就是找到agent中的典型信息,iPhone这个关键字了.

南无阿弥陀佛 南无本师释迦牟尼佛 南无药师琉璃光如来

用Icon Composer制作Mac/iPhone程序图标

上传过App Store的人还记得自己需要制作的各种尺寸的图标么?

制作Mac/iPhone的图标的工作就不用Firework/Photoshop了吧…

对!Apple的Developer文件夹不是白给的!(冷静…)

请大家找到Icon Composer,下面是路径~~

打开这个程序,不是很帅的程序,五个方块…

大家可以看到Mac程序中需要的各种尺寸的图标咯,怎么用呢?很简单拉~

拽一个图片进去就自动变成那个尺寸了,顺便说一下:试试png,别用jpg…

我知道这个长方的图标很2,我手头就是这个墙纸了…方格间可以随便拽~~

看到自己喜欢的尺寸了么?文件->保存成icon文件就可以咯!哇啦~~

iPhone的一些新书

APress看样是打算和iPhone开发biao上了,除了N本新书,而且品质异常的高。最近我太偷懒了,也是很忙,博客这又没弄了,有空将APress这些书的读书笔记写上来与大家分享

这么多水果,看样是对身体非常好咯~

期待APress更多的iPhone书籍,如果需要这些书,只需要google一下“书名+pdf”就会有惊喜哟!

博文重开,献上MyFodian 0.4的源代码

说来一个多月都没有更新自己的博客了,好多朋友都在支持我,鼓励我的博文,自己很开心。

生计的问题基本得到了解决,感情的问题也不再是问题(被人爱的感觉好阿!)所以之后一旦有时间是继续写博客。自己倒是没从开发中赚多少钱,但是希望大家有钱赚,希望大家从中获益就好。

我享受开发的乐趣!

噢,源代码MyFodian0.4 话说这个程序还是非常粗糙的,不过对于初学者来说会是一个不错的实例。大家自己如果想编译,记得先更改320库的位置。如果320库工作不正常,就要麻烦你们自己改改那个MockDataSource了,因为320的版本更新快,很多东西都有可能会不好用。

预告一下,很多朋友都提了问题,有空归纳一下然后一起回答~ 挑会的答,嘿嘿

数据类型/对象类型介绍(2)UINavigationController

UINavigationController iPhone导航控制器/导航栏 是在iPhone程序中广为使用的用户数据互动方式。

屏幕快照 2009-09-06 下午04.17.41

这是一个简单的导航栏截图,我们可以设置其内置UIView的title,而导航栏会显示出这个title。而不是设置导航栏的title。我们也可以设置其左侧,或者右侧的按钮或者自定义视图对象。我们下面来一步一步的看看导航栏的使用:

1,创建并使用一个UINavigationController

UINavigationController *aNav = [[UINavigationController alloc] init];

然后添加一个视图进去,否则导航栏也没有意义的

UIViewController *aView = [[UIView alloc] initWithNibName: (*xib文件名*)];
[aNav pushViewController:aView animated:NO];
//导航栏的第一个视图不要动画化

2,设置导航栏的左右按钮:
我说过,设置导航栏的按钮并不是去设置导航栏本身,而是当时被导航的视图控制器,比如我们对aView作设置。

设置其标题:

aView.title = @"标题";
 
//配置一个按钮,我这里是《我的佛典》上的代码
UIBarButtonItem *callModalViewButton = [[UIBarButtonItem alloc]
							initWithTitle:@"经文"
							style:UIBarButtonItemStyleBordered
							target:self
							action:@selector(callModalList)];
self.navigationItem.leftBarButtonItem = callModalViewButton;
[callModalViewButton release]; //由于本地视图会retain它,所以我们可以release了

可以看到,还是很简单的嘛。

3,其他常用方法和属性:

本地视图.navigationItem.leftBarButtonItem //左边栏项目
本地视图.navigationItem.rightBarButtonItem //右边栏项目
本地视图.navigationItem.backBarButtonItem //后退栏项目
本地视图.navigationItem.hidesBackButton //隐藏后退按钮(YES or NO)

作为iPhone开发中最常用的对象之一,还有很多内容值得挖掘,不过今天就到这里了。祝愿大家在iPhone编程之路上一路快走!

makeKeyAndVisible

我不知道为什么,不过有人搜索makeKeyAndVisible方法。其实我这种懒人一般不会刨根问底,有些方法照打就好,那些白给的方法有些就别动就好了。

我们看看这个每个程序都有的方法吧:

[window makeKeyAndVisible];

由于iPhone是单窗口程序,所以也就只有这么一个Window对象,而且是UIWindow,不是NSWindow。而根据文档上所说:

“这个是便捷方法,去使被使用对象的主窗口显示到屏幕的最前端。你也可以使用hiddenUIView方法隐藏这个窗口”

所以基本上来说,对于编程者的区别仅仅在于在其前添加代码,或在其后添加代码。

Three20添加方法(翻译)

Three20是一个iPhone开发图形接口类的集合,包含图片查看,一般工具,HTTP本地缓存。Three20是来自于Facebook的iPhone程序源代码的。

添加Three20到您的程序
==============================

Three20是预编译静态库,最简单的方法是使用Xcode的依赖工程特性,下面是方法:

1. 复制(Clone命令)three20 git(GitHub) 目录: `git clone git://github.com/joehewitt/three20.git`.  确保将其储存在一个常用位置,以便Xcode每次编译时来索引和访问

2. 在 “three20/src”中找到 “Three20.xcodeproj” . 拖拽Three20.xcodeproj到您工程的根目录”Groups and Files”边栏中.在弹出对话框中去掉”Copy items”的对号,”Reference Type”选择”Relative to Project”然后点“Add”.

3. 现在要链接Three20库到您的工程。点击添加进来的”Three20.xcodeproj”,在“Details”表中,你会看到 libThree20.a. 打上文件右侧的对号

4. 现在你需要设置320库为你程序的依赖库,以便Xcode在编译的时候也会将320一起编译起来。展开左侧的“Targets”标签,双击您程序的“目标”文件。在“General”标签下,你会看到“Direct Dependencies”,点“+”号添加320库。

5. 现在你需要添加图片和字符串包到你的程序,找到”Three20.bundle”在”three20/src”中,然后拖拽到你的程序中。对话框里面“Copy items”别选,“reference type”选“relative to project”

6. 现在,你需要添加 Core Animation framework到你的工程。点击程序target,然后在frameworks里面添加 QuartzCore.framework就可以了(这个不是翻译的,原来的方法太麻烦了

7. 最后,我们需要让你的工程找得到320库的文件头。打开 “Project Settings”找到”Build”标签,找到 “Header Search Paths”双击它。添加到”three20/src”相对目录的地址。

8. 当你在 Project Settings, 找到 “Other Linker Flags”在”Linker”区,添加”-ObjC”和”-all_load”。

9. 完活了,在用320库的地方添加 #import “Three20/Three20.h” 就好了。

在iPhone程序上读取PDF文件 (rev0.1 ^-^;)

老话,最近闹心的事情多,开心的事情少,但是正事还是要干的。学习得需要,努力的需要,钱的需要… … 天上给我下点儿钞票吧!


言归正传,怎么在iPhone程序中读取PDF的内容呢?答案是,苹果为我们准备了一个很神奇的framework Q2D(Quartz 2D)。Q2D提供了全套的PDF读取API,接下来我们来看看如果简单的使用Q2D来读取PDF文件:

我建立了一个工程叫iPhonePDF, 添加了一个UIScrollView(不知道怎么添加UIScrollView? 添加一个UIView然后把interface上的UIView改成UIScrollView就可以啦…)名为PDFView

看看PDFView里面有什么吧

@interface PDFView : UIScrollView {
 
	NSString *filePath;
	CGPDFDocumentRef pdfDocument;
	CGPDFPageRef page;
	int pageNumber;
}
 
@property (copy, nonatomic) NSString *filePath;
@property int pageNumber;
 
-(CGPDFDocumentRef)MyGetPDFDocumentRef;
-(void)reloadView;
-(IBAction)goUpPage:(id)sender;
-(IBAction)goDownPage:(id)sender;
@end

filePath是储存pdf文件的位置的,得到文件位置就是老话题了:[NSBundle mainBundle]… 后面的会写吧… 不记得了在我博客里面搜索吧

CGPDFDocumentRef是PDF文档索引文件,Q2D是Core Foundation的API,所以没看到那个星星~

CGPDFPageRef是PDF页面索引文件

pageNumber是页码

下面的几个函数其实一看就明了了,翻页的,和刷新页面的。第一个是自定义的getter

然后我们看看m文件里面有用的方法:

@implementation PDFView
@synthesize filePath,pageNumber;
 
- (void)drawRect:(CGRect)rect //只要是UIView都有的绘图函数,基础哟~
{
	if(filePath == nil) //如果没被初始化的话,就初始化
	{
		pageNumber = 10;   //这个其实应该由外部函数控制,不过谁让这个程序特别简单呢
		filePath = [[NSBundle mainBundle] pathForResource:@"zhaomu" ofType:@"pdf"];
                //这里,文件在这里!
		pdfDocument = [self MyGetPDFDocumentRef]; //从自定义getter得到文件索引
	}
 
	CGContextRef myContext = UIGraphicsGetCurrentContext();
        //这个我研究了一段时间呢,不过就照打就可以了
 
	page = CGPDFDocumentGetPage(pdfDocument, pageNumber);
        //便捷函数,告诉人家文档,告诉人家页码,就给你页面索引
 
	CGContextDrawPDFPage(myContext, page);
        //画!
}
 
//此getter可以考虑照打... 都是CF函数,我看到就恶心。
//其实不是很难了,得到文件,转换成URL,然后通过
//CGPDFDocumentCreateWithURL(url)得到文件内容索引
//Ta Daaa~~
- (CGPDFDocumentRef)MyGetPDFDocumentRef
{
	CFStringRef path;
	CFURLRef url;
	CGPDFDocumentRef document;
	path = CFStringCreateWithCString(NULL, [filePath UTF8String], kCFStringEncodingUTF8);
	url = CFURLCreateWithFileSystemPath(NULL, path, kCFURLPOSIXPathStyle, 0);
	CFRelease(path);
	document = CGPDFDocumentCreateWithURL(url);
	CFRelease(url);
	return document;
}
 
-(void)reloadView
{
	[self setNeedsDisplay]; //每次需要重画视图了,就call这个
}
 
-(IBAction)goUpPage:(id)sender
{
	pageNumber++;
 
	[self reloadView];
}
-(IBAction)goDownPage:(id)sender
{
	pageNumber--;
	[self reloadView];
}
@end

我这个是个少半成品的程序呢… 我当时弄了几个PDF测试程序,但是找不到了。不过意思是一样的,剩下的东西由大家来发挥吧,有问题记得留言噢!我有问必答!

循环使用整个NSArray内的对象

循环使用整个NSArray内的对象是非常常用的了,而且最近我在研究究竟怎么能方便的把NSArray存入Core Data,所以这更是必要了,看看如下的方法吧:

1,Objective-C 2.0法,最应该使用的

NSArray *aArray; //我们的Array,假设他已经初始化有内容了
 
for(id innerObj in aArray) //id可以由其他对象类型替代
{
//也就是说, 在循环中的参数innerObj就是aArray中的对象
//由于NSArray中只能储存对象,所以我们使用id作为内涵对象的类型,其实就是个指针了
//而且如果NSArray中的内容不一致,id更不会出现冲突
}

2,C的老方法,不推荐,低性能

NSArray *aArray; //我们的Array,假设他已经初始化有内容了
 
for(int i=0;i<[aArray count]; i++)
{
[[aArray objectAtIndex:i] 然后作你想作的事情]; //做爱 作的事情...
}

3, 用NSEnumerator(不知道怎么翻译阿….)

 NSEnumerator* myIterator = [myArray reverseObjectEnumerator];
 id anObject;
 
 while( anObject = [myIterator nextObject]) //每次读取“逐读器”的下一个对象
 {
     //anObject和刚才的innerObj是一个意思,但是看看多了这么多行
 }

结语:
就用第一种方法吧….