標籤

顯示具有 IPhone 標籤的文章。 顯示所有文章
顯示具有 IPhone 標籤的文章。 顯示所有文章

2012年5月9日 星期三

[長期置頂]Source

Getting a simple project started requires synthesizing a large and disparate set of concepts, documentation, mailing lists, and samples.
http://forum7.hkgolden.com/view.aspx?message=2957805&page=4

Audio Unit set up steps:
Set properties:
1.Find your Audio Components
2.Set your component properties(Audio Format,Channels...etc)

When finished, deallocate the audio unit.Connection:
1.Directly connect to other Audio Units or to Callback functions
2.Write your OWN Callback Functions to fill audio buffers in chunk or sample-by-sample

Initialization:
1.Initialize and Play


Audio Unit Setup
Some substantial code is required to create audio units and set up the audio processing graph. These are the steps that MixerHostAudio uses for initialization:
  1. Set up an active audio session.
  2. Obtain files,set up their formats,and read into memory.
  3. Create an audio processing graph.
  4. Create and initialize Multi-channel Mixer and RemoteI/O audio
    units.
  5. Add the audio units with the nodes to the graph and connect them.
  6. Start processing audio with the graph.
The details of the audio unit setup are covered in the Audio Unit Initialization section of this document. 



constructing an audio processing graph entails three tasks:
  1. Adding nodes to a graph
  2. Directly configuring the audio units represented by the nodes
  3. Interconnecting the nodes


No matter which design pattern you choose, the steps for constructing an audio unit hosting app are basically the same:
  1. Configure your audio session.
  2. Specify audio units.
  3. Create an audio processing graph, then obtain the audio units.
  4. Configure the audio units.
  5. Connect the audio unit nodes.
  6. Provide a user interface.
  7. Initialize and then start the audio processing graph.



The correct way to derive ASBD field values given three factors:
  • Whether the stream is for I/O (SetCanonical) or for audio processing (SetAUCanonical)
  • How many channels you want the stream format to represent
  • Whether you want the stream format interleaved or non-interleaved


An audio unit’s life cycle proceeds as follows:
-At runtime, obtain a reference to the dynamically-linkable library that defines an audio unit you want to use.
-Instantiate the audio unit.
-Configure the audio unit as required for its type and to accomodate the intent of your app.
-Initialize the audio unit to prepare it to handle audio.
-Start audio flow.
-Control the audio unit.




Audio:(esp Audio Unit)
http://www.cocoabuilder.com/archive/cocoa/301070-ios-play-streaming-mp3-audio-with-effects.html

http://cocoawithlove.com/2008/09/streaming-and-playing-live-mp3-stream.html

http://stackoverflow.com/questions/5320293/custom-eq-audiounit-on-ios

2012年4月18日 星期三

【转】Notification的总结之push notification


转载自 北方第一狼
最终编辑 北方第一狼
有一个完整的解决方案,pushclient以及用于测试的mac发送端程序,pushmebaby:
关于技术的文章:

整个过程的讲解如下:

iPhone Push Notification 消息推送 图文详细介绍是本文要介绍的内容,
首先声明下写这个文章的目的,就是让更多人更好的了解push notificaiton 苹果的消息推送功能。
(虽然网上有很多类似的文章说明,但是当自己实践起来的时候还是觉得花费了不少的时间)
在文章之前先提及以下几个概念

NSNotificationCenter 例子

http://hi.baidu.com/%B0%AE%C9%FA%BB%EE%B0%AEqt/blog/item/8136f2d34838352a9b502799.html

1注册一个通知,当收到“ shake”的时候,触发eraseView这个函数
// Erase the view when recieving a notification named "shake" from the NSNotificationCenter object
// The "shake" nofification is posted by the PaintingWindow object when user shakes the device
[[NSNotificationCenter defaultCenteraddObserver:self                                                                  selector:@selector(eraseView)
                                             name:@"shake"
                                           object:nil];


2。eraseView函数实现
// Called when receiving the "shake" notification; plays the erase sound and redraws the view
-(void) eraseView
{
if(CFAbsoluteTimeGetCurrent() > lastTime + kMinEraseInterval) {
[erasingSound play];
[drawingView erase];
lastTime = CFAbsoluteTimeGetCurrent();
}
}
3。用户触发s事件,发送通知
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if (motion == UIEventSubtypeMotionShake )
{
            // User was shaking the device. Post a notification named "shake".
       [[NSNotificationCenter defaultCenter] postNotificationName:@"shake" 
                                            object:self];
}
}

Quart2d 步骤

1创建一个基于window的程序 
2创建一个viewcontroller 
3创建一个UIView的子类 将上述文件关联起来,
即在AppDelegate.m中 [window addSubview:myViewController.view]; 
在MyviewController.m中的loadview函数中创建一个 UIView子类的实例,self.view = myview ; 
并重写myView的drawRect函数。 


第一个例子:
在drawRect函数中,如下:
CGContextRef myContext = UIGraphicsGetCurrentContext(); 
CGContextSetRGBFillColor (myContext, 1, 0, 0, 1);
CGContextFillRect (myContext, CGRectMake (0, 0, 200, 100 )); 
CGContextSetRGBFillColor (myContext, 0, 0, 1, .5); 
CGContextFillRect (myContext, CGRectMake (0, 0, 100, 200)); 


第二个例子,是画image的,同样在drawRect中,代码如下: 
int myWidth = 320 ; 
int myHeight = 480; 
//UIImage myImage; 
CGRect myBoundingBox = CGRectMake (0, 0, myWidth, myHeight); 
CGContextRef myBitmapContext = createBitmapContext(400, 300); 
// ********** Your drawing code here **********//
CGContextSetRGBFillColor (myBitmapContext, 1, 0, 0, 1); 
CGContextFillRect (myBitmapContext, CGRectMake (0, 0, 200, 100 )); 
CGContextSetRGBFillColor (myBitmapContext, 0, 0, 1, .5); 
CGContextFillRect (myBitmapContext, CGRectMake (0, 0, 100, 200 )); 


CGImageRef myImage = CGBitmapContextCreateImage (myBitmapContext); 
CGContextDrawImage(myContext, myBoundingBox, myImage); 
char *bitmapData = CGBitmapContextGetData(myBitmapContext); 


CGContextRelease (myBitmapContext);
if (bitmapData) free(bitmapData); 
CGImageRelease(myImage); 


//其中createBitmapContext函数的实现如下: 
CGContextRef createBitmapContext (int pixelsWide,int pixelsHigh) { 


CGContextRef context = NULL; 
CGColorSpaceRef colorSpace ; 
void * bitmapData; 
int bitmapByteCount; 
int bitmapBytesPerRow; 
bitmapBytesPerRow = (pixelsWide * 4); 


//1 
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh); 
colorSpace = CGColorSpaceCreateDeviceRGB(); 


//2 
bitmapData = malloc( bitmapByteCount ); 


//3 
if (bitmapData == NULL) { 
fprintf (stderr, "Memory not allocated!"); return NULL; 

context = CGBitmapContextCreate(bitmapData, pixelsWide, pixelsHigh, 8, bitmapBytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast); 
if (context== NULL) { 
free(bitmapData);
fprintf(stderr, "dada"); 
return NULL;
 } 


CGColorSpaceRelease(colorSpace); 
return context; 
}

【转】C++和Objective-C混编(官方文档翻译)

http://hi.baidu.com/%B0%AE%C9%FA%BB%EE%B0%AEqt/blog/item/a6214600712b92144afb5117.html


    苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C++和Objective-C,混编后的语言叫Objective-C++。有了它,你就可以在Objective-C应用程序中使用已有的C++类库

Objective-C和C++混编的要点
   在Objective-C++中,可以用C++代码调用方法也可以从Objective-C调用方法。在这两种语言里对象都是指针,可以在任何地方使用。例如,C++类可以使用Objective-C对象的指针作为数据成员,Objective-C类也可以有C++对象指针做实例变量。下例说明了这一点。
    注意:Xcode需要源文件以".mm"为扩展名,这样才能启动编译器的Objective-C++扩展。

開始看英文交檔,加油!


http://hi.baidu.com/%B0%AE%C9%FA%BB%EE%B0%AEqt/blog/item/615e48567d75ec113b29351a.html
真的很排斥英文,儘管自己的閱讀水平尚佳,但是,對於很新的知識,還是母語比較直觀,而且接受的快。

但是,iphone的畢竟是比較新的事物,網上的資料也大多以英文為主,近期工作有點不上手,有點恨自己的不刻苦。
有兩個人的話,對我的影響比較大,
第一個是網上看見一句話,對於c plus plus,看不懂的也要硬著頭皮看,切記浮躁。
第二個人是一個以前的同事,他說過,我們要靠這個吃飯呢。怎麼能不讀英文。

於是,開始讀英文文檔,等到我讀過了二百多頁的時候,發現竟然有種神奇的感覺,猶如行雲流水一般,可以一目幾行了,有點開心,要繼續加油.

[Objective C入門] MVC簡介


MVC(Model-View-Controller,模型—视图—控制器模式)是软件工程中的一种软件架构模式。它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。
MVC最早由Trygve Reenskaug在1974年[1]提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式。模型—视图—控制器模式的目的是实现一种动态的程式设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外此模式通过对复杂度的简化使程序结构更加直观。软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长分组:
  • 控制器- 负责转发请求,对请求进行处理。
  • 视图 - 界面设计人员进行图形界面设计。
  • 模型 - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

OpenGL ES --FrameBuffer

转载自 sleepywk
最终编辑 sleepywk
FrameBuffer对象被用来存放渲染的结果,FrameBuffer可以使你对颜色,模型,色深等的创建精确。
下面是创建FrameBuffer的方法:
1:创建framebuffer对象。
2:创建一个或多个对象 (renderbuffers or textures),对他们进行存储分配,将它们付着到framebuffer的付着点上去。
3:测试framebuffer的完整性。

2012年4月17日 星期二

截取部分图片并显示

http://marshal.easymorse.com/archives/3703

在ios开发中,肯定会碰到需要截取部分图片的情况。
最终的效果类似这样:
imageimage

先看最原始的示例,显示完整的图片

写了个最简单的读取图片并显示的代码,打算以此为开始,逐渐实现截取部分图片的功能。

2012年4月15日 星期日

转自老外的好东东:实现UIImageView播放图片动画结束通知

使用UIImageView可以播放一组图片序列动画,有时我们想获得动画结束的通知,之后做别的事情!
在先有的UIImageView的api函数中,并没有此动画结束的回调通知,不想基于CABasicAnimation的动画,有自带的结束通知。
我之前在处理这个问题是采用延时执行后面的操作的:
        [self performSelector:@selector(doOtherAction) withObject:nil afterDelay:ANIMATION_TIME];
不过感觉不妥,遂找到了这个demo,拿来与大家分享!

address:http://bertmcdowell.com/?tag=uiimageview


CODE:
http://www.cocoachina.com/bbs/read.php?tid-27308.html

iOS开发知识要点

http://wiki.magiche.net/pages/viewpage.action?pageId=884775


目录

performSelectorInBackground 的用途

簡單點說,就是另開一個BACKGROUND THREAD來運行performSelectorInBackground指定的 METHOD。

EXTRA:
在处理过程中一个单独的线程,使用 performSelectorInBackground 的代码更新可可的界面
http://d2100.com/questions/12858

OTHER
http://www.d2100.com/questions/43422
http://songyee.com/category/tech/objective-c/

關於performSelectorInBackground不會在MAIN THREAD運作
http://stackoverflow.com/questions/3694120/performselectorinbackground-on-main-thread

P.S.
要詳細理解,可下載APPLE SAMPLE CODE﹣IPHONEMixerEQGraphTest.
開入面個CONSOLE睇下,你會發現兩邊的MAIN THREAD同背景THREAD的PRINTF不停交錯,經常SWITCH THREAD。從而証明同步(OR異步?)運作。
https://discussions.apple.com/thread/1964587?start=0&tstart=0


- (IBAction)doStuff:(id)sender {
 [self.indicator startAnimating]; // ok, start activity indicator before spawn
 // a new thread.
 [self performSelectorInBackground:@selector(doInBackground) withObject:nil];
}

- (void)doInBackground {
 NSAutoreleasePool * pool;
 pool = [[NSAutoreleasePool alloc] init];
 [self doLengthyProcessing]; //I am putting some image processing code here
//just for the test. Since 'doInBackground' is running in background thread, any
//function calls inside 'doInBackground' should run in the background thread,
//and should return before 'doInBackground' does, am I wrong?

 [self performSelectorOnMainThread:@selector(stopIndicator) withObject:nil waitUntilDone:NO];
 [pool drain];
}

- (void)stopIndicator {
 [self.activityIndicator stopAnimating];
}

- (void)doLengthyProcessing {
 // ...
}

iPhone开发指南-应用程序核心

http://disanji.net/2011/08/19/iphone开发指南-应用程序核心/
应用程序内核

每个iPhone应用程序都基于UIKit框架而构建,因此拥有同样的核心架构。UIKit提供运行应用程序的关键对象并且协调用户输入处理和屏幕内容显示。应用程序彼此之间区分开来的地方在于如何配置这些缺省对象和它们如何把自定义对象整合到它们的应用程序用户界面和行为中。


尽 管定制你的应用程序用户界面和基本行为发生在你的自定义代码中,仍然有很多定制必须使用在应用程序的最高层。因为这些应用层的定制影响了你的应用程序和系 统以及其它安装程序之间的交互方式,理解什么时候该采取行动而什么时候默认行为已经足够这一点很重要。本章提供了一个核心应用程序架构和高级别定制点方面 的总体描述来帮助你做出决定。

核心应用程序架构

从你的程序被用户启动,到它退出,UIKit框架管理着大多数应用程序关键基础结构。一个iPhone应用程序不断从系统中接收事件并必须响应这些事件。接收事件是UIApplication 对象的工作但是响应这些事件是你自定义代码的责任。为了理解你在哪些地方需要响应事件,其实,这对理解一点整个应用程序生命周期和事件循环也有帮助。下面的章节描述了这些周期并且还提供了一些贯穿iPhone应用程序开发的核心设计模式的总结。

应用程序生命周期

应用程序生命周期构成发生在你的应用程序启动和退出期间的事件序列。在iPhone 操作系统中, 用户通过点击桌面上的菜单启动你的应用程序。在点击发生之后的短时间内,系统显示一些过渡图片并开始通过调用main函数启动你的应用程序。从这一点开始,一大堆的初始化工作被移交给UIKit,它将加载应用程序的用户界面并准备好它的事件循环。在事件循环期间,UIKit 协调你自定义对象的事件交付和应用程序发出命令的响应。当用户执行一个动作会让你的应用程序退出时,UIKit通知你的应用程序并开始这个结束过程。


图1-1 描绘了一个iPhone应用程序的简单生命周期。这个图显示了应用程序启动到退出期间发生的事件序列。在初始化和结束阶段,UIKit发送特定的消息给应用程序代理对象以便其知道发生了什么。在事件循环阶段,UIKit分发事件给你的应用程序自定义事件处理器。处理初始化和结束事件在“Initialization and Termination,” 中描述,而事件处理过程在“The Event-Handling Cycle” 中介绍,在后面的章节将覆盖更多的细节。

Figure 1-1 应用程序生命周期



构建View时可能用到的代理函数调用顺序

http://www.kunli.info/2010/08/10/view-lifecycle-callback/
很多时候,要记住iPhone试图加载的life-cycle对应的代理函数是有点头疼的,特别是用Interface Builder构建界面的情况下。这给如何找到最佳的位置来添加自定义的视图绘画/初始化/配置成为了一个对于新手来说的难题。我把目前用到的可能会override的方法总结在这张图里。注意两点

1. 这是我目前遇到的case的总结。我不100%确定适用于所有情况
2. 不是每个case都会用到这些方法的重载。我只是把它们放在了一张图里面而已

IOS Sample Code 整合網頁

將APPLE的IOS SAMPLE CODE 連DESCRIPTION和SCREEN SHOT一併匯整埋一齊。
對於預覽和揀選所需SAMPLE非常方便。

iSource : iPhone Source Navigator
http://isource.bloter.org/taxonomy/term/174/0?page=1

iOS開発メモ
http://www.advancesoft.co.jp/wiki/?iOS-SampleCode

Categories, Protocol, Delegation

http://www.cnblogs.com/chenshun/archive/2012/04/10/2439842.html

objective-c delegate 使用声明方式


 声明方式有两种:

一:非正式的方法

定义成员变量
id delegate; // A delegate that wants to act on events in this view
2.定义代理方法,这里使用到的是objective-c 的协议
@interface NSObject ( BViewDelegate)
-(void)delegateMethod;
@end
注:以上写的协议 为非正式的,所以,不用被设置代理者,不实现这个代理方法也是可以的。



3.调用代理者实现的代理方法

代码:
//设置了代理者,且代理者实现了delegateMethod
if(delegate && [delegate respondsToSelector:@selector(delegateMethod)])
    [delegate delegateMethod];

4.并实现delegateMethod方法即可:
类似初始化中添加:[aView setDelegate:self];
-(void)delegateMethod{
//control bView code here

}

2012年4月14日 星期六

如何理解 iOS Delegate (委托)设计模式


谈起软件开发设计模式, 一口气可以说上几十种。 就iOS 而言, 最为凸显的设计模式是 MVC (Model-View-Controller)。可以说, MVC在 iOS 平台上发挥得淋漓尽致。  为真正达到 MVC的目的, 尽可能减少视图与视图之间的耦合, iOS 又配有 Notification, Delegate 等辅助设计模式。 其中Delegate (委托)最为常用。 委托设计模式大大减少了对象之间的耦合性。

iOS 编程语言是 Objective-C,   简称 OC。 谈起 OC的特性,人们常说,OC 不支持多继承。但 Delegate 弥补了这个缺陷。 有了Delegate, 在声明对象时,可以使其遵循多个协议。 从而解决了多继承问题。

Delegate ,又称为 委托或代理, 它是一种设计模式。  学习iOS开发,需要深入理解 Delegate的用法。 Apple 对Delegate 有明确的说明。 http://developer.apple.com/library/ios/#documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html    
但理解起来还是有些抽象。

Delegate的用途:

用于改变或控制其他对象 。

Delegate 的定义:

(1)Delegate 是一个对象, 其类型为 id  (anonymous type: 匿名类型);

(2) Delegate 的引用通常是一个实例变量 (instance variable), 命名为 delegate;

 (3)Delegate 内所用的方法是 访问模式 (Accessors pattern)

iOS自学笔记--UI开发与File's Owner


开发一个iOS程序,在我目前看来。在做UI方面,大体分以下几步:

1. 定义.h controller  --- 定义一些property outlet和action

2. 实现.m controller --- 实现那些action

3. 在设计界面中画出来

4. 把之前1,2,3连接起来。

     在第4步中,涉及很多次File's Owner

那么,File Owner是干什么的?

UIViewController或其子类在生成的时候,摸版会告诉它们去从相应的.xib去生成,于是controller的实例(instance)就把.xib载入内存,并成为FIle's Owner。所以我们在第1步定义的controller是这个.xib的custom class。并且需要把这个FIle Owner上的outlet连到某个控件上去。Action也同样道理


说半天是从controller的角度说。换个角度,如果我们看.xib文件,发现它有个File Owner。其实就是我们用来设定,究竟是那个Object来读取并载入这个.xib文件,也就是说,谁own这个文件。


简言之,File's Owner就是UIViewController本身,UIViewController中的IBOutlet成员,会在nib中的File's Owner中有所显示,当在File's Owner中按住control键去拖动到view时,可以建立IBOutlet变量到view上一些控件的关联。对于拖动方向的记忆:因为File's Owner是UIViewController自身,IBOutlet变量通常是一个指针,所以要把IBOutlet指向对应的控件,只需从File's Owner开始,拖到view上对应的控件即可。

Android已经开始领跑?


http://software.intel.com/zh-cn/blogs/2011/10/31/android/?cid=sw:prccsdn2044
作者: Yanqing Wang (Intel) (101 篇文章) 日期: 十月 31, 2011 在 3:47 下午
苹果和谷歌的移动设备操作系统之争(Android Vs. IOS)已经开始蔓延到手机制造商市场份额之争,并夹杂的很多为了阻碍竞争对手的专利之争。在福兮祸兮?- 议Google收购摩托罗拉移动一文中,谷歌对摩托罗拉的收购示例,也看出了谷歌在专利之争中的无奈和决心。

李小龙的截拳道是对武功的一种深刻认识,打倒对手的最好方法是击中它的有效点 --- 关节。谷歌的硬件合作伙伴是Android的关节点,如果将其中的TOP3有效的打击,那么是否能够更加有效的抑制Android迅猛的发展势头呢?苹果漂亮的在法律上对HTC和三星进行了打击,但是成果如何呢?让我们看看Strategy Analytics的Q3’2011的智能手机的统计数据吧。