zoukankan      html  css  js  c++  java
  • 开发笔记-27个iOS开发中的小技巧

    
    ★27个iOS开发中的小技巧
    
    1、不想让TableView显示无用的Cell分割线怎么办?
    
    self.tableView.tableFooterView = [[UIView alloc] init];

    2、自定义了leftBarbuttonItem左滑返回手势失效了怎么办?
    
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                                             initWithImage:img
                                             style:UIBarButtonItemStylePlain
                                             target:self
                                             action:@selector(onBack:)];
    self.navigationController.interactivePopGestureRecognizer.delegate = (id<uigesturerecognizerdelegate>)self;</uigesturerecognizerdelegate>

    3、在ioS7中,如何检测系统自带ViewController手势返回结束?
    
    -(void)navigationController:(UINavigationController*)navigationControllerwillShowViewController:(UIViewController*)viewControlleranimated:(BOOL)animated
    {
    id<UIViewControllerTransitionCoordinator>tc=navigationController.topViewController.transitionCoordinator;
    [tcnotifyWhenInteractionEndsUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext>context){
    NSLog(@"7:%i",[contextisCancelled]);
    }];
    }

    4、ScrollView莫名其妙不能在viewController划到顶怎么办?
    
    self.automaticallyAdjustsScrollViewInsets = NO;

    5、在不新建一个Cell的情况下,怎么调整separaLine的位置?
    
    _myTableView.separatorInset = UIEdgeInsetsMake(0, 100, 0, 0);

    6、怎么点击self.view就让键盘收起,需要添加一个tapGestures吗?
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
       [self.view endEditing:YES];
    }

    7、怎么像safari一样滑动的时候隐藏navigationbar?
    
    navigationController.hidesBarsOnSwipe = Yes

    8、导航条返回键带的title太讨厌了,怎么让它消失?
    
    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
                                                         forBarMetrics:UIBarMetricsDefault];

    9、CollectionView 怎么实现tableview那种悬停的header?
    
    CSStickyHeaderFlowLayou

    10、能不能只用一个pan手势来代替UISwipegesture的各个方向?
    
    - (void)pan:(UIPanGestureRecognizer *)sender
    {
    typedef NS_ENUM(NSUInteger, UIPanGestureRecognizerDirection) {
        UIPanGestureRecognizerDirectionUndefined,
        UIPanGestureRecognizerDirectionUp,
        UIPanGestureRecognizerDirectionDown,
        UIPanGestureRecognizerDirectionLeft,
        UIPanGestureRecognizerDirectionRight
    };
    static UIPanGestureRecognizerDirection direction = UIPanGestureRecognizerDirectionUndefined;
    switch (sender.state) {
        case UIGestureRecognizerStateBegan: {
            if (direction == UIPanGestureRecognizerDirectionUndefined) {
                CGPoint velocity = [sender velocityInView:recognizer.view];
                BOOL isVerticalGesture = fabs(velocity.y) > fabs(velocity.x);
                if (isVerticalGesture) {
                    if (velocity.y > 0) {
                        direction = UIPanGestureRecognizerDirectionDown;
                    } else {
                        direction = UIPanGestureRecognizerDirectionUp;
                    }
                }
                else {
                    if (velocity.x > 0) {
                        direction = UIPanGestureRecognizerDirectionRight;
                    } else {
                        direction = UIPanGestureRecognizerDirectionLeft;
                    }
                }
            }
            break;
        }
        case UIGestureRecognizerStateChanged: {
            switch (direction) {
                case UIPanGestureRecognizerDirectionUp: {
                    [self handleUpwardsGesture:sender];
                    break;
                }
                case UIPanGestureRecognizerDirectionDown: {
                    [self handleDownwardsGesture:sender];
                    break;
                }
                case UIPanGestureRecognizerDirectionLeft: {
                    [self handleLeftGesture:sender];
                    break;
                }
                case UIPanGestureRecognizerDirectionRight: {
                    [self handleRightGesture:sender];
                    break;
                }
                default: {
                    break;
                }
            }
            break;
        }
        case UIGestureRecognizerStateEnded: {
            direction = UIPanGestureRecognizerDirectionUndefined;
            break;
        }
        default:
            break;
    }
    }

    11、怎么把tableview里cell的小对勾的颜色改成别的颜色?
    
    _mTableView.tintColor = [UIColor redColor];

    12、本来我的statusbar是lightcontent的,结果用UIImagePickerController会导致我的statusbar的样式变成黑色,怎么办?
    
    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    }

    13、怎么把我的navigationbar弄成透明的而不是带模糊的效果?
    
    [self.navigationBar setBackgroundImage:[UIImage new]
                             forBarMetrics:UIBarMetricsDefault];
    self.navigationBar.shadowImage = [UIImage new];
    self.navigationBar.translucent = YES;

    14、怎么改变uitextfield placeholder的颜色和位置?
    
    继承uitextfield,重写这个方法:
    
    - (void) drawPlaceholderInRect:(CGRect)rect {
        [[UIColor blueColor] setFill];
        [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];
    }

    15、添加需要的不同语言字符串
    
    简体中文Localizable.strings文件:
    
    "REMIND"="提示";
    "OK"="确定";
    "CANCEL"="取消";
    "NetworkConnectError"="网络连接失败";
    
    英文版Localizable.strings文件:
    
    "REMIND"="Remind";
    "OK"="OK";
    "CANCEL"="Cancel";
    "NetworkConnectError"="Cannot Connect Network";
    
    注意:不要遗漏结尾的分号“;”

    16、使用国际化文件
    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"REMIND", nil) message:NSLocalizedString(@"NetworkConnectError", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"CANCEL", nil) otherButtonTitles:NSLocalizedString(@"OK", nil), nil];
    [alert show];

    17、遍历实践Tips
    
    倒序遍历
    
    NSArray和NSOrderedSet都支持使用reverseObjectEnumerator倒序遍历,如:
    
    NSArray *strings = @[@"1", @"2", @"3"];
    for (NSString *string in [strings reverseObjectEnumerator]) {
        NSLog(@"%@", string);
    }
    
    这个方法只在循环第一次被调用,所以不必担心循环每次计算的问题。
    
    同时,使用enumerateObjectsWithOptions:NSEnumerationReverse也可以实现倒序遍历:
    
    [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(Sark *sark, NSUInteger idx, BOOL *stop) {
        [sark doSomething];
    }];
    
    使用block同时遍历字典key,value
    
    block版本的字典遍历可以同时取key和value(forin只能取key再手动取value),如:
    
    NSDictionary *dict = @{@"a": @"1", @"b": @"2"};
    [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"key: %@, value: %@", key, obj);
    }];
    
    对于耗时且顺序无关的遍历,使用并发版本:
    
    [array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(Sark *sark, NSUInteger idx, BOOL *stop) {
        [sark doSomethingSlow];
    }];

    18、如果在程序中想对某张图片进行处理的话(如得到某张图片的一部分)怎么做?
    
    UIImage *image = [UIImage imageNamed:filename];
    CGImageRef imageRef = image.CGImage;
    
    
    CGRect rect = CGRectMake(origin.x, origin.y ,size.width, size.height);
    
    
    CGImageRef imageRefRect = CGImageCreateWithImageInRect(imageRef, rect);
    
    
    UIImage *imageRect = [[UIImage alloc] initWithCGImage:imageRefRect];

    19、如何判断邮箱输入的是否正确?
    
    - (BOOL) validateEmail: (NSString *) candidate {
    
    
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}";
    
    
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    
    
    return [emailTest evaluateWithObject:candidate];
    
    
    }

    20、如何把当前的视图作为照片保存到相册中去?
    
    #import <QuartzCore/QuartzCore.h>
    
    
    UIGraphicsBeginImageContext(currentView.bounds.size);     //currentView 当前的view
    
    
    [currentView.layer renderInContext:UIGraphicsGetCurrentContext()];
    
    
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    
    
    UIGraphicsEndImageContext();
    
    
    UIImageWriteToSavedPhotosAlbum(viewIm


    21、本地通知(类似于push通知)按home键到后台十秒后触发
    
    UILocalNotification *notification=[[UILocalNotification alloc] init];
    
    
    if (notification!=nil) {
    
    
    NSLog(@">> support local notification");
    
    
    NSDate *now=[NSDate new];
    
    
    notification.fireDate=[now addTimeInterval:10];
    
    
    notification.timeZone=[NSTimeZone defaultTimeZone];
    
    
    notification.alertBody=@"该去吃晚饭了!";
    
    
    [[UIApplication sharedApplication].scheduleLocalNotification:notification];

    22、捕获iphone通话事件
    
    CTCallCenter *center = [[CTCallCenter alloc] init];
    
    
    center.callEventHandler = ^(CTCall *call)
    
    
    {
    
    NSLog(@"call:%@", call.callState);

    23、计算字符串的字数
    -(int)calculateTextNumber:(NSString *)text
    
    {
    
    float number = 0.0;
    
    int index = 0;
    
    for (index; index < [text length]; index++)
    
    {
    
    NSString *protoText = [text substringToIndex:[text length] - index];
    
    NSString *toChangetext = [text substringToIndex:[text length] -1 -index];
    
    NSString *charater;
    
    if ([toChangetext length]==0)
    
    {
    
    charater = protoText;
    
    }
    
    else
    
    {
    
    NSRange range = [text rangeOfString:toChangetext];
    
    
    charater = [protoText stringByReplacingCharactersInRange:range withString:@""];
    }
    
    NSLog(charater);
    
    if ([charater lengthOfBytesUsingEncoding:NSUTF8StringEncoding] == 3)
    
    {
    
    number++;
    
    }
    
    else
    
    {
    
    number = number+0.5;
    
    }
    }
    
    
    return ceil(number);
    
    
    }

    24、iPad隐藏键盘的同时触发方法
    
    [[NSNotificationCenter defaultCenter] addObserver:self
    
    
    selector:@selector(keyboardWillHide:)
    
    
    name:UIKeyboardWillHideNotification
    
    
      object:nil];
    
    
    - (IBAction)keyboardWillHide:(NSNotification *)note

    25、设置时区
    
    NSTimeZone *defaultTimeZone = [NSTimeZone defaultTimeZone];
    
    
    NSTimeZone *tzGMT = [NSTimeZone timeZoneWithName:@"GMT"];
    
    
    [NSTimeZone setDefaultTimeZone:tzGMT];

    26、在程序中实现电话的拨打
    
    //添加电话图标按钮
    
    UIButton *btnPhone = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
    
    
    btnPhone.frame = CGRectMake(280,10,30,30);
    
    
    UIImage *image = [UIImage imageNamed:@"phone.png"];
    
    
    [btnPhone setBackgroundImage:image forState:UIControlStateNormal];
    
    //点击拨号按钮直接拨号
    
    [btnPhone addTarget:self action:@selector(callAction:event:)forControlEvents:UIControlEventTouchUpInside];
    
    [cell.contentView addSubview:btnPhone];  //cell是一个UITableViewCell
    
    //定义点击拨号按钮时的操作
    
    
    - (void)callAction:(id)sender event:(id)event{
    
    
    NSSet *touches = [event allTouches];
    
    
    UITouch *touch = [touches anyObject];
    
    
    CGPoint currentTouchPosition = [touch locationInView:self.listTable];
    
    
    NSIndexPath *indexPath = [self.listTable indexPathForRowAtPoint: currentTouchPosition];
    
    
    if (indexPath == nil) {
    
    
    return;
    
    
    }
    
    
    NSInteger section = [indexPath section];
    
    
    NSUInteger row = [indexPath row];
    
    
    NSDictionary *rowData = [datas objectAtIndex:row];
    
    
    
    
    
    
    NSString *num = [[NSString alloc] initWithFormat:@"tel://%@",number]; //number为号码字符串
    
    
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:num]]; //拨号
    
    
    }

    27、实现自定义的状态栏(遮盖状态栏)
    
    CGRect frame = {{0, 0}, {320, 20}};
    
    
    UIWindow* wd = [[UIWindow alloc] initWithFrame:frame];
    
    
    [wd setBackgroundColor:[UIColor clearColor]];
    
    
    [wd setWindowLevel:UIWindowLevelStatusBar];
    
    
    frame = CGRectMake(100, 0, 30, 20);
    
    
    UIImageView* img = [[UIImageView alloc] initWithFrame:frame];
    
    
    [img setContentMode:UIViewContentModeCenter];
    
    
    [img setImage:[UIImage imageNamed:@"00_0103.png"]];
    
    
    [wd addSubview:img];
    
    
    [wd makeKeyAndVisible];
    
    
    [UIView beginAnimations:nil context:nil];
    
    
    [UIView setAnimationDuration:2];
    
    
    frame.origin.x += 150;
    
    
    [img setFrame:frame];
    
    
    [UIView commitAnimations];
  • 相关阅读:
    React在componentDidMount里面发送请求
    React 术语词汇表
    React里受控与非受控组件
    React和Vue等框架什么时候操作DOM
    【LeetCode】79. Word Search
    【LeetCode】91. Decode Ways
    【LeetCode】80. Remove Duplicates from Sorted Array II (2 solutions)
    【LeetCode】1. Two Sum
    【LeetCode】141. Linked List Cycle (2 solutions)
    【LeetCode】120. Triangle (3 solutions)
  • 原文地址:https://www.cnblogs.com/ljwiOS/p/5416143.html
Copyright © 2011-2022 走看看