ios开发中的tips(1)

iphone开发笔记

退回输入键盘

- (BOOL) textFieldShouldReturn:(id)textField{

[textField  resignFirstResponder];

}

CGRect

CGRect frame = CGRectMake (origin.x, origin.y, size.width, size.height);矩形

NSStringFromCGRect(someCG)把CGRect结构转变为格式化字符串;

CGRectFromString(aString)由字符串恢复出矩形;

CGRectInset(aRect)创建较小或较大的矩形(中心点相同),+较小-较大

CGRectIntersectsRect(rect1, rect2)判断两矩形是否交叉,是否重叠

CGRectZero高度和宽度为零的/位于(0,0)的矩形常量

CGPoint & CGSize

CGPoint aPoint = CGPointMake(x, y);

CGSize aSize = CGSizeMake(width, height);

设置透明度

[myView setAlpha:value];   (0.0 < value < 1.0)

设置背景色

[myView setBackgroundColor:[UIColor redColor]];

(blackColor;darkGrayColor;lightGrayColor;

whiteColor;grayColor; redColor; greenColor;

blueColor; cyanColor;yellowColor;

magentaColor;orangeColor;purpleColor;

brownColor; clearColor; )

自定义颜色

UIColor *newColor = [[UIColor alloc]

initWithRed:(float) green:(float) blue:(float) alpha:(float)];

0.0~1.0

竖屏

320X480

横屏

480X320

状态栏高(显示时间和网络状态)

20像素

导航栏、工具栏高(返回)

44像素

隐藏状态栏

[[UIApplication shareApplication] setStatusBarHidden: YES animated:NO]

横屏

[[UIApplication shareApplication]

setStatusBarOrientation:UIInterfaceOrientationLandscapeRight].

屏幕变动检测

orientation == UIInterfaceOrientationLandscapeLeft

全屏

window=[[UIWindow alloc] initWithFrame:[UIScreen mainScreen] bounds];

自动适应父视图大小:

aView.autoresizingSubviews = YES;

aView.autoresizingMask = (UIViewAutoresizingFlexibleWidth |

UIViewAutoresizingFlexibleHeight);

定义按钮

UIButton *scaleUpButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

[scaleUpButton setTitle:@"放 大" forState:UIControlStateNormal];

scaleUpButton.frame = CGRectMake(40, 420, 100, 40);

[scaleUpButton addTarget:self

action:@selector(scaleUp)

forControlEvents:UIControlEventTouchUpInside];

设置视图背景图片

UIImageView *aView;

[aView setImage:[UIImage imageNamed:@”name.png”]];

view1.backgroundColor = [UIColor colorWithPatternImage:

[UIImage imageNamed:@"image1.png"]];

自定义UISlider的样式和滑块

我们使用的是UISlider的setMinimumTrackImage,和setMaximumTrackImage方法来定义图片的,这两个方法可以设置滑块左边和右边的图片的,不过如果用的是同一张图片且宽度和控件宽度基本一致,就不会有变形拉伸的后果,先看代码,写在viewDidLoad中:

//左右轨的图片

UIImage *stetchLeftTrack= [UIImage imageNamed:@"brightness_bar.png"];

UIImage *stetchRightTrack = [UIImage imageNamed:@"brightness_bar.png"];

//滑块图片

UIImage *thumbImage = [UIImage imageNamed:@"mark.png"];

UISlider *sliderA=[[UISlider alloc]initWithFrame:CGRectMake(30, 320, 257, 7)];

sliderA.backgroundColor = [UIColor clearColor];

sliderA.value=1.0;

sliderA.minimumValue=0.7;

sliderA.maximumValue=1.0;

[sliderA setMinimumTrackImage:stetchLeftTrack forState:UIControlStateNormal];

[sliderA setMaximumTrackImage:stetchRightTrack forState:UIControlStateNormal];

//注意这里要加UIControlStateHightlighted的状态,否则当拖动滑块时滑块将变成原生的控件

[sliderA setThumbImage:thumbImage forState:UIControlStateHighlighted];

[sliderA setThumbImage:thumbImage forState:UIControlStateNormal];

//滑块拖动时的事件

[sliderA addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];

//滑动拖动后的事件

[sliderA addTarget:self action:@selector(sliderDragUp:) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:sliderA];

为了大家实验方便,我附上背景图brightness_bar.png和滑块图mark.png

http://pic002.cnblogs.com/images/2011/162291/2011121611431816.png

http://pic002.cnblogs.com/images/2011/162291/2011121611432897.png

-(IBAction)sliderValueChanged:(id)sender{

UISlider *slider = (UISlider *) sender;

NSString *newText = [[NSString alloc] initWithFormat:@”%d”, (int)(slider.value + 0.5f)];

label.text = newText;

}

活动表单

- (IBActive) someButtonPressed:(id) sender

{

UIActionSheet *actionSheet = [[UIActionSheet alloc]

initWithTitle:@”Are you sure?”

delegate:self

cancelButtonTitle:@”No way!”

destructiveButtonTitle:@”Yes, I’m Sure!”

otherButtonTitles:nil];

[actionSheet showInView:self.view];

[actionSheet release];

}

警告视图

- (void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger) buttonIndex

{

if(buttonIndex != [actionSheet cancelButtonIndex])

{

NSString *message = [[NSString alloc] initWithFormat:@”You can

breathe easy, everything went OK.”];

UIAlertView *alert = [[UIAlertView alloc]

initWithTitle:@”Something was done”

message:message

delegate:self

cancelButtonTitle:@”OK”

otherButtonTitles:nil];

[alert show];

[alert release];

[message release];

}

}

动画效果

-(void)doChange:(id)sender

{

if(view2 == nil)

{

[self loadSec];

}

[UIView beginAnimations:nil context:NULL];

[UIView setAnimationDuration:1];

[UIView setAnimationTransition:([view1

superview]?UIViewAnimationTransitionFlipFromLeft:UIViewAnimationTransitionFlipFromRight)forView:self.view

cache:YES];

if([view1 superview]!= nil)

{

[view1 removeFromSuperview];

[self.view addSubview:view2];

}else {

[view2 removeFromSuperview];

[self.view addSubview:view1];

}

[UIView commitAnimations];

}

Table View  

#pragma mark -

#pragma mark Table View Data Source Methods

//指定分区中的行数,默认为1

- (NSInteger)tableView:(UITableView *)tableView

numberOfRowsInSection:(NSInteger)section

{

return [self.listData count];

}

//设置每一行cell显示的内容

- (UITableViewCell *)tableView:(UITableView *)tableView

cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *SimpleTableIndentifier = @"SimpleTableIndentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIndentifier];

if (cell == nil) {

cell = [[[UITableViewCell alloc]

initWithStyle:UITableViewCellStyleSubtitle

reuseIdentifier:SimpleTableIndentifier]

autorelease];

}

UIImage *image = [UIImage imageNamed:@"13.gif"];

cell.imageView.image = image;

NSUInteger row = [indexPath row];

cell.textLabel.text = [listData objectAtIndex:row];

cell.textLabel.font = [UIFont boldSystemFontOfSize:20];

if(row < 5)

cell.detailTextLabel.text = @"Best friends";

else

cell.detailTextLabel.text = @"friends";

return cell;

}

图像、文本标签和详细文本标签

图像:如果设置图像,则它显示在文本的左侧; 文本标签:这是单元的主要文本(UITableViewCellStyleDefault 只显示文本标签);详细文本标签:这是单元的辅助文本,通常用作解释性说明或标签

UITableViewCellStyleSubtitle

UITableViewCellStyleDefault

UITableViewCellStyleValue1

UITableViewCellStyleValue2

#pragma mark -

#pragma mark Table View Delegate Methods

//把每一行缩进级别设置为其行号

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath

{

NSUInteger row = [indexPath row];

return row;

}

//获取传递过来的indexPath值

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

NSUInteger row = [indexPath row];

if (row == 0)

return nil;

return indexPath;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

NSUInteger row = [indexPath row];

NSString *rowValue = [listData objectAtIndex:row];

NSString *message = [[NSString alloc] initWithFormat:@"You selected %@",rowValue];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Row Selected"

message:message

delegate:nil

cancelButtonTitle:@"Yes, I did!"

otherButtonTitles:nil];

[alert show];

[alert release];

[message release];

[tableView deselectRowAtIndexPath:indexPath animated:YES];

}

//设置行的高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

return 40;

}

NavigationController推出push推出pop

[self.navigationController pushViewController:_detailController animated:YES];

[self.navigationController popViewControllerAnimated:YES];

Debug:

NSLog(@"%s %d", __FUNCTION__, __LINE__);

点击textField外的地方回收键盘

先定义一个UIControl类型的对象,在上面可以添加触发事件,令SEL实践为回收键盘的方法,最后将UIControl的实例加到当前View上。

UIControl *m_control = [[UIControl alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

[m_control addTarget:self action:@selector(keyboardReturn)

forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:m_control];

- (void) keyboardReturn

{

[aTextField resignFirstResponder];

}

键盘覆盖输入框

当键盘调出时将输入框覆盖时,可以用下方法:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

{

[self.view setFrame:CGRectMake(0, -100, 320, 480) ];

return YES;

}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField

{

[self.view setFrame:CGRectMake(0, 0, 320, 480)];

return YES;

}

当准备输入时,将视图的位置上调100,这样键盘就不能覆盖到输入框。

当依赖注入方法不好使时,可以在AppDelegate内申明一个全局的控制器实例_anotherViewController,在另一个需要使用_anotherViewController的地方定义以下委托方法,使用共享的UIApplication实例来获取该委托的引用

SomeAppDelegate *appDelegate = (SomeAppDelegate *)[[UIApplication sharedApplication] delegate];

_anotherViewController = appDelegate._anotherViewController;

UIViewController内建Table View

纯代码在UIViewController控制器内建Table View

@interfaceRootViewController : UIViewController  {

NSArray *timeZoneNames;

}

@property (nonatomic,retain) NSArray *timeZoneNames;

@end

(void) loadView

{

UITableView *tableView = [[UITableView alloc]

initWithFrame:[[UIScreen mainScreen] applicationFrame]] style:

UITableViewStylePlain];

tableView.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingWidth);

tableView.delegate = self;

tableView.dataSource = self;

[tableView reloadData];

self.view = tableView;

[tableView release];

}

将plist文件中的数据赋给数组

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"];

NSArray *array = [NSArray arrayWithContentsOfFile:thePath];

UITouch

手指的触摸范围:64X64

#pragma mark -

#pragma mark Touch Events

- (void)touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event {

originFrame = bookCover.frame;

NSLog(@"%s %d", __FUNCTION__,__LINE__);

if ([touches count] == 2)

{

NSArray *twoTouches = [touches allObjects];

UITouch *firstTouch = [twoTouches objectAtIndex:0];

UITouch *secondTouch = [twoTouches objectAtIndex:1];

CGPoint firstPoint = [firstTouch locationInView:bookCover];

CGPoint secondPoint = [secondTouch locationInView:bookCover];

CGFloat deltaX = secondPoint.x - firstPoint.x;

CGFloat deltaY = secondPoint.y - firstPoint.y;

initialDistance = sqrt(deltaX * deltaX + deltaY * deltaY );

frameX = bookCover.frame.origin.x;

frameY = bookCover.frame.origin.y;

frameW = bookCover.frame.size.width;

frameH = bookCover.frame.size.height;

NSLog(@"%s %d", __FUNCTION__,__LINE__);

}

}

- (void)touchesMoved:(NSSet *) touches withEvent:(UIEvent *) event {

if([touches count] == 2)

{

NSLog(@"%s %d", __FUNCTION__,__LINE__);

NSArray *twoTouches = [touches allObjects];

UITouch *firstTouch = [twoTouches objectAtIndex:0];

UITouch *secondTouch = [twoTouches objectAtIndex:1];

CGPoint firstPoint = [firstTouch locationInView:bookCover];

CGPoint secondPoint = [secondTouch locationInView:bookCover];

CGFloat deltaX = secondPoint.x - firstPoint.x;

CGFloat deltaY = secondPoint.y - firstPoint.y;

CGFloat currentDistance = sqrt(deltaX * deltaX + deltaY * deltaY );

if (initialDistance == 0) {

initialDistance = currentDistance;

}

else if (currentDistance != initialDistance)

{

CGFloat changedDistance = currentDistance - initialDistance;

NSLog(@"changedDistance = %f",changedDistance);

[bookCover setFrame:CGRectMake(frameX - changedDistance / 2,

frameY - (changedDistance * frameH) / (2 * frameW),

frameW + changedDistance,

frameH + (changedDistance * frameH) / frameW)];

}

}

}

- (void)touchesEnded:(NSSet *) touches withEvent:(UIEvent *) event {

UITouch *touch = [touches anyObject];

UITouch双击图片变大/还原

if ([touch tapCount] == 2)

{

NSLog(@"%s %d", __FUNCTION__,__LINE__);

if (!flag) {

[bookCover setFrame:CGRectMake(bookCover.frame.origin.x - bookCover.frame.size.width / 2,

bookCover.frame.origin.y - bookCover.frame.size.height / 2,

2 * bookCover.frame.size.width,

2 * bookCover.frame.size.height)];

flag = YES;

}

else {

[bookCover setFrame:CGRectMake(bookCover.frame.origin.x +

bookCover.frame.size.width / 4, bookCover.frame.origin.y +

bookCover.frame.size.height / 4,

bookCover.frame.size.width / 2, bookCover.frame.size.height / 2)];

flag = NO;

}

}

}

Get the Location of Touches

(CGPoint)locationInView:(UIView *)view

(CGPoint)previousLocationInView:(UIView *)view

view window

Getting Touch Attributes

tapCount(read only) timestamp(read only) phase(read only)

Getting a Touch Object's Gesture Recognizers

gestureRecognizers

Touch Phase

UITouchPhaseBegan

UITouchPhaseMoved

UITouchPhaseStationary

UITouchPhaseEnded

UITouchPhaseCancelled

从Plist里读内容

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"book" ofType:@"plist"];

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

NSString *book = [dictionary objectForKey:bookTitle];

[textView setText:book];

(void) initialize {

NSUserDefaults = [NSUserDefaults standardUserDefaults];

NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"YES" forKey:@"DeleteBackup"];

[defaults registerDefaults:appDefaults];

}

To get a value of a default, use the valueForKey: method:

[[theDefaultsController values] valueForKey:@"userName"];

To set a value for a default, use setValue:forKey:

[[theDefaultsController values] setValue:newUserName forKey:@"userName"];

[[NSUserDefaults standardUserDefaults] setValue:aVale forKey:aKey];

[[NSUserDefaults standardUserDefaults] valueForKey:aKey];

获取Documents目录

NSArray *paths = NSSearchPathForDictionariesInDomains(NSDocumentDirectory,

NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *filename = [documentsDirectory

stringByAppendingPathComponent:@"theFile.txt"];

获取tmp目录

NSString *tempPath = NSTemporaryDirectory();

NSString *tempFile = [tempPath stringByAppendingPathComponent:@"tempFile.txt"];

[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"someKey"];

[[NSUserDefaults standardUserDefaults] objectForKey:aKey];

自定义NavigationBar

navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];

[navigationBar setBarStyle:UIBarStyleBlackOpaque];

myNavigationItem = [[UINavigationItem alloc] initWithTitle:@"Setting"];

[navigationBar setItems:[NSArray arrayWithObject:myNavigationItem]];

[self.view addSubview:navigationBar];

backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(back)];

myNavigationItem.leftBarButtonItem = backButton;

利用Safari打开一个链接

NSURL *url = [NSURL URLWithString:@"http://www.cnblogs.com/tracy-e/"];

[[UIApplication sharedApplication] openURL:url];

利用UIWebView显示pdf文件、网页。。。

webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

[webView setDelegate:self];

[webView setScalesPageToFit:YES];

[webView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];

[webView setAllowsInlineMediaPlayback:YES];

[self.view addSubview:webView];

NSString *pdfPath = [[NSBundle mainBundle] pathForResource:@"ojc" ofType:@"pdf"];

NSURL *url = [NSURL fileURLWithPath:pdfPath];

NSURLRequest *request = [NSURLRequest requestWithURL:url

cachePolicy:NSURLRequestUseProtocolCachePolicy

timeoutInterval:5];

[webView loadRequest:request];

[myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL

URLWithString: @"http://www.cnblogs.com/tracy-e/"]]];

NSString *errorString = [NSString stringWithFormat:@"

+5 color ='red'>An Error Occurred:
%@",error];

[myWebView loadHTMLString:errorString baseURL:nil];

//Stopping a load request when the view is to disappear

- (void)viewWillDisappear:(BOOL)animate{

if ([myWebView loading]){

[myWebView stopLoading];

}

myWebView.delegate = nil;

[UIApplication shareApplication].networkActivityIndicatorVisible = NO;

}

汉字转码

NSString *oriString = @"\\u67aa\\u738b";

NSString *escapedString = [oriString

stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding];

Checking for background support on earlier versions of iOS

UIDevice *device = [UIDevice currentDevice];

BOOL backgroundSupported = NO;

if ([device respondsToSelector:@selector(isMultitaskingSupported)]){

backgroundSupported = device.multitaskingSupported;

}

Being a Responsible,Multitasking-Aware Application

# Do not make any OpenGL ES calls from your code.

# Cancel any Bonjour-related services before being suspended.

# Be prepared to handle connection failures in your network-based sockets.

# Save your application state before moving to the background.

# Release any unneeded memory when moving to the background.

# Stop using shared system resources before being suspended.

# Avoid updating your windows and views.

# Respond to connect and disconnect notification for external accessories.

# Clean up resource for active alerts when moving to the background.

# Remove sensitive information from views before moving to the background.

# Do minimal work while running in the background.

Handing the Keyboard notifications

//Call this method somewhere in your view controller setup code

- (void) registerForKeyboardNotifications{

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(keyboardWasShown:)

name:UIKeyboardDidShowNotification

object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(keyboardWasHidden:)

name:UIKeyboardDidHideNotification

object:nil];

}

//Called when the UIKeyboardDidShowNotification is sent

- (void)keyboardWasShown:(NSNotification *) aNotification{

if(keyboardShown)

return;

NSDictionary *info = [aNotification userInfo];

//get the size of the keyboard.

NSValue *aValue = [info objectForKey:UIKeyboardFrameBeginUserInfoKey];

CGSize keyboardSize = [aValue CGRectValue].size;

//Resize the scroll view

CGRect viewFrame = [scrollView frame];

viewFrame.size.height -= keyboardSize.height;

//Scroll the active text field into view

CGRect textFieldRect = [activeField frame];

[scrollView scrollRectToVisible:textFieldRect animated:YES];

keyboardShown = YES;

}

//Called when the UIKeyboardDidHideNotification is sent

- (void)keyboardWasHidden:(NSNotification *) aNotification{

NSDictionary *info = [aNotification userInfo];

//Get the size of the keyboard.

NSValue *aValue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];

CGSize keyboardSize = [aValue CGRectValue].size;

//Reset the height of the scroll view to its original value

CGRect viewFrame = [scrollView Frame];

viewFrame.size.height += keyboardSize.height;

scrollView.frame = viewFrame;

keyboardShown = NO;

}

点击键盘的next按钮,在不同的textField之间换行

//首先给不同的textField赋不同的且相邻的tag值

- (BOOL)textFieldShouldReturn:(UITextField *)textField

{

if ([textField returnKeyType] != UIReturnKeyDone)

{

NSInteger nextTag = [textField tag] + 1;

UIView *nextTextField = [[self tableView] viewWithTag:nextTag];

[nextTextField becomeFirstResponder];

}

else {

[textField resignFirstResponder];

}

return YES;

}

Configuring a date formatter

- (void)viewDidLoad {

[super viewDidLoad];

dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setGeneratesCalendarDates:YES];

[dateFormatter setLocale:[NSLocale currentLocale]];

[dateFormatter setCalendar:[NSCalendar autoupdatingCurrentCalendar]];

[dateFormatter setTimeZone:[NSTimeZone defaultTimeZone]];

[dateFormatter setDateStyle:NSDateFormatterShortStyle];

DOB.placeholder = [NSString stringWithFormat:@"Example: %@",[dateFormatter stringFromDate:[NSDate date]]];

}

- (void)textFieldDidEndEditing:(UITextField *)textField{

[textField resignFirstResponder];

if ([textField.text isEqualToString:@""])

return;

switch (textField.tag){

case DOBField:

NSDate *theDate = [dateFormatter dateFromString:textField.text];

if (theDate)

[inputDate setObject:theDate forKey:MyAppPersonDOBKey];

break;

default:

break;

}

}

tableView的cell高度

tableView的cell高度除了在delegate中指定外,还可以在任意位置以[tableView setRowHeight:44]的方式指定

[[self navigationItem] setLeftBarButtonItem:[self editButtonItem]];

- (void)setEditing:(BOOL)editing animated:(BOOL)animated{

[super setEditing:editing animated:animated];

if (editing){

......

}

else{

......

}

}

One added a subview to a view, release the subview to avoid

the extra retain count of it, Because when you insert a view as a

subview using addSubview:, the subview is retained by its superview.

When you remove the subview from its superview using the

removeFromSuperview: method, subview is autoreleased.

为UINavigationBar设置背景图片

在iPhone开发中,有时候我们想给导航条添加背景图片,实现多样化的导航条效果,用其他方法往往无法达到理想的效果,经过网上搜索及多次实验,确定如下最佳实现方案:

为UINavigatonBar增加如下Category(类别:提供一种为某个类添加方法而又不必编写子类的途径,类别只能添加成员函数,不能添加数据成员):

@implementation UINavigationBar (CustomImage)

- (void)drawRect:(CGRect)rect {

UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];

[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];

}

@end

例如,在我的项目中,添加如下代码:

/////////////////////////////////////////////////////////

/* input: The image and a tag to later identify the view */

@implementation UINavigationBar (CustomImage)

- (void)drawRect:(CGRect)rect {

UIImage *image = [UIImage imageNamed: @"title_bg.png"];

[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];

}

@end

/////////////////////////////////////////////////////////

@implementation FriendsPageViewController

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad {

self.navigationBar.tintColor = [UIColor purpleColor];

[self initWithRootViewController:[[RegPageViewController alloc] init]];

[super viewDidLoad];

}

......

实现的效果如下图:

转载,原文地址http://blog.csdn.net/wave_1102/archive/2009/11/04/4768212.aspx

为UINavigationBar添加自定义背景

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {

//颜色填充

//  UIColor *color = [UIColor redColor];

//  CGContextRef context = UIGraphicsGetCurrentContext();

//  CGContextSetFillColor(context, CGColorGetComponents( [color CGColor]));

//  CGContextFillRect(context, rect);

//  self.tintColor = color;

//图片填充

UIColor *color = [UIColor colorWithRed:46.0f/255.0f

green:87.0f/255.0f blue:29.0f/255.0f alpha:1.0f];

UIImage *img    = [UIImage imageNamed: @"bg.png"];

[img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];

self.tintColor = color;

}

@end

加载图片要及时release

你还在使用myImage = [UIImage imageNamed:@"icon.png"]; 吗?

如题,是不是大家为了方便都这样加载图片啊

myImage = [UIImage imageNamed:@"icon.png"];

那么小心了

这种方法在一些图片很少,或者图片很小的程序里是ok的。

但是,在大量加载图片的程序里,请千万不要这样做。

为什么呢 ???????

这种方法在application bundle的顶层文件夹寻找由供应的名字的图象。 如果找到图片,装载到iPhone系统缓存图象。那意味图片是(理论上)放在内存里作为cache的。

试想你图片多了,是什么后果?

图片cache极有可能不会响应memory warnings and release its objects

所以,用图片的时候一定要小心的alloc和release。

推荐使用NSString *path = [[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png"];

myImage = [UIImage imageWithContentsOfFile:path];

// Todo use of myImage

[myImage release];

From:http://www.cocoachina.com/bbs/simple/?t27420.html

uiwebview打开doc,pdf文件

UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 55, 320, 300)];

webView.delegate = self;

webView.multipleTouchEnabled = YES;

webView.scalesPageToFit = YES;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *docPath = [documentsDirectory stringByAppendingString:@"/doc2003_1.doc"];    NSLog(@"#######%@",docPath);

NSURL *url = [NSURL fileURLWithPath:docPath];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

[webView loadRequest:request];

[self.view addSubview:webView];

[webView release];

From:http://blog.csdn.net/dadalan/archive/2010/10/22/5959301.aspx

iPhone游戏中既播放背景音乐又播放特效声音的办法

有时候在iPhone游戏中,既要播放背景音乐,同时又要播放比如枪的开火音效。此时您可以试试以下方法

NSString *musicFilePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"wav"];       //创建音乐文件路径

NSURL *musicURL = [[NSURL alloc] initFileURLWithPath:musicFilePath];

AVAudioPlayer* musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:musicURL error:nil];

[musicURL release];

[musicPlayer prepareToPlay];

//[musicPlayer setVolume:1];            //设置音量大小

//musicPlayer .numberOfLoops = -1;//设置音乐播放次数-1为一直循环

要导入框架AVFoundation.framework,头文件中#import ;做成类的话则更方便。

From:http://blog.csdn.net/dadalan/archive/2010/10/19/5950493.aspx

NSNotificationCenter用于增加回调函数

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(_willBecomeActive)

name:UIApplicationDidBecomeActiveNotification object:nil];

UINavigationBar 背景Hack

LOGO_320×44.png图片显示在背景上,

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {

//加入旋转坐标系代码

// Drawing code

UIImage *navBarImage = [UIImage imageNamed:@"LOGO_320×44.png"];

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextTranslateCTM(context, 0.0, self.frame.size.height);

CGContextScaleCTM(context, 1.0, -1.0);

CGPoint center=self.center;

CGImageRef cgImage= CGImageCreateWithImageInRect(navBarImage.CGImage, CGRectMake(0, 0, 1, 44));

CGContextDrawImage(context, CGRectMake(center.x-160-80, 0, 80, self.frame.size.height), cgImage);

CGContextDrawImage(context, CGRectMake(center.x-160, 0, 320, self.frame.size.height), navBarImage.CGImage);

CGContextDrawImage(context, CGRectMake(center.x+160, 0, 80, self.frame.size.height), cgImage);

}

@end

old code

CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), navBarImage.CGImage);

hack过logo不再拉伸

From:http://blog.163.com/fengyi1103@126/blog/static/13835627420106279102671/

清除电话号码中的其他符号(源码)

最近从通讯录读取电话号码,读出得号码如:134-1814-****。

而我需要的为11位纯数字,一直找方法解决此问题,今天终于找到了。。

分享一下……

代码如下:

NSString *originalString = @"(123) 123123 abc";

NSMutableString *strippedString = [NSMutableString

stringWithCapacity:originalString.length];

NSScanner *scanner = [NSScanner scannerWithString:originalString];

NSCharacterSet *numbers = [NSCharacterSet

characterSetWithCharactersInString:@"0123456789"];

while ([scanner isAtEnd] == NO) {

NSString *buffer;

if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {

[strippedString appendString:buffer];

}

// --------- Add the following to get out of endless loop

else {

[scanner setScanLocation:([scanner scanLocation] + 1)];

}

// --------- End of addition

}

NSLog(@"%@", strippedString); // "123123123"

From:http://stackoverflow.com/questions/1129521/remove-all-but-numbers-from-nsstring

正则判断:字符串只包含字母和数字

NSString *mystring = @"Letter1234";

NSString *regex = @"[a-z][A-Z][0-9]";

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

if ([predicate evaluateWithObject:mystring] == YES) {

//implement

}

一行代码设置 UITableViewCell 与导航条间距

UITableView的cell默认出现在uitableview的第一行,如果你想自定义UITableViewCell与导航条间距的话,可以使用下面这行代码

tableview.tableHeaderView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)]autorelease];

From:http://blog.163.com/fengyi1103@126/blog/static/1383562742010101611107492/

修改 UITableview 滚动条颜色的方法

UITableview的滚动条默认颜色是黑色的,如果UItableview背景也是深颜色,则滚动条会变的很不明显。您可以用下面这行代码来改变滚动条的颜色

self.tableView.indicatorStyle=UIScrollViewIndicatorStyleWhite;

当然,最后的 “White” 也可以换成其它颜色。

下文件之前获取到文件大小的代码

下面这段代码,能实现在下载文件之前获得文件大小,应用在软件里,能在很大程度上改善用户体验

[m_pASIHTTPRequest setDidReceiveResponseHeadersSelector:@selector(didReceiveResponseHeaders:)];

- (void)didReceiveResponseHeaders:(ASIHTTPRequest *)request

{

NSLog(@"didReceiveResponseHeaders %@",[m_request.responseHeaders valueForKey:@"Content-Length"]);

网络编程总结 iphone

一:确认网络环境3G/WIFI

1.添加源文件和framework

开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审(我们的)查的。

Apple的 例程Reachability中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部:

1.1.添加源文件:

在你的程序中使用Reachability只须将该例程中的Reachability.h和Reachability.m拷贝到你的工程中。如下图:

1.2.添加framework:

将SystemConfiguration.framework添加进工程。如下图:

2.网络状态

Reachability.h中定义了三种网络状态:

typedef enum {

NotReachable = 0,            //无连接

ReachableViaWiFi,            //使用3G/GPRS网络

ReachableViaWWAN            //使用WiFi网络

} NetworkStatus;

因此可以这样检查网络状态:

Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”];

switch ([r currentReachabilityStatus]) {

case NotReachable:

//没有网络连接

break;

case ReachableViaWWAN:

//使用3G网络

break;

case ReachableViaWiFi:

//使用WiFi网络

break;

}

3.检查当前网络环境

程序启动时,如果想检测可用的网络环境,可以像这样

//是否wifi

+ (BOOL) IsEnableWIFI {

return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);

}

//是否3G

+ (BOOL) IsEnable3G {

return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);

}

例子:

- (void)viewWillAppear:(BOOL)animated {

if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) &&

([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) {

self.navigationItem.hidesBackButton = YES;

[self.navigationItem setLeftBarButtonItem:nil animated:NO];

}

}


[mySearchBar release];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,477评论 1 14
  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,648评论 2 7
  • 1、设置UILabel行间距 NSMutableAttributedString* attrString = [[...
    FF_911阅读 1,361评论 0 3
  • 1.NSTimer //暂停if ([timer isValid]) {[timer setFireDate:[N...
    俊月阅读 1,321评论 0 0
  • 今天正式动笔写在得到app购买的《通向财富自由之路》学习笔记,暂时还没想好怎么写,怎么编排,anyway,新出发吧...
    feiben阅读 289评论 0 1