美文网首页
ios开发中的tips(1)

ios开发中的tips(1)

作者: 爱易寒曲易散 | 来源:发表于2016-06-27 21:54 被阅读87次

    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];

    相关文章

      网友评论

          本文标题:ios开发中的tips(1)

          本文链接:https://www.haomeiwen.com/subject/rulhhttx.html