iPhone 键盘
#define SCROLLVIEW_CONTENT_HEIGHT_PORTRAIT 610
#define SCROLLVIEW_CONTENT_WIDTH_PORTRAIT 320
#define SCROLLVIEW_CONTENT_HEIGHT_LANDSCAPE 500
#define SCROLLVIEW_CONTENT_WIDTH_LANDSCAPE 480
....
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:)
name: UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:)
name: UIKeyboardDidHideNotification object:nil];
m_scrollView.contentSize = CGSizeMake(SCROLLVIEW_CONTENT_WIDTH_PORTRAIT, SCROLLVIEW_CONTENT_HEIGHT_PORTRAIT);
displayKeyboard = NO;
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)keyboardDidShow: (NSNotification *)notif
{
if (displayKeyboard) {
return;
}
if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
self.interfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
m_scrollView.frame = CGRectMake(0, 0, SCROLLVIEW_CONTENT_WIDTH_LANDSCAPE, 140);
}
else
{
m_scrollView.frame = CGRectMake(0, 0, SCROLLVIEW_CONTENT_WIDTH_PORTRAIT, 240);
}
CGRect textFieldRect = [m_activeField frame];
textFieldRect.origin.y += 10;
[m_scrollView scrollRectToVisible:textFieldRect animated:YES];
displayKeyboard = YES;
}
- (void) keyboardDidHide: (NSNotification *)notif
{
if (!displayKeyboard) {
return;
}
if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
self.interfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
m_scrollView.frame = CGRectMake(0, 0, SCROLLVIEW_CONTENT_WIDTH_LANDSCAPE, 300);
m_scrollView.contentSize = CGSizeMake(SCROLLVIEW_CONTENT_WIDTH_LANDSCAPE, SCROLLVIEW_CONTENT_HEIGHT_LANDSCAPE);
}
else
{
m_scrollView.frame = CGRectMake(0, 0, SCROLLVIEW_CONTENT_WIDTH_PORTRAIT, 460);
m_scrollView.contentSize = CGSizeMake(SCROLLVIEW_CONTENT_WIDTH_PORTRAIT, SCROLLVIEW_CONTENT_HEIGHT_PORTRAIT);
}
displayKeyboard = NO;
}
iPhone 画图
MyDrawView file:
#import <UIKit/UIKit.h>
@interface MyDrawView : UIView {
CGPoint firstTouch;
CGPoint lastTouch;
UIImage *drawImage;
CGRect redrawRect;
}
@property CGPoint firstTouch;
@property CGPoint lastTouch;
@property (nonatomic, retain) UIImage *drawImage;
@property (readonly) CGRect currentRect;
@property CGRect redrawRect;
@end
-------------------------------------
#import "MyDrawView.h"
@implementation MyDrawView
@synthesize firstTouch;
@synthesize lastTouch;
@synthesize drawImage;
@synthesize redrawRect;
@synthesize currentRect;
-(CGRect)currentRect
{
return CGRectMake((firstTouch.x > lastTouch.x) ? lastTouch.x : firstTouch.x,
(firstTouch.y > lastTouch.y) ? lastTouch.y : firstTouch.y,
fabsf(firstTouch.x - lastTouch.x),
fabsf(firstTouch.y - lastTouch.y));
}
- (id)initWithCoder:(NSCoder*)coder
{
if (( self = [super initWithCoder:coder] ))
{
if (drawImage == nil)
{
self.drawImage = [UIImage imageNamed:@"green_circle.png"];
}
}
return self;
}
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
// Initialization code
}
return self;
}
- (void)drawRect:(CGRect)rect {
// Drawing code
CGFloat horizontalOffset = drawImage.size.width / 2;
CGFloat verticalOffset = drawImage.size.height / 2;
CGPoint drawPoint = CGPointMake(lastTouch.x - horizontalOffset, lastTouch.y - verticalOffset);
[drawImage drawAtPoint:drawPoint];
}
- (void)dealloc {
[drawImage release];
[super dealloc];
}
#pragma mark -
#pragma mark UI Touches
#pragma mark -
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
firstTouch = [touch locationInView:self];
lastTouch = [touch locationInView:self];
[self setNeedsDisplay];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
lastTouch = [touch locationInView:self];
//[self setNeedsDisplay];
CGFloat horizontalOffset = drawImage.size.width / 2;
CGFloat verticalOffset = drawImage.size.height / 2;
redrawRect = CGRectUnion(redrawRect, CGRectMake(lastTouch.x - horizontalOffset,
lastTouch.y - verticalOffset,
drawImage.size.width,
drawImage.size.height));
redrawRect = CGRectInset(redrawRect, -2.0, -2.0);
[self setNeedsDisplayInRect:redrawRect];
}
@end
----------------------------
MyDrawViewController
@interface MyDrawViewController : UIViewController {
UIImageView *m_myImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *m_myImage;
@end
------------
.m file:
...
- (void)viewDidLoad {
[super viewDidLoad];
CGRect myImageRect = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
m_myImage = [[UIImageView alloc] initWithFrame:myImageRect];
[m_myImage setImage:[UIImage imageNamed:@"Background.png"]];
m_myImage.opaque = YES; // explicitly opaque for performance
[self.view addSubview:m_myImage];
}
iPhone UITableView委托
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return 0;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell...
return cell;
}
/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the specified item to be editable.
return YES;
}
*/
/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
*/
/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
}
*/
/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the item to be re-orderable.
return YES;
}
*/
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic may go here. Create and push another view controller.
/*
<#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
// ...
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
*/
}
/*
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 44.0f;
}
*/
iPhone 从视图中删除所有子视图
for (int i = 0; i < [[self.view subviews] count]; i++ ) {
[[[self.view subviews] objectAtIndex:i] removeFromSuperview];
}
iPhone 检测UINavigationController上的后退按钮触摸
-(void) viewWillDisappear:(BOOL)animated {
if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
// back button was pressed. We know this is true because self is no longer
// in the navigation stack.
}
[super viewWillDisappear:animated];
}
iPhone 带有Opengl coverflow的COCOS2D
#import "HelloWorldScene.h"
#import "MenuScene.h"
#import "Common.h"
#import "GameScene.h"
UIWindow *flowCoverWindow;
UIView *flowCoverView;
NSString *currentImage;
NSString *previousImage;
#define kImageTag 0x01
@implementation FlowCoverViewController
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft) ||
(interfaceOrientation == UIInterfaceOrientationLandscapeRight));
}
- (int)flowCoverNumberImages:(FlowCoverView *)view
{
return 6;
}
- (IBAction)done:(id)sender
{
NSLog(@"done");
[[self parentViewController] dismissModalViewControllerAnimated:YES];
[[Director sharedDirector] resume];
}
- (UIImage *)flowCover:(FlowCoverView *)view cover:(int)image
{
switch (image) {
case 0:
default:
return [UIImage imageNamed:@"dButton1.png"];
case 1:
return [UIImage imageNamed:@"dButton2.png"];
case 2:
return [UIImage imageNamed:@"dButton3.png"];
case 3:
return [UIImage imageNamed:@"dButton4.png"];
case 4:
return [UIImage imageNamed:@"dButton5.png"];
case 5:
return [UIImage imageNamed:@"dButton6.png"];
}
}
- (void)flowCover:(FlowCoverView *)view didSelect:(int)image
{
NSLog(@"Selected Index %d",image);
[[self parentViewController] dismissModalViewControllerAnimated:YES];
[[Director sharedDirector] resume];
[[[Director sharedDirector] openGLView] removeFromSuperview];
currentTerrain = image;
Scene *s2 = [Scene node];
[s2 addChild: [LevelSelectionLayer node]];
[[Director sharedDirector] replaceScene: s2];
}
@end
// HelloWorld implementation
@implementation HelloWorld
+(id) scene
{
// 'scene' is an autorelease object.
Scene *scene = [Scene node];
// 'layer' is an autorelease object.
HelloWorld *layer = [HelloWorld node];
// add layer as a child to scene
[scene addChild: layer];
// return the scene
return scene;
}
// on "init" you need to initialize your instance
-(id) init
{
if( (self=[super init] )) {
}
[self ShowCoverFlow];
currentImage = @"icon.png";
previousImage = @"f";
testImage = [Sprite spriteWithFile:currentImage ];
[testImage setPosition:ccp(60,70)];
//[self addChild:testImage z:1 tag:kImageTag];
[self schedule: @selector(UpdateImage:) interval:1/60.0f];
[self MoveImage];
return self;
}
-(void)MoveImage {
id moveSpriteCW = [RotateBy actionWithDuration:3 angle:360];
id moveSpriteCCW = [RotateBy actionWithDuration:1 angle:180];
id seq1 = [Sequence actions: moveSpriteCW, moveSpriteCCW, nil];
id seq2 = [seq1 reverse];
[testImage runAction: [Sequence actions: seq1, seq2, nil]];
}
-(void)UpdateImage:(id) sender{
NSLog(@"currentImage is = %@", currentImage);
}
-(void) ShowCoverFlow
{
UINavigationController *testViewController;
FlowCoverViewController *flowCover;
flowCoverView = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
//using a navigation controller to present FlowCover without it rotating to portrait
testViewController = [[UINavigationController alloc] init];
//The navigation controller will try to put a nav bar in the window, so we hide it
[testViewController setNavigationBarHidden:YES animated:NO];
[testViewController setView:flowCoverView];
NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"TestFC" owner:self options:nil];
flowCover = [array objectAtIndex:0];
testViewController.delegate = self;
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
[[[Director sharedDirector] openGLView] addSubview:flowCoverView];
[[Director sharedDirector] pause];
[testViewController presentModalViewController:flowCover animated:YES];
}
// on "dealloc" you need to release all your retained objects
- (void) dealloc
{
[super dealloc];
}
@end
iPhone 拍摄屏幕快照
UIGraphicsBeginImageContext(webview.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);
iPhone 轻松实现获取数据持久性的文档目录路径的功能
- (NSString *)documentsDirectory
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return documentsDirectory;
}
iPhone iPhone解天极??é??žUTF-8CS“XML
åšiPhone的网络应用,处ç†XML是家常便é¥ï¼ŒNSXMLParser用起æ¥è¿˜æ˜¯å¾—心应手的。ä¸è¿‡è¿™ä¸ªä¸œè¥¿ï¼Œå¤„ç†éžUTF-8,会解æžå¤±è´¥ã€‚è¿™ç¯‡æ–‡ç« å°±æ˜¯æƒ³å’Œå¤§å®¶ä¸€èµ·åˆ†äº«ä¸€äº›è¿™æ–¹é¢å¼€å‘的新的。
我们在æŸä¸ªRSS地å€ï¼Œå¯ä»¥å¾—到下é¢è¿™æ ·çš„XML文件。我这里åªæ˜¯æˆªå–一段,
---------------------------------------
<?xml version="1.0" encoding="big5"?>
<rss version="2.0">
<channel>
<title>RTHK On Internet - å³ æ™‚ æ–° èž</title>
<link><![CDATA[http://www.rthk.org.hk/rthk/news/expressnews/]]></link>
<description>RTHK On Internet - å³ æ™‚ æ–° èž</description>
<pubDate>Sun, 11 Oct 2009 15:02:02 +0800</pubDate>
<item>
<title><![CDATA[&#34910;生署è¦æ±‚浸會醫院4周內 就產婦æ»äº¡å€‹æ¡ˆæäº¤å ±å‘Š ]]></title>
<link><![CDATA[http://www.rthk.org.hk/rthk/news/expressnews/20091011/news_20091011_55_618483.htm]]></link>
<description><![CDATA[
&#34910;生署昨晚已經收到浸會醫院通知,有一宗產婦æ»äº¡å€‹æ¡ˆï¼Œæµ¸æœƒé†«é™¢éœ€è¦åœ¨4星期內å‘&#34910;生署æäº¤å ±å‘Šï¼Œæ¡ˆä»¶äº¦äº¤ç”±æ»å› åºè·Ÿé€²ã€‚
&#34910;生署數å—顯示,由07年至今年8月,共接ç²97å®—ç§å®¶é†«é™¢é†«ç™‚äº‹æ•…çš„é€šå ±ã€‚åŽ»å¹´ç™¼ç”Ÿçš„äº‹æ•…ä¸ï¼Œæœ€å¤šçš„是進行手術或介入程åºæœŸé–“出ç¾ä½µç™¼ç—‡ï¼Œå…¶æ¬¡é‚„有å•å©¦åŠç”¢å©¦æ»äº¡ï¼Œæˆ–與å•å©¦åœ¨åˆ†å¨©éŽç¨‹ä¸ï¼Œç”Ÿç”¢æ™‚,或產後出ç¾åš´é‡ä½µç™¼ç—‡ï¼›éƒ¨ä»½å‰‡åŒ…括åˆç”Ÿå¬°å…’出ç¾æ»äº¡æˆ–åš´é‡å—傷;錯誤為病人或身體部ä½é€²è¡Œå¤–科或介入手術程åºç‰ã€‚
]]></description>
<pubDate>
Sun, 11 Oct 2009 14:50:46 +0800
</pubDate>
</item>
</channel>
</rss>
----------------------------------------
这是一个很常用的RSS返回的XML,是ç¹ä½“ä¸æ–‡çš„,编ç æ ¼å¼æ˜¯big5。说编ç æ ¼å¼æ˜¯big5有两层æ„æ€ï¼š
[1] 网络æµè¿”回的NSData是big5ç¼–ç çš„ã€‚æ‰€ä»¥è¿™æ ·çš„NSDataé€ç»™NSXMLParser是ä¸èƒ½æ£ç¡®è§£æžçš„。
[2] 第一å¥è¯æŒ‡æ˜Žäº†XML文件也是用big5ç¼–ç 的。
对应于上é¢ä¸¤ä¸ªé—®é¢˜ï¼Œæˆ‘的解决æ€è·¯æ˜¯ï¼š
[1] 把Big5ç¼–ç çš„NSData转æ¢æˆUTF-8ç¼–ç çš„NSData
[2] 将第一行<?xml version="1.0" encoding="big5"?>转æ¢æˆ<?xml version="1.0" encoding="utf-8"?>
第二个转æ¢ä¸éš¾ï¼Œåªè¦æˆ‘们有NSString对象。第一个转æ¢è¦ç”¨åˆ°CFStringRef,代ç 如下:
Cpp代ç
CFStringRef big5Str = CFStringCreateWithBytes(NULL,
[inData bytes],
[inData length],
kCFStringEncodingBig5_HKSCS_1999,
false); //[A]
if (NULL == big5Str) {
return nil;
}
else {
NSString *big5NSString = (NSString *)big5Str;
NSString *utf8NSString = [big5NSString stringByReplacingOccurrencesOfString:@"<?xml version=\"1.0\" encoding=\"big5\"?>"
withString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"]; //[B]
return [utf8NSString dataUsingEncoding:NSUTF8StringEncoding]; //[C]
}
CFStringRef big5Str = CFStringCreateWithBytes(NULL,
[inData bytes],
[inData length],
kCFStringEncodingBig5_HKSCS_1999,
false); //[A]
if (NULL == big5Str) {
return nil;
}
else {
NSString *big5NSString = (NSString *)big5Str;
NSString *utf8NSString = [big5NSString stringByReplacingOccurrencesOfString:@"<?xml version=\"1.0\" encoding=\"big5\"?>"
withString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"]; //[B]
return [utf8NSString dataUsingEncoding:NSUTF8StringEncoding]; //[C]
} æ€è·¯å°±æ˜¯å…ˆæŠŠNSData转æˆCFStringRef的对象[A], 然åŽè¿™ä¸ªå¯¹è±¡å†è½¬æˆUTF-8çš„NSData [C],这就解决了问题[1]
ä¸é—´çš„[B]就解决了问题[2]。这里è¦æ³¨æ„两个问题:
(1ï¼‰å¦‚æžœä½ çš„XMLç¼–ç 是GBK,或者GB23120或者其他的,kCFStringEncodingBig5_HKSCS_1999è¦æ¢æˆä½ 对应的编ç æ–¹å¼ã€‚
(2)å¦‚æžœä½ çš„XMLç¼–ç 也是big5的,也许kCFStringEncodingBig5_HKSCS_1999并ä¸é€‚åˆä½ çš„åº”ç”¨ã€‚å› ä¸ºå¯¹åº”big5çš„ç¼–ç 常é‡è¿˜æœ‰ä¸¤ç§ï¼Œä»–们是:
kCFStringEncodingBig5_E
kCFStringEncodingBig5。
è¿™ä¸ªä½ å¯ä»¥æŸ¥é˜…帮助文档,然åŽä¸€ä¸ªä¸ªè¯•ã€‚
然åŽæŠŠreturnçš„NSDataé€åˆ°NSXMLParser,就å¯ä»¥æ£ç¡®è§£æžäº†ã€‚å¯æ˜¯è¿˜æ²¡æœ‰ç»“æŸï¼Œå¤§å®¶ä»”细看看XML文件里é¢è¿˜æœ‰&#34910è¿™æ ·çš„ä¸œè¥¿ã€‚è¿™ä¸ªæ˜¯ç¹ä½“ä¸æ–‡â€è¡›â€œå—,我们如果ä¸å¤„ç†è¿™ä¸ªä¸œè¥¿ï¼Œæ˜¾ç¤ºç»™ç”¨æˆ·çœ‹å¾—就是&#34910,这显然是ä¸è¡Œçš„。这个其实也好办,åªéœ€è¦ç”¨ä¸‹é¢è¿™å¥è¯å°±å¯ä»¥æŠŠä¸€ä¸ªnumber转æˆNSString了:
[NSString stringWithFormat:@"%C", number]
这个number就是34910,是一个整数,å进制的整数(ä¸æ˜¯åå…进制的)。到这里,整个处ç†è¿‡ç¨‹å°±OK了,我们就å¯ä»¥æ£ç¡®å¾—到Big5çš„RSSæ–°é—»äº†ã€‚å› ä¸ºè¿™æ˜¯ä¸€ä¸ªå®¢æˆ·é¡¹ç›®ï¼Œä¸è¿‡æˆ‘å¯ä»¥ç»™å„å°æˆªå›¾å¤§å®¶çœ‹çœ‹ï¼š
iPhone 从您的代码启动Safari
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"http://www.google.co.uk"]];