IOS开发笔记

  1. 云栖社区>
  2. 博客>
  3. 正文

IOS开发笔记

技术小美 2017-11-08 13:02:00 浏览886
展开阅读全文
   1 iphone开发笔记    2     3 退回输入键盘    4   - (BOOL) textFieldShouldReturn:(id)textField{    5     [textField  resignFirstResponder];    6 }    7      8 CGRect    9 CGRect frame = CGRectMake (origin.x, origin.y, size.width, size.height);矩形   10 NSStringFromCGRect(someCG) 把CGRect结构转变为格式化字符串;   11 CGRectFromString(aString) 由字符串恢复出矩形;   12 CGRectInset(aRect) 创建较小或较大的矩形(中心点相同),+较小  -较大   13 CGRectIntersectsRect(rect1, rect2) 判断两矩形是否交叉,是否重叠   14 CGRectZero 高度和宽度为零的/位于(00)的矩形常量   15     16 CGPoint & CGSize   17 CGPoint aPoint = CGPointMake(x, y);       18 CGSize aSize = CGSizeMake(width, height);   19     20 设置透明度   21 [myView setAlpha:value];   (0.0 < value < 1.0)   22    23 设置背景色    24 [myView setBackgroundColor:[UIColor redColor]];    25  (blackColor;darkGrayColor;lightGrayColor;   26 whiteColor;grayColor; redColor; greenColor;    27 blueColor; cyanColor;yellowColor;   28 magentaColor;orangeColor;purpleColor;   29 brownColor; clearColor; )   30    31 自定义颜色   32 UIColor *newColor = [[UIColor alloc]   33  initWithRed:(float) green:(float) blue:(float) alpha:(float)];    34      0.0~1.0   35    36 竖屏   37 320X480   38    39 横屏   40 480X320       41    42 状态栏高 (显示时间和网络状态)   43 20 像素      44    45 导航栏、工具栏高(返回)   46 44像素   47    48 隐藏状态栏   49 [[UIApplication shareApplication] setStatusBarHidden: YES animated:NO]   50     51 横屏   52 [[UIApplication shareApplication]    53 setStatusBarOrientation:UIInterfaceOrientationLandscapeRight].   54    55 屏幕变动检测   56 orientation == UIInterfaceOrientationLandscapeLeft   57    58 全屏   59 window=[[UIWindow alloc] initWithFrame:[UIScreen mainScreen] bounds];    60     61 自动适应父视图大小:   62 aView.autoresizingSubviews = YES;   63 aView.autoresizingMask = (UIViewAutoresizingFlexibleWidth |    64                        UIViewAutoresizingFlexibleHeight);   65     66  定义按钮   67 UIButton *scaleUpButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];   68 [scaleUpButton setTitle:@"放 大" forState:UIControlStateNormal];   69 scaleUpButton.frame = CGRectMake(40, 420, 100, 40);   70 [scaleUpButton addTarget:self   71  action:@selector(scaleUp)    72 forControlEvents:UIControlEventTouchUpInside];   73     74 设置视图背景图片   75 UIImageView *aView;   76 [aView setImage:[UIImage imageNamed:@”name.png”]];   77 view1.backgroundColor = [UIColor colorWithPatternImage:   78 [UIImage imageNamed:@"image1.png"]];   79     80 自定义UISlider的样式和滑块   81    82 我们使用的是UISlider的setMinimumTrackImage,和setMaximumTrackImage方法来定义图片的,这两个方法可以设置滑块左边和右边的图片的,不过如果用的是同一张图片且宽度和控件宽度基本一致,就不会有变形拉伸的后果,先看代码,写在 viewDidLoad中:   83     //左右轨的图片   84     UIImage *stetchLeftTrack= [UIImage imageNamed:@"brightness_bar.png"];   85     UIImage *stetchRightTrack = [UIImage imageNamed:@"brightness_bar.png"];   86     //滑块图片   87     UIImage *thumbImage = [UIImage imageNamed:@"mark.png"];   88        89     UISlider *sliderA=[[UISlider alloc]initWithFrame:CGRectMake(30, 320, 257, 7)];   90     sliderA.backgroundColor = [UIColor clearColor];   91     sliderA.value=1.0;   92     sliderA.minimumValue=0.7;   93     sliderA.maximumValue=1.0;   94        95     [sliderA setMinimumTrackImage:stetchLeftTrack forState:UIControlStateNormal];   96     [sliderA setMaximumTrackImage:stetchRightTrack forState:UIControlStateNormal];   97     //注意这里要加UIControlStateHightlighted的状态,否则当拖动滑块时滑块将变成原生的控件   98     [sliderA setThumbImage:thumbImage forState:UIControlStateHighlighted];   99     [sliderA setThumbImage:thumbImage forState:UIControlStateNormal];  100     //滑块拖动时的事件  101     [sliderA addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];  102     //滑动拖动后的事件  103     [sliderA addTarget:self action:@selector(sliderDragUp:) forControlEvents:UIControlEventTouchUpInside];  104       105     [self.view addSubview:sliderA];   106    107 为了大家实验方便,我附上背景图brightness_bar.png和滑块图mark.png  108 http://pic002.cnblogs.com/images/2011/162291/2011121611431816.png  109 http://pic002.cnblogs.com/images/2011/162291/2011121611432897.png  110   111  -(IBAction)sliderValueChanged:(id)sender{  112 UISlider *slider = (UISlider *) sender;  113 NSString *newText = [[NSString alloc] initWithFormat:@”%d”, (int)(slider.value + 0.5f)];  114 label.text = newText;  115 }  116    117 活动表单   118 <UIActionSheetDelegate>  119   120  - (IBActive) someButtonPressed:(id) sender  121 {  122     UIActionSheet *actionSheet = [[UIActionSheet alloc]   123                     initWithTitle:@”Are you sure?”  124                     delegate:self  125                     cancelButtonTitle:@”No way!”  126                     destructiveButtonTitle:@”Yes, I’m Sure!”  127                     otherButtonTitles:nil];  128     [actionSheet showInView:self.view];  129     [actionSheet release];  130 }  131    132 警告视图   133  <UIAlertViewDelegate>  134   135  - (void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger) buttonIndex  136 {  137      if(buttonIndex != [actionSheet cancelButtonIndex])  138      {  139           NSString *message = [[NSString alloc] initWithFormat:@”You can            140                    breathe easy, everything went OK.”];  141           UIAlertView *alert = [[UIAlertView alloc]      142                                initWithTitle:@”Something was done”  143                                 message:message  144                                 delegate:self  145                                 cancelButtonTitle:@”OK”  146                                 otherButtonTitles:nil];  147           [alert show];  148           [alert release];  149           [message release];  150      }  151 }  152    153 动画效果  154 -(void)doChange:(id)sender  155 {  156 if(view2 == nil)  157 {  158 [self loadSec];  159 }  160 [UIView beginAnimations:nil context:NULL];  161 [UIView setAnimationDuration:1];          162 [UIView setAnimationTransition:([view1 superview]?UIViewAnimationTransitionFlipFromLeft:UIViewAnimationTransitionFlipFromRight)forView:self.view cache:YES];  163      164     if([view1 superview]!= nil)  165 {  166 [view1 removeFromSuperview];  167 [self.view addSubview:view2];  168    169 }else {  170    171 [view2 removeFromSuperview];  172 [self.view addSubview:view1];  173 }  174 [UIView commitAnimations];  175 }  176    177 Table View   <UITableViewDateSource>  178 #pragma mark -  179 #pragma mark Table View Data Source Methods  180 //指定分区中的行数,默认为1  181 - (NSInteger)tableView:(UITableView *)tableView   182  numberOfRowsInSection:(NSInteger)section  183 {  184 return [self.listData count];  185 }  186    187 //设置每一行cell显示的内容  188 - (UITableViewCell *)tableView:(UITableView *)tableView   189 cellForRowAtIndexPath:(NSIndexPath *)indexPath  190 {  191 static NSString *SimpleTableIndentifier = @"SimpleTableIndentifier";  192 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIndentifier];  193 if (cell == nil) {  194 cell = [[[UITableViewCell alloc]   195 initWithStyle:UITableViewCellStyleSubtitle   196 reuseIdentifier:SimpleTableIndentifier]   197 autorelease];  198 }  199      UIImage *image = [UIImage imageNamed:@"13.gif"];  200 cell.imageView.image = image;  201        202 NSUInteger row = [indexPath row];  203 cell.textLabel.text = [listData objectAtIndex:row];  204      cell.textLabel.font = [UIFont boldSystemFontOfSize:20];  205    206      if(row < 5)  207 cell.detailTextLabel.text = @"Best friends";  208 else   209     cell.detailTextLabel.text = @"friends";  210 return cell;  211 }  212   213 图像、文本标签和详细文本标签  214   215 图像:如果设置图像,则它显示在文本的左侧; 文本标签:这是单元的主要文本(UITableViewCellStyleDefault 只显示文本标签);详细文本标签:这是单元的辅助文本,通常用作解释性说明或标签  216   217 UITableViewCellStyleSubtitle  218 UITableViewCellStyleDefault  219 UITableViewCellStyleValue1  220 UITableViewCellStyleValue2  221    222 <UITableViewDelegate>  223 #pragma mark -  224 #pragma mark Table View Delegate Methods  225 //把每一行缩进级别设置为其行号  226 - (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath  227 {  228 NSUInteger row = [indexPath row];  229 return row;  230 }  231 //获取传递过来的indexPath值  232 - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath  233 {  234 NSUInteger row = [indexPath row];  235 if (row == 0)   236 return nil;  237 return indexPath;  238 }  239    240 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  241 {  242 NSUInteger row = [indexPath row];  243 NSString *rowValue = [listData objectAtIndex:row];  244 NSString *message = [[NSString alloc] initWithFormat:@"You selected %@",rowValue];  245 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Row Selected"  246 message:message  247     delegate:nil  248   cancelButtonTitle:@"Yes, I did!"  249   otherButtonTitles:nil];  250 [alert show];  251 [alert release];  252 [message release];  253 [tableView deselectRowAtIndexPath:indexPath animated:YES];  254 }  255    256 //设置行的高度  257 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  258 {  259 return 40;  260 }  261   262 NavigationController 推出push 推出pop  263 [self.navigationController pushViewController:_detailController animated:YES];  264 [self.navigationController popViewControllerAnimated:YES];  265    266 Debug:  267 NSLog(@"%s %d", __FUNCTION__, __LINE__);  268    269 点击textField外的地方回收键盘  270   271 先定义一个UIControl类型的对象,在上面可以添加触发事件,令SEL实践为回收键盘的方法,最后将UIControl的实例加到当前View上。  272 UIControl *m_control = [[UIControl alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];  273 [m_control addTarget:self action:@selector(keyboardReturn)   274 forControlEvents:UIControlEventTouchUpInside];  275 [self.view addSubview:m_control];  276    277 - (void) keyboardReturn  278 {  279 [aTextField resignFirstResponder];  280 }  281    282 键盘覆盖输入框  283 当键盘调出时将输入框覆盖时,可以用下方法:  284 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField  285 {  286 [self.view setFrame:CGRectMake(0, -100, 320, 480) ];  287 return YES;  288 }  289 - (BOOL)textFieldShouldEndEditing:(UITextField *)textField  290 {  291   [self.view setFrame:CGRectMake(0, 0, 320, 480)];  292     return YES;  293 }  294 当准备输入时,将视图的位置上调100,这样键盘就不能覆盖到输入框。  295    296 当依赖注入方法不好使时,可以在AppDelegate内申明一个全局的控制器实例_anotherViewController,在另一个需要使用_anotherViewController的地方定义以下委托方法,使用共享的UIApplication实例来获取该委托的引用  297 SomeAppDelegate *appDelegate = (SomeAppDelegate *)[[UIApplication sharedApplication] delegate];  298 _anotherViewController = appDelegate._anotherViewController;   299   300 UIViewController内建Table View  301   302 纯代码在UIViewController控制器内建Table View  303 @interface RootViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {  304 NSArray *timeZoneNames;  305 }  306 @property (nonatomic,retain) NSArray *timeZoneNames;  307 @end  308    309 (void) loadView  310 {  311 UITableView *tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] style: UITableViewStylePlain];  312 tableView.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingWidth);  313 tableView.delegate = self;  314 tableView.dataSource = self;  315 [tableView reloadData];  316    317 self.view = tableView;  318 [tableView release];  319 }  320    321    322 将plist文件中的数据赋给数组  323 NSString *thePath = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"];  324 NSArray *array = [NSArray arrayWithContentsOfFile:thePath];  325    326 UITouch  327 手指的触摸范围:64X64   328    329 #pragma mark -  330 #pragma mark Touch Events  331    332 - (void)touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event {  333 originFrame = bookCover.frame;  334 NSLog(@"%s %d", __FUNCTION__,__LINE__);  335    336 if ([touches count] == 2)   337 {  338 NSArray *twoTouches = [touches allObjects];  339 UITouch *firstTouch = [twoTouches objectAtIndex:0];  340 UITouch *secondTouch = [twoTouches objectAtIndex:1];  341 CGPoint firstPoint = [firstTouch locationInView:bookCover];  342 CGPoint secondPoint = [secondTouch locationInView:bookCover];  343    344 CGFloat deltaX = secondPoint.x - firstPoint.x;  345 CGFloat deltaY = secondPoint.y - firstPoint.y;   346 initialDistance = sqrt(deltaX * deltaX + deltaY * deltaY );   347 frameX = bookCover.frame.origin.x;  348 frameY = bookCover.frame.origin.y;  349 frameW = bookCover.frame.size.width;  350 frameH = bookCover.frame.size.height;  351 NSLog(@"%s %d", __FUNCTION__,__LINE__);  352 }  353 }  354    355 - (void)touchesMoved:(NSSet *) touches withEvent:(UIEvent *) event {   356    357 if([touches count] == 2)  358 {   359 NSLog(@"%s %d", __FUNCTION__,__LINE__);  360    361 NSArray *twoTouches = [touches allObjects];  362 UITouch *firstTouch = [twoTouches objectAtIndex:0];  363 UITouch *secondTouch = [twoTouches objectAtIndex:1];  364    365 CGPoint firstPoint = [firstTouch locationInView:bookCover];  366 CGPoint secondPoint = [secondTouch locationInView:bookCover];  367    368 CGFloat deltaX = secondPoint.x - firstPoint.x;  369 CGFloat deltaY = secondPoint.y - firstPoint.y;   370 CGFloat currentDistance = sqrt(deltaX * deltaX + deltaY * deltaY );   371    372 if (initialDistance == 0) {  373 initialDistance = currentDistance;  374 }  375 else if (currentDistance != initialDistance)  376 {  377 CGFloat changedDistance = currentDistance - initialDistance;  378 NSLog(@"changedDistance = %f",changedDistance);  379 [bookCover setFrame:CGRectMake(frameX - changedDistance / 2,   380 frameY - (changedDistance * frameH) / (2 * frameW),  381 frameW + changedDistance,   382 frameH + (changedDistance * frameH) / frameW)];  383 }  384 }  385 }  386    387 - (void)touchesEnded:(NSSet *) touches withEvent:(UIEvent *) event {  388 UITouch *touch = [touches anyObject];  389    390 UITouch双击图片变大/还原  391 if ([touch tapCount] == 2)   392 {  393 NSLog(@"%s %d", __FUNCTION__,__LINE__);  394    395 if (!flag) {  396 [bookCover setFrame:CGRectMake(bookCover.frame.origin.x - bookCover.frame.size.width / 2,  397 bookCover.frame.origin.y - bookCover.frame.size.height / 2,  398 2 * bookCover.frame.size.width,   399 2 * bookCover.frame.size.height)];  400 flag = YES;  401 }  402 else {  403 [bookCover setFrame:CGRectMake(bookCover.frame.origin.x + bookCover.frame.size.width / 4, bookCover.frame.origin.y + bookCover.frame.size.height / 4,  404 bookCover.frame.size.width / 2, bookCover.frame.size.height / 2)];   405 flag = NO;  406 }  407 }   408 }  409   410 Get the Location of Touches  411 (CGPoint)locationInView:(UIView *)view  412 (CGPoint)previousLocationInView:(UIView *)view  413 view window  414    415 Getting Touch Attributes  416 tapCount(read only) timestamp(read only) phase(read only)  417    418 Getting a Touch Object's Gesture Recognizers  419 gestureRecognizers   420    421 Touch Phase  422 UITouchPhaseBegan  423 UITouchPhaseMoved  424 UITouchPhaseStationary  425 UITouchPhaseEnded  426 UITouchPhaseCancelled  427    428 从Plist里读内容  429 NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"book" ofType:@"plist"];  430 NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];  431 NSString *book = [dictionary objectForKey:bookTitle];  432 [textView setText:book];  433    434 (void) initialize {  435 NSUserDefaults = [NSUserDefaults standardUserDefaults];  436 NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"YES" forKey:@"DeleteBackup"];  437 [defaults registerDefaults:appDefaults];  438 }  439    440 To get a value of a default, use the valueForKey: method:  441 [[theDefaultsController values] valueForKey:@"userName"];  442 To set a value for a default, use setValue:forKey:  443 [[theDefaultsController values] setValue:newUserName forKey:@"userName"];  444    445 [[NSUserDefaults standardUserDefaults] setValue:aVale forKey:aKey];  446 [[NSUserDefaults standardUserDefaults] valueForKey:aKey];  447    448 获取Documents目录  449 NSArray *paths = NSSearchPathForDictionariesInDomains(NSDocumentDirectory,   450 NSUserDomainMask, YES);  451 NSString *documentsDirectory = [paths objectAtIndex:0];  452 NSString *filename = [documentsDirectory   453 stringByAppendingPathComponent:@"theFile.txt"];  454    455 获取tmp目录  456 NSString *tempPath = NSTemporaryDirectory();  457 NSString *tempFile = [tempPath stringByAppendingPathComponent:@"tempFile.txt"];  458    459 [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"someKey"];  460 [[NSUserDefaults standardUserDefaults] objectForKey:aKey];  461   462 自定义NavigationBar  463 navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];  464 [navigationBar setBarStyle:UIBarStyleBlackOpaque];  465    466 myNavigationItem = [[UINavigationItem alloc] initWithTitle:@"Setting"];  467 [navigationBar setItems:[NSArray arrayWithObject:myNavigationItem]];  468 [self.view addSubview:navigationBar];  469    470 backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(back)];  471 myNavigationItem.leftBarButtonItem = backButton;  472    473    474 利用Safari打开一个链接  475 NSURL *url = [NSURL URLWithString:@"http://www.cnblogs.com/tracy-e/"];  476 [[UIApplication sharedApplication] openURL:url];  477    478 利用UIWebView显示pdf文件、网页。。。  479 webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];  480 [webView setDelegate:self];  481 [webView setScalesPageToFit:YES];  482 [webView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];  483 [webView setAllowsInlineMediaPlayback:YES];  484 [self.view addSubview:webView];  485 NSString *pdfPath = [[NSBundle mainBundle] pathForResource:@"ojc" ofType:@"pdf"];   486 NSURL *url = [NSURL fileURLWithPath:pdfPath];   487 NSURLRequest *request = [NSURLRequest requestWithURL:url   488 cachePolicy:NSURLRequestUseProtocolCachePolicy  489 timeoutInterval:5];  490 [webView loadRequest:request];  491    492    493 [myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL   494                        URLWithString: @"http://www.cnblogs.com/tracy-e/"]]];  495    496 NSString *errorString = [NSString stringWithFormat:@"<html><center><font size=   497 +5 color ='red'>An Error Occurred:<br>%@</fone></center></html>",error];  498 [myWebView loadHTMLString:errorString baseURL:nil];  499    500 //Stopping a load request when the view is to disappear  501 - (void)viewWillDisappear:(BOOL)animate{  502 if ([myWebView loading]){  503 [myWebView stopLoading];  504 }  505 myWebView.delegate = nil;  506 [UIApplication shareApplication].networkActivityIndicatorVisible = NO;  507 }  508    509 汉字转码  510 NSString *oriString = @"\u67aa\u738b";  511 NSString *escapedString = [oriString   512 stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding];  513    514    515 Checking for background support on earlier versions of iOS  516 UIDevice *device = [UIDevice currentDevice];  517 BOOL backgroundSupported = NO;  518 if ([device respondsToSelector:@selector(isMultitaskingSupported)]){  519 backgroundSupported = device.multitaskingSupported;  520 }  521    522 Being a Responsible,Multitasking-Aware Application   523 # Do not make any OpenGL ES calls from your code.  524 # Cancel any Bonjour-related services before being suspended.  525 # Be prepared to handle connection failures in your network-based sockets.  526 # Save your application state before moving to the background.  527 # Release any unneeded memory when moving to the background.  528 # Stop using shared system resources before being suspended.  529 # Avoid updating your windows and views.  530 # Respond to connect and disconnect notification for external accessories.  531 # Clean up resource for active alerts when moving to the background.  532 # Remove sensitive information from views before moving to the background.  533 # Do minimal work while running in the background.  534    535 Handing the Keyboard notifications  536 //Call this method somewhere in your view controller setup code  537 - (void) registerForKeyboardNotifications{  538    539 [[NSNotificationCenter defaultCenter] addObserver:self  540 selector:@selector(keyboardWasShown:)  541 name:UIKeyboardDidShowNotification   542 object:nil];  543 [[NSNotificationCenter defaultCenter] addObserver:self  544 selector:@selector(keyboardWasHidden:)  545 name:UIKeyboardDidHideNotification  546 object:nil];  547    548 }  549    550 //Called when the UIKeyboardDidShowNotification is sent  551 - (void)keyboardWasShown:(NSNotification *) aNotification{  552 if(keyboardShown)  553 return;  554 NSDictionary *info = [aNotification userInfo];  555    556 //get the size of the keyboard.   557 NSValue *aValue = [info objectForKey:UIKeyboardFrameBeginUserInfoKey];  558 CGSize keyboardSize = [aValue CGRectValue].size;  559    560 //Resize the scroll view   561 CGRect viewFrame = [scrollView frame];  562 viewFrame.size.height -= keyboardSize.height;  563    564 //Scroll the active text field into view  565 CGRect textFieldRect = [activeField frame];  566 [scrollView scrollRectToVisible:textFieldRect animated:YES];  567    568 keyboardShown = YES;   569 }  570    571 //Called when the UIKeyboardDidHideNotification is sent  572 - (void)keyboardWasHidden:(NSNotification *) aNotification{  573 NSDictionary *info = [aNotification userInfo];  574    575 //Get the size of the keyboard.  576 NSValue *aValue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];  577 CGSize keyboardSize = [aValue CGRectValue].size;  578    579 //Reset the height of the scroll view to its original value  580 CGRect viewFrame = [scrollView Frame];  581 viewFrame.size.height += keyboardSize.height;  582 scrollView.frame = viewFrame;  583    584 keyboardShown = NO;  585 }  586    587 点击键盘的next按钮,在不同的textField之间换行  588 //首先给不同的textField赋不同的且相邻的tag值  589 - (BOOL)textFieldShouldReturn:(UITextField *)textField  590 {  591 if ([textField returnKeyType] != UIReturnKeyDone)  592 {   593 NSInteger nextTag = [textField tag] + 1;  594 UIView *nextTextField = [[self tableView] viewWithTag:nextTag];  595 [nextTextField becomeFirstResponder];  596 }  597 else {  598 [textField resignFirstResponder];  599 }  600 return YES;  601 }   602    603 Configuring a date formatter   604 - (void)viewDidLoad {  605 [super viewDidLoad];  606 dateFormatter = [[NSDateFormatter alloc] init];  607 [dateFormatter setGeneratesCalendarDates:YES];  608 [dateFormatter setLocale:[NSLocale currentLocale]];  609 [dateFormatter setCalendar:[NSCalendar autoupdatingCurrentCalendar]];  610 [dateFormatter setTimeZone:[NSTimeZone defaultTimeZone]];  611 [dateFormatter setDateStyle:NSDateFormatterShortStyle];  612 DOB.placeholder = [NSString stringWithFormat:@"Example: %@",[dateFormatter stringFromDate:[NSDate date]]];  613 }  614    615 - (void)textFieldDidEndEditing:(UITextField *)textField{  616 [textField resignFirstResponder];  617 if ([textField.text isEqualToString:@""])  618 return;  619 switch (textField.tag){  620 case DOBField:  621 NSDate *theDate = [dateFormatter dateFromString:textField.text];  622 if (theDate)  623 [inputDate setObject:theDate forKey:MyAppPersonDOBKey];  624 break;  625 default:  626 break;  627 }  628 }  629    630  tableView的cell高度  631   632 tableView的cell高度除了在delegate中指定外,还可以在任意位置以[tableView setRowHeight:44]的方式指定  633    634 [[self navigationItem] setLeftBarButtonItem:[self editButtonItem]];  635    636 - (void)setEditing:(BOOL)editing animated:(BOOL)animated{  637 [super setEditing:editing animated:animated];  638 if (editing){  639 ......   640 }  641 else{  642 ......  643 }   644 }  645    646 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.  647   648 为UINavigationBar设置背景图片  649 在iPhone开发中, 有时候我们想给导航条添加背景图片, 实现多样化的导航条效果, 用其他方法往往无法达到理想的效果, 经过网上搜索及多次实验, 确定如下最佳实现方案:  650 为UINavigatonBar增加如下Category(类别:提供一种为某个类添加方法而又不必编写子类的途径,类别只能添加成员函数,不能添加数据成员):  651   652 @implementation UINavigationBar (CustomImage)    653 - (void)drawRect:(CGRect)rect {    654     UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];    655     [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];    656 }    657 @end    658    659 例如, 在我的项目中, 添加如下代码:  660 /////////////////////////////////////////////////////////    661 /* input: The image and a tag to later identify the view */    662 @implementation UINavigationBar (CustomImage)    663 - (void)drawRect:(CGRect)rect {    664     UIImage *image = [UIImage imageNamed: @"title_bg.png"];    665     [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];    666 }    667 @end    668 /////////////////////////////////////////////////////////    669 @implementation FriendsPageViewController    670 // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.    671 - (void)viewDidLoad {       672     self.navigationBar.tintColor = [UIColor purpleColor];    673         674     [self initWithRootViewController:[[RegPageViewController alloc] init]];    675     [super viewDidLoad];    676 }    677 ......    678 实现的效果如下图:  679     680    681 转载,原文地址 http://blog.csdn.net/wave_1102/archive/2009/11/04/4768212.aspx  682   683 为UINavigationBar添加自定义背景  684   685 @implementation UINavigationBar (UINavigationBarCategory)    686   687 - (void)drawRect:(CGRect)rect {    688     //颜色填充    689 //  UIColor *color = [UIColor redColor];    690 //  CGContextRef context = UIGraphicsGetCurrentContext();    691 //  CGContextSetFillColor(context, CGColorGetComponents( [color CGColor]));    692 //  CGContextFillRect(context, rect);    693 //  self.tintColor = color;    694     //图片填充    695 UIColor *color = [UIColor colorWithRed:46.0f/255.0f   696 green:87.0f/255.0f blue:29.0f/255.0f alpha:1.0f];  697   698     UIImage *img    = [UIImage imageNamed: @"bg.png"];    699     [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];    700   701     self.tintColor = color;    702 }    703   704 @end  705   706 加载图片要及时release  707   708 你还在使用myImage = [UIImage imageNamed:@"icon.png"]; 吗?   709   710 如题,是不是大家为了方便都这样加载图片啊  711   712 myImage = [UIImage imageNamed:@"icon.png"];  713   714 那么小心了  715   716 这种方法在一些图片很少,或者图片很小的程序里是ok的。  717   718 但是,在大量加载图片的程序里,请千万不要这样做。  719   720 为什么呢 ???????  721   722 这种方法在application bundle的顶层文件夹寻找由供应的名字的图象。 如果找到图片,装载到iPhone系统缓存图象。那意味图片是(理论上)放在内存里作为cache的。  723   724 试想你图片多了,是什么后果?   725   726 图片cache极有可能不会响应 memory warnings and release its objects  727   728 所以,用图片的时候一定要小心的alloc和release。  729   730 推荐使用 NSString *path = [[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png"];  731   732 myImage = [UIImage imageWithContentsOfFile:path];  733   734 // Todo use of myImage  735   736 [myImage release];  737   738 From: http://www.cocoachina.com/bbs/simple/?t27420.html   739   740 uiwebview打开doc,pdf文件  741 UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 55, 320, 300)];  742     webView.delegate = self;  743     webView.multipleTouchEnabled = YES;  744     webView.scalesPageToFit = YES;  745   746     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  747     NSString *documentsDirectory = [paths objectAtIndex:0];  748     NSString *docPath = [documentsDirectory stringByAppendingString:@"/doc2003_1.doc"];    NSLog(@"#######%@",docPath);  749       750     NSURL *url = [NSURL fileURLWithPath:docPath];  751     NSURLRequest *request = [NSURLRequest requestWithURL:url];  752     [webView loadRequest:request];  753       754     [self.view addSubview:webView];  755 [webView release];  756   757 From:http://blog.csdn.net/dadalan/archive/2010/10/22/5959301.aspx   758   759 iPhone游戏中既播放背景音乐又播放特效声音的办法  760   761 有时候在 iPhone 游戏中,既要播放背景音乐,同时又要播放比如枪的开火音效。此时您可以试试以下方法  762   763     NSString *musicFilePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"wav"];       //创建音乐文件路径  764     NSURL *musicURL = [[NSURL alloc] initFileURLWithPath:musicFilePath];    765     AVAudioPlayer* musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:musicURL error:nil];  766     [musicURL release];  767     [musicPlayer prepareToPlay];  768     //[musicPlayer setVolume:1];            //设置音量大小  769     //musicPlayer .numberOfLoops = -1;//设置音乐播放次数  -1为一直循环  770   771 要导入框架 AVFoundation.framework,头文件中 #import <AVFoundation/AVFoundation.h>;做成类的话则更方便。  772   773 From: http://blog.csdn.net/dadalan/archive/2010/10/19/5950493.aspx   774   775 NSNotificationCenter用于增加回调函数  776 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_willBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];  777   778 UINavigationBar 背景Hack  779 LOGO_320×44.png 图片显示在背景上,  780   781 @implementation UINavigationBar (UINavigationBarCategory)  782 - (void)drawRect:(CGRect)rect {  783     //加入旋转坐标系代码  784     // Drawing code      785     UIImage *navBarImage = [UIImage imageNamed:@"LOGO_320×44.png"];  786     CGContextRef context = UIGraphicsGetCurrentContext();  787     CGContextTranslateCTM(context, 0.0, self.frame.size.height);  788     CGContextScaleCTM(context, 1.0, -1.0);      789       790     CGPoint center=self.center;  791   792     CGImageRef cgImage= CGImageCreateWithImageInRect(navBarImage.CGImage, CGRectMake(0, 0, 1, 44));  793     CGContextDrawImage(context, CGRectMake(center.x-160-80, 0, 80, self.frame.size.height), cgImage);  794     CGContextDrawImage(context, CGRectMake(center.x-160, 0, 320, self.frame.size.height), navBarImage.CGImage);  795     CGContextDrawImage(context, CGRectMake(center.x+160, 0, 80, self.frame.size.height), cgImage);  796 }  797 @end  798   799 old code  800 CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), navBarImage.CGImage);  801   802 hack 过logo 不再拉伸  803    804 From: http://blog.163.com/fengyi1103@126/blog/static/13835627420106279102671/   805   806 清除电话号码中的其他符号(源码)  807   808 最近从通讯录读取电话号码,读出得号码如:134-1814-****。  809 而我需要的为11位纯数字,一直找方法解决此问题,今天终于找到了。。  810 分享一下……  811   812 代码如下:  813   814 NSString *originalString = @"(123) 123123 abc";  815 NSMutableString *strippedString = [NSMutableString   816         stringWithCapacity:originalString.length];  817   818 NSScanner *scanner = [NSScanner scannerWithString:originalString];  819 NSCharacterSet *numbers = [NSCharacterSet   820         characterSetWithCharactersInString:@"0123456789"];  821   822 while ([scanner isAtEnd] == NO) {  823   NSString *buffer;  824   if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {  825     [strippedString appendString:buffer];  826   }  827   // --------- Add the following to get out of endless loop  828   else {  829      [scanner setScanLocation:([scanner scanLocation] + 1)];  830   }      831   // --------- End of addition  832 }  833   834 NSLog(@"%@", strippedString); // "123123123"  835   836 From: http://stackoverflow.com/questions/1129521/remove-all-but-numbers-from-nsstring   837   838   839 正则判断:字符串只包含字母和数字  840   841 NSString *mystring = @"Letter1234";  842 NSString *regex = @"[a-z][A-Z][0-9]";  843   844 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];  845   846 if ([predicate evaluateWithObject:mystring] == YES) {  847     //implement  848 }  849   850   851 一行代码设置 UITableViewCell 与导航条间距  852   853 UITableView 的 cell 默认出现在 uitableview 的第一行,如果你想自定义 UITableViewCell 与导航条间距的话,可以使用下面这行代码  854   855 tableview.tableHeaderView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)]autorelease];  856   857 From: http://blog.163.com/fengyi1103@126/blog/static/1383562742010101611107492/   858   859   860 修改 UITableview 滚动条颜色的方法  861   862     UITableview 的滚动条默认颜色是黑色的,如果 UItableview 背景也是深颜色,则滚动条会变的很不明显。您可以用下面这行代码来改变滚动条的颜色  863   864 self.tableView.indicatorStyle=UIScrollViewIndicatorStyleWhite;  865   866 当然,最后的 “White” 也可以换成其它颜色。  867   868   869 下文件之前获取到文件大小的代码  870   871 下面这段代码,能实现在下载文件之前获得文件大小,应用在软件里,能在很大程度上改善用户体验  872   873 [m_pASIHTTPRequest setDidReceiveResponseHeadersSelector:@selector(didReceiveResponseHeaders:)];  874   875 - (void)didReceiveResponseHeaders:(ASIHTTPRequest *)request  876 {  877     NSLog(@"didReceiveResponseHeaders %@",[m_request.responseHeaders valueForKey:@"Content-Length"]);  878  879   880 网络编程总结 iphone  881   882 一:确认网络环境3G/WIFI  883   884     1. 添加源文件和framework  885       886     开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审(我们的)查的。  887     Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部:  888       889     1.1. 添加源文件:  890     在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图:  891   892       893       894     1.2.添加framework:  895     将SystemConfiguration.framework 添加进工程。如下图:  896       897       898     2. 网络状态  899       900     Reachability.h中定义了三种网络状态:  901     typedef enum {  902         NotReachable = 0,            //无连接  903         ReachableViaWiFi,            //使用3G/GPRS网络  904         ReachableViaWWAN            //使用WiFi网络  905     } NetworkStatus;  906       907     因此可以这样检查网络状态:  908   909     Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”];  910     switch ([r currentReachabilityStatus]) {  911             case NotReachable:  912                     // 没有网络连接  913                     break;  914             case ReachableViaWWAN:  915                     // 使用3G网络  916                     break;  917             case ReachableViaWiFi:  918                     // 使用WiFi网络  919                     break;  920     }  921       922     3.检查当前网络环境  923     程序启动时,如果想检测可用的网络环境,可以像这样  924     // 是否wifi  925     + (BOOL) IsEnableWIFI {  926         return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);  927     }  928   929     // 是否3G  930     + (BOOL) IsEnable3G {  931         return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);  932     }  933     例子:  934     - (void)viewWillAppear:(BOOL)animated {      935     if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) &&   936             ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) {  937             self.navigationItem.hidesBackButton = YES;  938             [self.navigationItem setLeftBarButtonItem:nil animated:NO];  939         }  940     }  941   942     4. 链接状态的实时通知  943     网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户:  944       945     Reachability 1.5版本  946     // My.AppDelegate.h  947     #import "Reachability.h"  948   949     @interface MyAppDelegate : NSObject <UIApplicationDelegate> {  950         NetworkStatus remoteHostStatus;  951     }  952   953     @property NetworkStatus remoteHostStatus;  954   955     @end  956   957     // My.AppDelegate.m  958     #import "MyAppDelegate.h"  959   960     @implementation MyAppDelegate  961     @synthesize remoteHostStatus;  962   963     // 更新网络状态  964     - (void)updateStatus {  965         self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];  966     }  967   968     // 通知网络状态  969     - (void)reachabilityChanged:(NSNotification *)note {  970         [self updateStatus];  971         if (self.remoteHostStatus == NotReachable) {  972             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil)  973                          message:NSLocalizedString (@"NotReachable", nil)  974                         delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];  975             [alert show];  976             [alert release];  977         }  978     }  979   980     // 程序启动器,启动网络监视  981     - (void)applicationDidFinishLaunching:(UIApplication *)application {  982       983         // 设置网络检测的站点  984         [[Reachability sharedReachability] setHostName:@"www.apple.com"];  985         [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES];  986         // 设置网络状态变化时的通知函数  987         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)  988                                                  name:@"kNetworkReachabilityChangedNotification" object:nil];  989         [self updateStatus];  990     }  991   992     - (void)dealloc {  993         // 删除通知对象  994         [[NSNotificationCenter defaultCenter] removeObserver:self];  995         [window release];  996         [super dealloc];  997     }   998       999     Reachability 2.0版本 1000      1001  1002     // MyAppDelegate.h 1003     @class Reachability; 1004  1005         @interface MyAppDelegate : NSObject <UIApplicationDelegate> { 1006             Reachability  *hostReach; 1007         } 1008  1009     @end 1010  1011     // MyAppDelegate.m 1012     - (void)reachabilityChanged:(NSNotification *)note { 1013         Reachability* curReach = [note object]; 1014         NSParameterAssert([curReach isKindOfClass: [Reachability class]]); 1015         NetworkStatus status = [curReach currentReachabilityStatus]; 1016      1017         if (status == NotReachable) { 1018             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName"" 1019                               message:@"NotReachable" 1020                               delegate:nil 1021                               cancelButtonTitle:@"YES" otherButtonTitles:nil]; 1022                               [alert show]; 1023                               [alert release]; 1024         } 1025     } 1026                                1027     - (void)applicationDidFinishLaunching:(UIApplication *)application { 1028         // ... 1029                    1030         // 监测网络情况 1031         [[NSNotificationCenter defaultCenter] addObserver:self 1032                               selector:@selector(reachabilityChanged:) 1033                               name: kReachabilityChangedNotification 1034                               object: nil]; 1035         hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain]; 1036         hostReach startNotifer]; 1037         // ... 1038     } 1039  1040  1041 二:使用NSConnection下载数据 1042      1043     1.创建NSConnection对象,设置委托对象 1044      1045     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]]; 1046     [NSURLConnection connectionWithRequest:request delegate:self]; 1047      1048     2. NSURLConnection delegate委托方法 1049         - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;   1050         - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;   1051         - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;   1052         - (void)connectionDidFinishLoading:(NSURLConnection *)connection;   1053  1054     3. 实现委托方法 1055     - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 1056         // store data 1057         [self.receivedData setLength:0];            //通常在这里先清空接受数据的缓存 1058     } 1059      1060     - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 1061            /* appends the new data to the received data */ 1062         [self.receivedData appendData:data];        //可能多次收到数据,把新的数据添加在现有数据最后 1063     } 1064  1065     - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 1066         // 错误处理 1067     } 1068  1069     - (void)connectionDidFinishLoading:(NSURLConnection *)connection { 1070         // disconnect 1071         [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;    1072         NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; 1073         NSLog(returnString); 1074         [self urlLoaded:[self urlString] data:self.receivedData]; 1075         firstTimeDownloaded = YES; 1076     } 1077  1078 三:使用NSXMLParser解析xml文件 1079  1080     1. 设置委托对象,开始解析 1081     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做: 1082     // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable 1083     // because it gives less control over the network, particularly in responding to connection errors. 1084     [parser setDelegate:self]; 1085     [parser parse]; 1086  1087     2. 常用的委托方法 1088     - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName  1089                                 namespaceURI:(NSString *)namespaceURI 1090                                 qualifiedName:(NSString *)qName  1091                                 attributes:(NSDictionary *)attributeDict; 1092     - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName  1093                                 namespaceURI:(NSString *)namespaceURI  1094                                 qualifiedName:(NSString *)qName; 1095     - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string; 1096     - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError; 1097  1098     static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml"; 1099  1100     3.  应用举例 1101     - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error 1102     { 1103         NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL]; 1104         [parser setDelegate:self]; 1105         [parser setShouldProcessNamespaces:NO]; 1106         [parser setShouldReportNamespacePrefixes:NO]; 1107         [parser setShouldResolveExternalEntities:NO]; 1108         [parser parse]; 1109         NSError *parseError = [parser parserError]; 1110         if (parseError && error) { 1111             *error = parseError; 1112         } 1113         [parser release]; 1114     } 1115  1116     - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI  1117                                         qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{ 1118         // 元素开始句柄 1119         if (qName) { 1120             elementName = qName; 1121         } 1122         if ([elementName isEqualToString:@"user"]) { 1123             // 输出属性值 1124             NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]); 1125         } 1126     } 1127  1128     - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI  1129                                         qualifiedName:(NSString *)qName 1130     { 1131         // 元素终了句柄 1132         if (qName) { 1133                elementName = qName; 1134         } 1135     } 1136  1137     - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 1138     { 1139         // 取得元素的text 1140     } 1141  1142     NSError *parseError = nil; 1143     [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; 1144  1145 Iphone 实现画折线图 1146  1147 iphone里面要画图一般都是通过CoreGraphics.framwork和QuartzCore.framwork实现,apple的官方sdk demon中包含了QuartzCore的基本用法, 1148  1149      1150 具体demo请参考http://developer.apple.com/library/ios/#samplecode/QuartzDemo/ 1151 折线图 1152  1153  1154 要实现折线图也就把全部的点连起来,movePointLineto,具体的调用里面的api就可以实现了,但是画坐标就比较麻烦了,里面需要去转很多,好在国外有人开源了一个画折线图的开发包,首先看看效果吧,具体怎么用可以参考作者git版本库中的wiki。 1155 http://github.com/devinross/tapkulibrary/wiki/How-To-Use-This-Library 1156     1157 这个包还提供了其他的很好看的UI,都可以调来用,但是我们只需要一个画图要把整个包都导进去,工程太大了,既然是开源的那就想办法提取出来吧,原先之前也有人干过这样的事。http://duivesteyn.net/2010/03/07/iphone-sdk-implementing-the-tapku-graph-in-your-application/ 1158 我对源代码进行简单的修改,使其显示坐标之类的,更加符合工程的需要,但是还没有实现画多组数据,只能画一组数据,不用viewContol,而使用addsubview,直接添加到当前的窗口,最终效果如下。 1159 使用方法: 1160  1161 1.工程添加tk库里面的如下文件 1162   1163 2. 添加QuartzCore  framework  1164 #import <QuartzCore/QuartzCore.h> 1165 添加TapkuLibrary.bundle资源文件 1166 3.代码中完成实例,数据初始化就可以用了 1167   1168 下载修改后的版本。下次有时间在整理一个工程版本出来。 1169  1170 让iPhone屏幕常亮不变暗的方法 1171  1172 如果您希望运行自己开发的App时,iPhone的屏幕不再自动变暗,可以使用以下方法让屏幕常亮: iPhone OS用一个布尔值用来控制是否取消应用程序空闲时间:@property(nonatomic, getter=isIdleTime  1173   1174 如果您希望运行自己开发的App时,iPhone的屏幕不再自动变暗,可以使用以下方法让屏幕常亮: 1175  1176   iPhone OS用一个布尔值用来控制是否取消应用程序空闲时间:@property(nonatomic, getter=isIdleTimerDisabled) BOOL idleTimerDisabled。这个值的默认属性是"NO"。当大多数应用程序没有接收到用户输入信息的时候,系统会把设备设置成“休眠”状态,iPhone屏幕也会变暗。这样做是为了保存更多电量。事实上,应用程序在运行加速度游戏的时候是不需要用户输入的,当然这里只是一个假设,把这个变量设置为"YES",来取消系统休眠的“空闲时间”。 1177  1178 重点是:你必须当真正需要的时候才打开这个属性当你不用的时候马上还愿成"NO"。大多数应用程序在休眠时间到的时候让系统关闭屏幕。这个包括了有音频的应用程 序。在Audio Session Services中使用适当的回放和记录功能不会被间断当屏幕关闭时。只有地图应用程序,游戏或者一些不间断的用户交互程序可以取消这个属性。 1179  1180 苹果开发网络编程知识总结 1181  1182 以下苹果开发网络编程知识由 CocoaChina 会员 cocoa_yang 总结,希望能为苹果开发新手梳理知识脉络,节省入门时间。一:确认网络环境3G/WIFI 1. 添加源文件和framework 开发Web等网络应用程序  1183  1184   以下苹果开发网络编程知识由 CocoaChina 会员 “cocoa_yang” 总结,希望能为苹果开发新手梳理知识脉络,节省入门时间。 1185  1186 一:确认网络环境3G/WIFI 1187  1188     1. 添加源文件和framework 1189      1190     开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审查的。 1191     Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部: 1192      1193     1.1. 添加源文件: 1194     在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图: 1195      1196     1.2.添加framework: 1197     将SystemConfiguration.framework 添加进工程。如下图: 1198      1199      1200     2. 网络状态 1201      1202     Reachability.h中定义了三种网络状态: 1203     typedef enum { 1204         NotReachable = 0,            //无连接 1205         ReachableViaWiFi,            //使用3G/GPRS网络 1206         ReachableViaWWAN            //使用WiFi网络 1207     } NetworkStatus; 1208      1209     因此可以这样检查网络状态: 1210  1211     Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”]; 1212     switch ([r currentReachabilityStatus]) { 1213             case NotReachable: 1214                     // 没有网络连接 1215                     break; 1216             case ReachableViaWWAN: 1217                     // 使用3G网络 1218                     break; 1219             case ReachableViaWiFi: 1220                     // 使用WiFi网络 1221                     break; 1222     } 1223      1224     3.检查当前网络环境 1225  1226     程序启动时,如果想检测可用的网络环境,可以像这样 1227     // 是否wifi 1228     + (BOOL) IsEnableWIFI { 1229         return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable); 1230     } 1231  1232     // 是否3G 1233     + (BOOL) IsEnable3G { 1234         return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable); 1235     } 1236     例子: 1237     - (void)viewWillAppear:(BOOL)animated {     1238     if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) && 1239             ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) { 1240             self.navigationItem.hidesBackButton = YES; 1241             [self.navigationItem setLeftBarButtonItem:nil animated:NO]; 1242         } 1243     } 1244  1245     4. 链接状态的实时通知 1246  1247     网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户: 1248      1249     Reachability 1.5版本 1250     // My.AppDelegate.h 1251     #import "Reachability.h" 1252  1253     @interface MyAppDelegate : NSObject <UIApplicationDelegate> { 1254         NetworkStatus remoteHostStatus; 1255     } 1256  1257     @property NetworkStatus remoteHostStatus; 1258  1259     @end 1260  1261     // My.AppDelegate.m 1262     #import "MyAppDelegate.h" 1263  1264     @implementation MyAppDelegate 1265     @synthesize remoteHostStatus; 1266  1267     // 更新网络状态 1268     - (void)updateStatus { 1269         self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus]; 1270     } 1271  1272     // 通知网络状态 1273     - (void)reachabilityChanged:(NSNotification *)note { 1274         [self updateStatus]; 1275         if (self.remoteHostStatus == NotReachable) { 1276             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil) 1277                          message:NSLocalizedString (@"NotReachable", nil) 1278                         delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 1279             [alert show]; 1280             [alert release]; 1281         } 1282     } 1283  1284     // 程序启动器,启动网络监视 1285     - (void)applicationDidFinishLaunching:(UIApplication *)application { 1286      1287         // 设置网络检测的站点 1288         [[Reachability sharedReachability] setHostName:@"www.apple.com"]; 1289         [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES]; 1290         // 设置网络状态变化时的通知函数 1291         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) 1292                                                  name:@"kNetworkReachabilityChangedNotification" object:nil]; 1293         [self updateStatus]; 1294     } 1295  1296     - (void)dealloc { 1297         // 删除通知对象 1298         [[NSNotificationCenter defaultCenter] removeObserver:self]; 1299         [window release]; 1300         [super dealloc]; 1301     } 1302      1303     Reachability 2.0版本 1304      1305  1306     // MyAppDelegate.h 1307     @class Reachability; 1308  1309         @interface MyAppDelegate : NSObject <UIApplicationDelegate> { 1310             Reachability  *hostReach; 1311         } 1312  1313     @end 1314  1315     // MyAppDelegate.m 1316     - (void)reachabilityChanged:(NSNotification *)note { 1317         Reachability* curReach = [note object]; 1318         NSParameterAssert([curReach isKindOfClass: [Reachability class]]); 1319         NetworkStatus status = [curReach currentReachabilityStatus]; 1320      1321         if (status == NotReachable) { 1322             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName"" 1323                               message:@"NotReachable" 1324                               delegate:nil 1325                               cancelButtonTitle:@"YES" otherButtonTitles:nil]; 1326                               [alert show]; 1327                               [alert release]; 1328         } 1329     } 1330                                1331     - (void)applicationDidFinishLaunching:(UIApplication *)application { 1332         // ... 1333                    1334         // 监测网络情况 1335         [[NSNotificationCenter defaultCenter] addObserver:self 1336                               selector:@selector(reachabilityChanged:) 1337                               name: kReachabilityChangedNotification 1338                               object: nil]; 1339         hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain]; 1340         hostReach startNotifer]; 1341         // ... 1342     } 1343  1344  1345 二:使用NSConnection下载数据 1346      1347     1.创建NSConnection对象,设置委托对象 1348      1349     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]]; 1350     [NSURLConnection connectionWithRequest:request delegate:self]; 1351      1352     2. NSURLConnection delegate委托方法 1353         - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;   1354         - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;   1355         - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;   1356         - (void)connectionDidFinishLoading:(NSURLConnection *)connection;   1357  1358     3. 实现委托方法 1359     - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 1360         // store data 1361         [self.receivedData setLength:0];            //通常在这里先清空接受数据的缓存 1362     } 1363      1364     - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 1365            /* appends the new data to the received data */ 1366         [self.receivedData appendData:data];        //可能多次收到数据,把新的数据添加在现有数据最后 1367     } 1368  1369     - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 1370         // 错误处理 1371     } 1372  1373     - (void)connectionDidFinishLoading:(NSURLConnection *)connection { 1374         // disconnect 1375         [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;   1376         NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; 1377         NSLog(returnString); 1378         [self urlLoaded:[self urlString] data:self.receivedData]; 1379         firstTimeDownloaded = YES; 1380     } 1381  1382 三:使用NSXMLParser解析xml文件 1383  1384     1. 设置委托对象,开始解析 1385     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做: 1386     // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable 1387     // because it gives less control over the network, particularly in responding to connection errors. 1388     [parser setDelegate:self]; 1389     [parser parse]; 1390  1391     2. 常用的委托方法 1392     - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 1393                                 namespaceURI:(NSString *)namespaceURI 1394                                 qualifiedName:(NSString *)qName 1395                                 attributes:(NSDictionary *)attributeDict; 1396     - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 1397                                 namespaceURI:(NSString *)namespaceURI 1398                                 qualifiedName:(NSString *)qName; 1399     - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string; 1400     - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError; 1401  1402     static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml"; 1403  1404     3.  应用举例 1405     - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error 1406     { 1407         NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL]; 1408         [parser setDelegate:self]; 1409         [parser setShouldProcessNamespaces:NO]; 1410         [parser setShouldReportNamespacePrefixes:NO]; 1411         [parser setShouldResolveExternalEntities:NO]; 1412         [parser parse]; 1413         NSError *parseError = [parser parserError]; 1414         if (parseError && error) { 1415             *error = parseError; 1416         } 1417         [parser release]; 1418     } 1419  1420     - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 1421                                         qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{ 1422         // 元素开始句柄 1423         if (qName) { 1424             elementName = qName; 1425         } 1426         if ([elementName isEqualToString:@"user"]) { 1427             // 输出属性值 1428             NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]); 1429         } 1430     } 1431  1432     - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 1433                                         qualifiedName:(NSString *)qName 1434     { 1435         // 元素终了句柄 1436         if (qName) { 1437                elementName = qName; 1438         } 1439     } 1440  1441     - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 1442     { 1443         // 取得元素的text 1444     } 1445  1446     NSError *parseError = nil; 1447     [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; 1448  1449 如何隐藏状态栏  1450 [ UIApplication sharedApplication ].statusBarHidden = YES; 1451  1452 .m 文件与.mm文件的区别  1453 .m文件是object-c文件 1454 .mm文件相当于c++或者c文件 1455  1456 NSLog(@"afd")与 NSLog("afd") 1457  1458 细微差别会导致程序崩溃。 1459  1460 但是我不太明白为何苹果要把编译器做的对这两种常量有区别。 1461  1462 不过值得一提的是可能为了方便苹果自身的NSObject对象的格式化输出。 1463  1464 safari其实没有把内存的缓存写到存储卡上  1465  1466 NSURLCache doesn't seem to support writing to disk on iPhone. The documentation for NSCachedURLResponse says that the NSURLCacheStoragePolicy "NSURLCacheStorageAllowed" is treated as "NSURLCacheStorageAllowedInMemoryOnly" by iPhone OS.  1467  1468 官方文档是这么说的。 1469  1470 为了证明这个,我找到了一个目录。 1471  1472 /private/var/mobile/Library/Caches/Safari/Thumbnails 1473  1474 随机数的使用 1475  1476         头文件的引用 1477         #import <time.h> 1478         #import <mach/mach_time.h> 1479  1480         srandom()的使用 1481         srandom((unsigned)(mach_absolute_time() & 0xFFFFFFFF)); 1482  1483         直接使用 random() 来调用随机数 1484  1485 在UIImageView 中旋转图像 1486  1487         float rotateAngle = M_PI; 1488         CGAffineTransform transform =CGAffineTransformMakeRotation(rotateAngle); 1489         imageView.transform = transform; 1490         1491         以上代码旋转imageView, 角度为rotateAngle, 方向可以自己测试哦! 1492  1493  1494 在Quartz中如何设置旋转点 1495  1496         UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg.png"]]; 1497         imageView.layer.anchorPoint = CGPointMake(0.5, 1.0); 1498  1499         这个是把旋转点设置为底部中间。记住是在QuartzCore.framework中才得到支持。 1500  1501 创建.plist文件并存储 1502  1503         NSString *errorDesc;  //用来存放错误信息 1504         NSMutableDictionary *rootObj = [NSMutableDictionary dictionaryWithCapacity:4]; //NSDictionary, NSData等文件可以直接转化为plist文件 1505         NSDictionary *innerDict; 1506         NSString *name; 1507         Player *player; 1508         NSInteger saveIndex; 1509      1510         for(int i = 0; i < [playerArray count]; i++) { 1511               player = nil; 1512               player = [playerArray objectAtIndex:i]; 1513               if(player == nil) 1514                      break;  1515               name = player.playerName;// This "Player1" denotes the player name could also be the computer name 1516               innerDict = [self getAllNodeInfoToDictionary:player]; 1517               [rootObj setObject:innerDict forKey:name]; // This "Player1" denotes the person who start this game 1518         } 1519         player = nil; 1520         NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:(id)rootObj format:NSPropertyListXMLFormat_v1_0 errorDescription:&errorDesc]; 1521  1522         红色部分可以忽略,只是给rootObj添加一点内容。这个plistData为创建好的plist文件,用其writeToFile方法就可以写成文件。下面是代码: 1523          1524         /*得到移动设备上的文件存放位置*/ 1525         NSString *documentsPath = [self getDocumentsDirectory];  1526         NSString *savePath = [documentsPath stringByAppendingPathComponent:@"save.plist"]; 1527      1528         /*存文件*/ 1529         if (plistData) { 1530                 [plistData writeToFile:savePath atomically:YES]; 1531          } 1532          else { 1533                 NSLog(errorDesc); 1534                 [errorDesc release]; 1535         } 1536  1537         - (NSString *)getDocumentsDirectory {   1538                 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);   1539                 return [paths objectAtIndex:0];   1540         }  1541  1542 读取plist文件并转化为NSDictionary 1543  1544         NSString *documentsPath = [self getDocumentsDirectory]; 1545         NSString *fullPath = [documentsPath stringByAppendingPathComponent:@"save.plist"]; 1546         NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:fullPath]; 1547  1548 读取一般性文档文件 1549  1550         NSString *tmp; 1551         NSArray *lines; /*将文件转化为一行一行的*/ 1552         lines = [[NSString    stringWithContentsOfFile:@"testFileReadLines.txt"]  1553                        componentsSeparatedByString:@"\n"]; 1554      1555          NSEnumerator *nse = [lines objectEnumerator]; 1556      1557          // 读取<>里的内容 1558          while(tmp = [nse nextObject]) { 1559                   NSString *stringBetweenBrackets = nil; 1560                   NSScanner *scanner = [NSScanner scannerWithString:tmp]; 1561                   [scanner scanUpToString:@"<" intoString:nil]; 1562                   [scanner scanString:@"<" intoString:nil]; 1563                   [scanner scanUpToString:@">" intoString:&stringBetweenBrackets]; 1564  1565                   NSLog([stringBetweenBrackets description]); 1566           } 1567  1568 对于读写文件,还有补充,暂时到此。随机数和文件读写在游戏开发中经常用到。所以把部分内容放在这,以便和大家分享,也当记录,便于查找。 1569  1570 隐藏NavigationBar 1571 [self.navigationController setNavigationBarHidden:YES animated:YES]; 1572  1573 在想隐藏的ViewController中使用就可以了。 1574  1575 如何在iPhone程序中调用外部命令  1576   1577 下面是如何在iPhone非官方SDK程序中调用外部命令的方法。  1578  1579 - ( NSString * ) executeCommand : ( NSString * ) cmd { NSString * output = [ NSString string ] ; FILE * pipe = popen ( [ cmd cStringUsingEncoding : NSASCIIStringEnc 1580     1581 下面是如何在iPhone非官方SDK程序中调用外部命令的方法。 1582  1583 - (NSString *)executeCommand: (NSString *)cmd 1584 { 1585     NSString *output = [NSString string]; 1586     FILE *pipe = popen([cmd cStringUsingEncoding: NSASCIIStringEncoding], "r"); 1587     if (!pipe) return; 1588   1589     char buf[1024]; 1590     while(fgets(buf, 1024, pipe)) { 1591     output = [output stringByAppendingFormat: @"%s", buf]; 1592 } 1593   1594 pclose(pipe); 1595 return output; 1596 } 1597   1598 NSString *yourcmd = [NSString stringWithFormat: @"your command"]; 1599 [self executeCommand: yourcmd]; 1600  1601 如何在iPhone程序读取数据时显示进度窗 1602   1603 下面代码说明如何使用iPhone 非官方SDK在读取数据时显示进度条。 1604  1605 以下代码参考了MobileRss。 1606  1607 定义头文件: 1608  1609 #import "uikit/UIProgressHUD.h" 1610   1611 @interface EyeCandy : UIApplication { 1612  UIProgressHUD *progress; 1613 } 1614   1615 - (void) showProgressHUD:(NSString *)label withWindow:(UIWindow *)w withView:(UIView *)v withRect:(struct CGRect)rect; 1616 - (void) hideProgressHUD; 1617   1618 .@end 1619  1620 上面的引号要改成<>1621  1622 import "EyeCandy.h" 1623   1624 @implementation EyeCandy 1625 - (void)showProgressHUD:(NSString *)label withWindow:(UIWindow *)w withView:(UIView *)v withRect:(struct CGRect)rect 1626 { 1627  progress = [[UIProgressHUD alloc] initWithWindow: w]; 1628  [progress setText: label]; 1629  [progress drawRect: rect]; 1630  [progress show: YES]; 1631   1632  [v addSubview:progress]; 1633 } 1634   1635 - (void)hideProgressHUD 1636 { 1637  [progress show: NO]; 1638  [progress removeFromSuperview]; 1639 } 1640   1641 @end 1642  1643 使用下面代码调用: 1644  1645 // Setup Eye Candy View 1646 _eyeCandy = [[[EyeCandy alloc] init] retain]; 1647   1648 // Call loading display 1649 [_eyeCandy showProgressHUD:@"Loading …" withWindow:window withView:mainView withRect:CGRectMake(0.0f, 100.0f, 320.0f, 50.0f)]; 1650   1651 // When finished for hiding the &quot;loading text&quot; 1652 [_eyeCandy hideProgressHUD]; 1653  1654 WebKit的基本用法  1655  1656 WebKit是苹果开发中比较常用的浏览器引擎,Safari使用的正是WebKit引擎。WebKit基于KDE的KHTML加以再开发,解析速度超过了以往所有的浏览器。这里简单记录一下WebKit的基本用法。 1657  1658 WebKit由下面的结构组成: 1659  1660 

















,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
技术小美
+ 关注