[?李華明Himi?](http://www.himigame.com/about-himi)原創,轉載務必在明顯處注明:
轉載自[【黑米GameDev街區】](http://www.himigame.com/)?原文鏈接:?[http://www.himigame.com/iphone-cocos2d/492.html](http://www.himigame.com/iphone-cocos2d/492.html "【iOS-Cocos2d游戲開發之十六】添加本地通知(UILocalNotification)以及添加系統組件滾動視圖(UIScrollView)!")
[](http://blog.csdn.net/xiaominghimi/article/details/6897028)
-------------【11月28日更新解決添加組件Cocos2d動畫停止播放的BUG】--------
[【iOS-Cocos2d游戲開發之七】在cocos2d中添加/刪除系統組件,并解決View設置透明會影響View中的其他組件的問題【11月28日更新解決添加組件Cocos2d動畫停止播放的BUG】!](http://blog.csdn.net/xiaominghimi/article/details/6704898)
首先申明下:希望大家轉載的時候不要忘記給原文連接,看到不少論壇轉載完全變成他們論壇自己原創了~ 請大家配合哈~謝謝~娃哈哈;
本篇Himi為童鞋們介紹兩個常用的知識點:一個是在Cocos2d中添加UILocalNotification本地化通知,另外一個就是添加UIScrollViewiOS系統組件實現滾動字幕效果;
對于UILocalNotification這個本地化通知功能實現比較簡單,用途很廣,最大的用途就是階段性的讓用戶回歸我們的應用中;那么下面就直接上代碼:
因為是添加到cocos2d引擎中,另一方面一般我們需要用戶進入我們應用后就開啟通知功能的;所以我們將代碼放在 AppDelegate.m 類中的applicationDidFinishLaunching中,代碼如下:
~~~
- (void) applicationDidFinishLaunching:(UIApplication*)application
{
...
application.applicationIconBadgeNumber = 0;//應用程序右上角的數字=0(消失)
[[UIApplication sharedApplication] cancelAllLocalNotifications];//取消所有的通知
//------通知;
UILocalNotification *notification=[[UILocalNotification alloc] init];
if (notification!=nil) {//判斷系統是否支持本地通知
notification.fireDate=[NSDate dateWithTimeIntervalSinceNow:kCFCalendarUnitDay];//本次開啟立即執行的周期
notification.repeatInterval=kCFCalendarUnitDay;//循環通知的周期
notification.timeZone=[NSTimeZone defaultTimeZone];
notification.alertBody=@"哇,我的女神,你怎了?";//彈出的提示信息
notification.applicationIconBadgeNumber=1; //應用程序的右上角小數字
notification.soundName= UILocalNotificationDefaultSoundName;//本地化通知的聲音
notification.alertAction = NSLocalizedString(@"營救女神!", nil); //彈出的提示框按鈕
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
...
}
~~~
這里Himi首先是將之前的所有通知都取消掉,防止開啟多個循環本地化通知,并且讓應用右上角的數字設置為0,這里設置為0就相當與取消數字的顯示了;
然后需要說明的是循環通知的周期,iOS提供如下一些周期:
~~~
enum {
kCFCalendarUnitEra = (1UL << 1),
kCFCalendarUnitYear = (1UL << 2),
kCFCalendarUnitMonth = (1UL << 3),
kCFCalendarUnitDay = (1UL << 4),
kCFCalendarUnitHour = (1UL << 5),
kCFCalendarUnitMinute = (1UL << 6),
kCFCalendarUnitSecond = (1UL << 7),
kCFCalendarUnitWeek = (1UL << 8) /* CF_DEPRECATED(10_4, 10_7, 2_0, 5_0) */,
kCFCalendarUnitWeekday = (1UL << 9),
kCFCalendarUnitWeekdayOrdinal = (1UL << 10),
#if MAC_OS_X_VERSION_10_6 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
kCFCalendarUnitQuarter = (1UL << 11),
#endif
#if MAC_OS_X_VERSION_10_7 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_5_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
kCFCalendarUnitWeekOfMonth = (1UL << 12),
kCFCalendarUnitWeekOfYear = (1UL << 13),
kCFCalendarUnitYearForWeekOfYear = (1UL << 14),
#endif
};
~~~
下面是真機截圖:


以上是在我真機iOS5系統上的測試效果,主界面中的展示效果以及通知欄內的通知效果,在iOS5之前都會出現類似彈出一個框,框中有你設置的按鈕名稱和提示文字~
OK,這個知識點就不多說了,比較easy;下面介紹如何在cocos2d中添加UIScrollView;
對于UIScrollView視圖,比較常用,Android也有此視圖,那么它用途比較廣,最常用也是最容易想到的就是利用此功能實現游戲中公司介紹、字幕滾動效果,那么Himi就簡單的實現在cocos2d中利用UIScrollView添加一個無線循環滾動的小例子加以講解;
注意:對于還不知道如何在cocos2d中添加系統組建的童鞋請移步到《[【Cocos2d游戲開發之七】在cocos2d中添加/刪除系統組件,并解決View設置透明會影響View中的其他組件的問題!](http://blog.csdn.net/xiaominghimi/article/details/6704898)》此貼學習先,下面開始添加:
首先我們新建一個cocos2d項目,然后添加顯示一個自定義的MyView(UIViewController)的視圖,并且在MyView.xib中添加了一些label和ScrollView組件中;
如下圖:

然后修改MyView.h,和MyView.m類,在MyView.h中如下代碼:
~~~
@interface MyView : UIViewController<UIScrollViewDelegate>{
IBOutlet UIScrollView *scrollView;
}
@property(nonatomic,retain)IBOutlet UIScrollView *scrollView;
@end
~~~
.h類中添加了一個UIScrollView并使用UIScrollViewDelegate協議,并IBOutlet出去,接著讓xib文件中的UIScrollView組件連接此scrollView;

之后在MyView.m中添加如下代碼:
1.添加一行如下代碼:
~~~
@synthesize scrollView;
~~~
2.在- (void)viewDidLoad{}中添加如下代碼:
~~~
- (void)viewDidLoad
{
[super viewDidLoad];
//滾動view
scrollView.delegate = self;
scrollView.scrollEnabled = YES;
scrollView.contentSize = CGSizeMake(100, 249);//設置滾動的可視區域
// Do any additional setup after loading the view from its nib.
}
~~~
整個MyView.m代碼如下:
~~~
//
// MyView.m
// ScrollViewByHimi
//
// Created by 華明 李 on 11-10-22.
// Copyright (c) 2011年 __MyCompanyName__. All rights reserved.
//
#import "MyView.h"
@implementation MyView
@synthesize scrollView;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
//滾動view
scrollView.delegate = self;
scrollView.scrollEnabled = YES;
scrollView.contentSize = CGSizeMake(100, 249);//設置滾動的可視區域
// Do any additional setup after loading the view from its nib.
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
~~~
OK,運行代碼即可,運行效果如下:

可以拖動ScrollView中的數據了,ScrollView默認顯示滾動條的,可以代碼設置隱藏也可以xib中對ScrollView屬性調整都可以;
下面介紹如何讓ScrollView中的數據無限循環運動:
首先在HelloWorldLayer.m種的init添加我們自定義view的下面設置一個選擇器:
~~~
[self schedule:@selector(viewAddPointY) interval:0.03];//每0.03秒執行一次viewAddPointY方法
~~~
然后viewAddPointY方法是Himi自定義的函數,代碼如下:
~~~
-(void)viewAddPointY{
view.scrollView.contentOffset=ccpAdd(view.scrollView.contentOffset, ccp(0,0.5));//讓UIScrollView顯示內容每次慢慢向上移動0.5像素
//view.scrollView.contentSize.height :得到UIScrollView的高度
if(view.scrollView.contentOffset.y>=view.scrollView.contentSize.height){
view.scrollView.contentOffset=ccp(0,-view.scrollView.frame.size.height);
}
}
~~~
運行效果如下:

備注:我的Xcode是4.2用的模擬器是iOS5的模擬器,可能童鞋們按照我的這個教程運行后發現雖然UIScrollView中的數據滾動了但是沒有循環播放,這個是因為模擬器的問題,Himi真機測試無問題的~
好了,最后我把 HelloWorldLayer.h 和HelloWorldLayer.m也完整放上來,省得有的童鞋不知道添加代碼的地方也方便童鞋們拷貝代碼;
**HelloWorldLayer.h**
~~~
//
// HelloWorldLayer.h
// ScrollViewByHimi
//
// Created by 華明 李 on 11-10-22.
// Copyright __MyCompanyName__ 2011年. All rights reserved.
//
// When you import this file, you import all the cocos2d classes
#import "cocos2d.h"
#import "MyView.h"
// HelloWorldLayer
@interface HelloWorldLayer : CCLayer
{
MyView *view;
}
// returns a CCScene that contains the HelloWorldLayer as the only child
+(CCScene *) scene;
@end
~~~
**HelloWorldLayer.m**
~~~
//
// HelloWorldLayer.m
// ScrollViewByHimi
//
// Created by 華明 李 on 11-10-22.
// Copyright __MyCompanyName__ 2011年. All rights reserved.
//
// Import the interfaces
#import "HelloWorldLayer.h"
#import "MyView.h"
// HelloWorldLayer implementation
@implementation HelloWorldLayer
+(CCScene *) scene
{
CCScene *scene = [CCScene node];
HelloWorldLayer *layer = [HelloWorldLayer node];
[scene addChild: layer];
return scene;
}
-(id) init
{
if( (self=[super init])) {
view= [[MyView alloc] initWithNibName:@"MyView" bundle:nil];
[[[CCDirector sharedDirector] openGLView] addSubview:view.view];
[self schedule:@selector(viewAddPointY) interval:0.03];//每0.03秒執行一次viewAddPointY方法
}
return self;
}
-(void)viewAddPointY{
view.scrollView.contentOffset=ccpAdd(view.scrollView.contentOffset, ccp(0,0.5));//讓UIScrollView顯示內容每次慢慢向上移動0.5像素
//view.scrollView.contentSize.height :得到UIScrollView的高度
if(view.scrollView.contentOffset.y>=view.scrollView.contentSize.height){
view.scrollView.contentOffset=ccp(0,-view.scrollView.frame.size.height);
}
}
- (void) dealloc
{
[super dealloc];
}
@end
~~~
OK,本篇結束;再次提醒下,希望大家轉載的時候不要忘記給原文連接,看到不少論壇轉載完全變成他們論壇自己原創了~ 請大家配合下哈~謝謝~
【2011年11月15日更新:】
注意:有的童鞋使用系統的UIScrollView的時候出現如下問題:
《因為嘗試了些coco2d寫的scrollview感覺效果都不太理想,所以打算用UIScrollView來實現一些功能的,可是遇到這樣一個棘手的問題,感覺整個cocos2d都停止了一樣,連顯示的FPS也停了,只要scrollview一停止滑動,所有的動畫效果都立刻恢復了。。。請問有高人知道怎么解決這個問題么?感激不禁~》
解決方法如下:
~~~
0.99.5版本的..
首先:在CCDirectorIOS.m 文件中 第640行 找到以下注釋.
//
// If you want to attach the opengl view into UIScrollView
// uncomment this line to prevent 'freezing'. It doesn't work on
// with the Fast Director
//
// [[NSRunLoop currentRunLoop] addTimer:animationTimerforMode:NSRunLoopCommonModes]; <-去掉這行代碼注釋.
第二.
在 AppDelegate.m 文件中找到.
if( ! [CCDirector setDirectorType:kCCDirectorTypeDisplayLink] ) <-注釋這一行 強制設置 CCDirector 為kCCDirectorTypeNSTimer類型.
[CCDirector setDirectorType:kCCDirectorTypeNSTimer];<- 如果類型不是kCCDirectorTypeNSTimer,則設置類型為 kCCDirectorTypeNSTimer
搞定..
~~~
- 前言
- 【Iphone 游戲開發】游戲引擎剖析
- [Object-C語言隨筆之一]Mac os 下搭建iOS開發環境
- [Object-C語言隨筆之二] 《NSLog》常用的打印調試語句與自動排版
- [Object-C語言隨筆之三] 類的創建和實例化以及函數的添加和調用!
- [Object-C語言隨筆之四]創建視圖并繪制簡單圖形
- 【iOS-Cocos2d游戲開發之一】搭建cocos2d游戲引擎環境HelloWorld!
- 【iOS-Cocos2d游戲開發之二】Cocos2D 游戲開發資源貼(教程以及源碼)
- 【iOS-Cocos2d游戲開發之三】CCScene切換的所有特效(28種)以及設置屏幕橫豎屏!
- 【iOS-Cocos2d游戲開發之四】獨自收集Cocos2d提供的字體!共57種(有對照的字體圖)
- 【iOS-Cocos2d游戲開發之五】多觸點與觸屏事件詳解(單一監聽、事件分發)【11月28日更新】
- 【iOS-Cocos2d游戲開發之六】對觸屏事件追加講解,解決無法觸發ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戲開發之七】在cocos2d中添加/刪除系統組件,并解決View設置透明會影響View中的其他組件的問題!【11月28日更新解決添加組件Cocos2d動畫停止播放的BUG】
- 【iOS-Cocos2d游戲開發之八】開啟高清(960*640)模式問題與解答、圖片適配以及設置iphone橫豎屏
- 【iOS-Cocos2d游戲開發之九】講解CCSpriteBatchNode與TP工具的&quot;.pvr.ccz&quot;,&quot;.plist&quot;共用的終極精靈優化及注意事項!
- 【iOS-Cocos2d游戲開發之十】添加粒子系統特效并解決粒子特效與Layer之間的坐標問題;
- 【iOS-Cocos2d游戲開發之十一】使用Box2d物理系統以及在cocos2d框架添加Box2d物理系統lib包的方法
- 【iOS-Cocos2d游戲開發之十二】淺析使用C++/C/OC進行iOS游戲混編出現“failed with exit”問題與小結;
- 【iOS-Cocos2d游戲開發之十三】CCSprite利用Bezier(貝塞爾)做拋物線動作并讓CCSprite同時播放兩個Action動作!
- 【iOS-Cocos2d游戲開發之十四】音頻/音效/視頻播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d進行視頻播放!)
- 【iOS-Cocos2d游戲開發之十五】詳解CCProgressTimer 進度條并修改cocos2d源碼實現“理想”游戲進度條!
- 【iOS-Cocos2d游戲開發之十六】添加本地通知(UILocalNotification)以及添加系統組件滾動視圖(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戲開發之十七】靈活使用精靈可視區域(TextureRect)與錨點(anchorPoint),并結合可視區域與錨點制作進度條!
- 【iOS開發必備指南合集】申請企業級IDP、真機調試、游戲接入GameCenter 指南(實現仿官方的成就提示)、游戲接入OpenFeint指南;
- 【iOS-Cocos2d游戲開發之十八】解決滾屏背景/拼接地圖有黑邊(縫隙)/動畫播放出現毛邊以及禁止游戲中自動鎖屏問題!【2011年12月18日補充】
- 【iOS開發必收藏】詳解iOS應用程序內使用IAP/StoreKit付費、沙盒(SandBox)測試、創建測試賬號流程!【2012-12-11日更新獲取&quot;產品付費數量等于0的問題&quot;】
- 【iOS-cocos2d-X 游戲開發之一】在Mac下結合Xcode搭建Cocos2d-X開發環境!
- 【iOS-cocos2d-X 游戲開發之二】【必看篇】總結闡述Cocos2d-X與Cocos2d-iphone區別;
- 【iOS-Cocos2d游戲開發之十九】游戲數據存儲的四種常用方式NSKeyedArchiver/NSUserDefaults/Write寫入/SQLite3
- 【iOS-Cocos2d游戲開發之二十】精靈的基礎知識點總匯(位圖操作/貼圖更換/重排z軸等)以及利用CCSprite與CCLayerColor制作簡單遮蓋層!
- 【iOS-Cocos2d游戲開發之二十一 】自定義精靈類并為你的精靈設置攻擊幀(指定開始幀)以及擴展Cocos2d源碼的CCAnimation簡化動畫創建!
- 【iOS-Cocos2d游戲開發之二十二 】CCSpeed實現CCAnimate動畫進行時設置慢動作以及設置游戲加減速進行(塔防游戲必備)!
- 【iOS-cocos2d-X 游戲開發之三】Mac下配置Android NDK環境并搭建Cocos2d-x環境并Eclipse正常編譯運行Cocos2dX自帶TestsDemo項目!
- 【iOS-cocos2d-X 游戲開發之四】Cocos2dX創建Android NDK新項目并編譯導入Eclipse中正常運行!
- 【iOS-cocos2d-X 游戲開發之五】游戲存儲之Cocos2dX自帶CCUserDefault類詳解;
- 【iOS-cocos2d-X 游戲開發之六】使用Base64算法對Cocos2dX自帶CCUserDefault游戲存儲數據編碼!
- 【iOS-cocos2d-X 游戲開發之七】整合Cocos2dX的Android項目到Xcode項目中,Xcode編寫&amp;編譯代碼,Android導入打包運行即可!
- 【iOS-iap防護】驗證用戶付費收據!拒絕iap Cracker!拒絕iap Free!讓iphone越獄用戶無從下手!【2012年5月2日更新防護iap Free的方法】
- 【COCOS2DX-LUA 腳本開發之一】在Cocos2dX游戲中使用Lua腳本進行游戲開發(基礎篇)并介紹腳本在游戲中詳細用途!
- 【iOS-cocos2d-X 游戲開發之九】Cocos2dx利用CCSAXParser解析xml數據&amp;CCMutableDictionary使用與注意!
- 【iOS-cocos2d-X 游戲開發之十】自定義CCSprite/Layer/CCNode及靜態類模版&amp;自定義類細節說明&amp;Cocos2dx觸屏事件講解
- 【iOS-cocos2d-X 游戲開發之十一】New CCSprite()帶來的錯誤&amp;使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戲開發之十二】自定義Cocos2dx搖桿(增強Joystick),增加搖桿跟隨用戶觸點作為搖桿坐標,讓搖桿不再死板!
- 【iOS-cocos2d-X 游戲開發之十三】詳細講解在Xcode中利用預編譯并通過Jni調用Android的Java層代碼(cocos2dx里訪問調用Android函數)!
- 【iOS-cocos2d-X 游戲開發之十四】Xcode中c++&amp;Object-C混編,詳細介紹如何在cocos2dx中訪問object函數以及Apple Api
- 【iOS-cocos2d-X 游戲開發之十五】Cocos2dx中響應Android的Back(返回)與Menu(小房子)事件&amp;&amp;Cocos2dx自動釋放粒子內存函數!
- 【iOS-cocos2d-X 游戲開發之十六】配置你的Cocos2dx項目編譯后的Android自動使用(-hd)高清圖&amp;設置Android自適應屏幕、縮放比例方法!
- 【Cocoa(mac) Application 開發系列之四】動作編輯器(Cocos2dx)制作流程詳解及附上響應鼠標滾軸事件、反轉坐標系、導入/創建資源目錄等知識點代碼!
- 【Cocos2d-X(2.x) 游戲開發系列之一】cocos2dx(v2.x)與(v1.x)的一些常用函數區別講解!在2.x版CCFileData類被去除等
- 【Cocos2d-X(2.x) 游戲開發系列之二】cocos2dx最新2.0.1版本跨平臺整合NDK+Xcode,Xcode編寫&amp;編譯代碼,Android導入打包運行即可!
- 【Cocos2dX(2.x)_Lua開發之三】★重要必看篇★在Lua中使用自定義精靈(Lua腳本與自創建類之間的訪問)及Lua基礎講解
- 【Cocos2d-X(2.x) 游戲開發系列之三】最新版本cocos2d&#173;2.0&#173;x&#173;2.0.2使用新資源加載策略!不再沿用-hd、-ipad、-ipadhd添加后綴方式
- 【Cocos2d-X(1.x 2.x) 修復篇】iOS6 中 libcurl.a 無法通過armv7s編譯以及iOS6中無法正常游戲橫屏的解決方法
- 【Cocos2d-X(1.x 2.x) 】iOS6與iphone5適相關設置隨筆(解決第三方類庫無法通過armv7s編譯的方法、添加Default-568h@2x.png)