iOS 项目常用效果方法注意点集锦

30 篇文章 0 订阅
这篇博客汇总了iOS开发中的各种实用技巧,包括:汉字转拼音获取首字母、UILabel自适应高度、图片圆形化、NSTimer使用注意事项、NSNumber转换、取消图片渲染、单例加方法锁、状态栏隐藏与风格修改、UITableViewCell移动、UIImage与字符串互转等。通过这些技巧,开发者可以提升iOS应用的用户体验和开发效率。
摘要由CSDN通过智能技术生成

真是求知若渴,遇到好的技术就是想分享出来,虽然不是我原创,但是我还是想要以我微薄之力与大家分享。
碰到好的东西,我不怕分享给别人,就算是学完了之后别人比我更强,其实真正的对手往往不是别人,而是自己,我不怕万人阻挡,只怕自己投降。
希望自己越来越棒,成为一个优秀的人,不辜负父母予我身体发肤,抚养我长大。
原文地址:简书地址 | 博客地址

 

就算是做个笔记,我也要认真的记下来!

 

1.根据汉字字符串获取该字符串的拼音然后取得首字母(这个我之前写过博文)

<span style="font-size:18px;">分享资源    汉字转换为 拼音 获取首字母
//获取拼音首字母(传入汉字字符串, 返回大写拼音首字母)
/*
- (NSString *)firstCharactor:(NSString *)aString
{
    //转成了可变字符串
    NSMutableString *str = [NSMutableString stringWithString:aString];
    //先转换为带声调的拼音
    CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
    //再转换为不带声调的拼音
    CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
    //转化为大写拼音
    NSString *pinYin = [str capitalizedString];
    //获取并返回首字母
    return [pinYin substringToIndex:1];
}
*/
        NSString *string = @"简书" ;
        if ([string length])
        {
            NSMutableString *mutableString = [NSMutableString stringWithString:string] ;
            /**
             *  由于此方法是在coreFoundation框架下,咱们平时所使用的类型都是Foundation框架下的,所以需要转换类型.
             *
             *  @param string#>    string 所需要转换的原字符#>
             *  @param range#>     range 所需要转换字符的范围.如果为0或者是NULL意思是所有字符都转换#>
             *  @param transform#> transform 转换方式#>
             *  @param reverse#>   reverse 如果为YES,返回原字符串;如果为NO,返回转换之后的字符串#>
             *
             *  @return return value description
             */
            // 将所有非英文的字符转换为拉丁字母,并且带声调和重音标识
            // __bridge :只改变当前对象的类型,但是不改变对象内存的管理权限
            CFStringTransform((__bridge CFMutableStringRef)mutableString , 0,kCFStringTransformToLatin , NO) ;

            // 去掉声调
            CFStringTransform((__bridge CFMutableStringRef)mutableString , 0,kCFStringTransformStripDiacritics , NO) ;

            // 每个单词的首字母大写 后再截取字符串
            NSString *str = [[mutableString capitalizedString] substringToIndex:1];
        }</span>


2.根据UILabel里的内容自适应高度(xib中由我自己添加)

NSString *contentString = [dic objectForKey:@"content"] ; //从字典中提取字符串
CGRect rect = [contentString boundingRectWithSize:CGSizeMake(tableView.bounds.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName :[UIFont systemFontOfSize:15]} context:nil] ;
    // 内容的自适应高度方法
     *  @param CGSize 规定文本显示的最大范围
        @param options 按照何种设置来计算范围
        @param attributes 文本内容的一些属性,例如字体大小,字体类型等  (字体不一样,高度也不一样)
        @parma context 上下文 可以规定一些其他的设置 但是一般都是nil
     */    
    // 枚举值中的 " | "  意思是要满足所有的枚举值设置.

xib中的代码,请活学活用~

self.tableView.rowHeight = UITableViewAutomaticDimension;
    self.tableView.estimatedRowHeight = 150;


3. 把图片做成圆形图标(非常常用)

self.headIconImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 40, 40)] ;
self.headIconImageView.layer.cornerRadius = 20 ; // 设置半径 
self.headIconImageView.layer.masksToBounds = YES ; // 边界是否允许截取

 

4. NSTimer计时器

使用实例代码如下:

// 第一个参数:多长时间会触发一次,以秒为单位
// 第二个参数:如果看到函数的参数有target,一般情况下,都用self
// 第三个参数:SEL,需要调用其他的方法,就是每次时钟被触发的时候,去执行的方法
// 最多可以带一个参数,就是时钟本身
// 第四个参数,暂时不用考虑,设置成nil
// 第五个参数:是否重复,通常会设置YES

_gameTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];

 

a.在时钟触发方法中,可以使用sender.fireDate获取到时钟被触发的时间
b.注意:使用NSTimer的时候,千万不要忘记调用invalidate方法关闭时钟。
c.NSTimer可能不会是及时相应触发时间的,它的执行优先级相对较低,因此,不要使用NSTimer去做实时响应需求较高的周期性操作。

5.NSNumber

 

a.是数字的NS对象的表达形式,如果要把数字添加到数组或者字典中,必须要进行转换,同时要使用数组中的数字,还需要转换成对应的数字。
b.要转换数字可以使用OC提供的包装方法:@(int)
c.要把NSNumber转换成字符串,需要使用stringValue方法

6.取消图片的渲染

[button setImage:[[UIImage imageNamed:@"1.jpg" ] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]  forState:UIControlStateNormal] ;

7.单例+方法锁

static Singleton *singleton = nil ;

+ (Singleton *)defaultSingleton
{
    // 方法锁,作用为:当多个线程同时调用方法的时候,保证只有一个线程在使用该方法.例如:A和B同时调用defaultSingleton方法,如果A正在使用该方法,那么B就不能调用,直到A使用完成,B才会执行该方法.这个也保证单例对象的唯一性,避免初始化方法被同时多次执行.
    @synchronized(self)
    {
        if (singleton == nil)
        {
            singleton = [[Singleton alloc] init] ;
        }
}
        return singleton ;
}

 

8.隐藏状态栏 修改状态栏风格

-(UIStatusBarStyle)preferredStatusBarStyle 
{ 
    return UIStatusBarStyleLightContent;  // 暗背景色时使用
} 

- (BOOL)prefersStatusBarHidden 
{ 
    return YES; // 是否隐藏状态栏
}

9.UITableViewCell可移动,需要打开的代理方法以及移动过程中调用的代理方法

// tableView可移动  移动完成之后会调用此代理方法
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{

}

// 移动过程中调用的代理方法 -- 示例为不能跨区移动
/**
 *  <#Description#>
 *
 *  @param tableView
 *  @param sourceIndexPath              所要移动单元格的原始位置
 *  @param proposedDestinationIndexPath 将要移动到的位置
 *
 *  @return return value description
 */
- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
    // 移动位置在同一分区
    if (sourceIndexPath.section == proposedDestinationIndexPath.section)
    {
        // 这时允许单元格移动
        return proposedDestinationIndexPath ;
    }
    // 不在同一分区 不让单元格移动,返回原始的indexPath
    else
    {
        return sourceIndexPath ;
    }
}

 

10.UIImage与字符串互转

//图片转字符串  
-(NSString *)UIImageToBase64Str:(UIImage *) image  
{  
    NSData *data = UIImageJPEGRepresentation(image, 1.0f);  
    NSString *encodedImageStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];  
    return encodedImageStr;  
}

//字符串转图片  
-(UIImage *)Base64StrToUIImage:(NSString *)_encodedImageStr  
{  
    NSData *_decodedImageData   = [[NSData alloc] initWithBase64Encoding:_encodedImageStr];  
    UIImage *_decodedImage      = [UIImage imageWithData:_decodedImageData];  
    return _decodedImage;  
}

 

11.当有多个导航控制器时,一次设置多个导航控制器

UINavigationBar *navBar = [UINavigationBar appearance] ;
    // 所有导航条颜色都会改变 -- 一键设置
    //navBar.barTintColor = [UIColor yellowColor] ;
    [navBar setBackgroundImage:[UIImage imageNamed:@"bg_nav.png"] forBarMetrics:UIBarMetricsDefault] ;

 

12.通过2D仿射函数实现小的动画效果(变大缩小) --可用于自定义pageControl中.

 

       [UIView animateWithDuration:0.3 animations:^{
       imageView.transform = CGAffineTransformMakeScale(2, 2);
       } completion:^(BOOL finished) {
       imageView.transform = CGAffineTransformMakeScale(1.0, 1.0);
       }];

 

13.处理标签字符串中的空格,换行,/t(制表符)等

- (NSString *)replaceStringWithString :(NSMutableString *)string
{
    NSString *string1 = [string stringByReplacingOccurrencesOfString:@"\n" withString:@""] ;
    NSString *string2 = [string1 stringByReplacingOccurrencesOfString:@" " withString:@""] ;
    NSString *string3 = [string2 stringByReplacingOccurrencesOfString:@"\r" withString:@""] ;
    NSString *string4 = [string3 stringByReplacingOccurrencesOfString:@"\t" withString:@""] ;
    return string4 ;
}

 

14.UITextField的字数限制

 

// viewDidLoad中
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:) 
          name:@"UITextFieldTextDidChangeNotification" object:myTextField];

 

-(void)textFiledEditChanged:(NSNotification *)obj
{
    UITextField *textField = (UITextField *)obj.object;
    NSString *toBeString = textField.text;

    //获取高亮部分
    UITextRange *selectedRange = [textField markedTextRange];
    UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];

    // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
    if (!position)
    {
        if (toBeString.length > MAX_STARWORDS_LENGTH)
        {
            NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:MAX_STARWORDS_LENGTH];
            if (rangeIndex.length == 1)
            {
                textField.text = [toBeString substringToIndex:MAX_STARWORDS_LENGTH];
            }
            else
            {
                NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, MAX_STARWORDS_LENGTH)];
                textField.text = [toBeString substringWithRange:rangeRange];
            }
        }
    }
 }

 

15.在ARC工程中导入MRC的类和在MRC工程中导入ARC的类

// 在ARC工程中导入MRC的类  我们选中工程->选中targets中的工程,然后选中Build Phases->在导入的类后边加入标记 -  fno-objc-arc
// 在MRC工程中导入ARC的类 路径与上面一致,在该类后面加上标记 -fobjc-arc

 

16.导入Xcode空模板

只需要把你下载好的空模板拷贝到该路径下即可.
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Application

17.iOS9中新增App Transport Security(简称ATS)特性


主要使用到原来请求的时候用到的HTTP,都转向TLS1.2协议进行传输。这也意味着所有的HTTP协议都强制使用了HTTPS协议进行传输。

18.substringWithRange: 专门截取字符串的一块

NSMakeRange(4,2) 从第4个字符开始截取,长度为2个字符,(字符串都是从第0个字符开始数的哦~!)

self.begin_time = dic[@"begin_time"];
        self.end_time = dic[@"end_time"];
        NSRange range = NSMakeRange(5, 11);

        self.time = [[self.begin_time substringWithRange:range] stringByAppendingString:[@" -- "stringByAppendingString:[self.end_time substringWithRange:range]]];

 

19.网络请求图片

//    NSURL *url = [NSURL URLWithString:urlString];
//    NSURLRequest *request = [NSURLRequest requestWithURL:url];
//    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//    UIImage *image = [UIImage imageWithData:data];

    //此种写法和上面的操作是一致的,都是同步请求数据。
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]];
    return image;

 

20.按照文字计算高度

- (void)descHeightWithDesc:(NSString *)desc{

    CGRect rect = [desc boundingRectWithSize:CGSizeMake(240, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:self.descLabel.font} context:nil];
    //按照文字计算高度
    float textHeight = rect.size.height;

    CGRect frame = self.descLabel.frame;
    frame.size.height = textHeight;
    self.descLabel.frame = frame;

}

21. 代理的安全保护【断是否有代理,和代理是否执行了代理方法】

if (self.delegate && [self.delegate respondsToSelector:@selector(passValueWithArray:)]) {

}

 

22. 隐藏手机的状态栏

-(BOOL)prefersStatusBarHidden {
return YES;
}

 

23.程序的退出【了解】(后面有更新)

【特别注意】iOS的应用程序在应用程序内部是不允许被退出的,只能通过连击两次HOME键的时候进入程序管理界面 通过上滑退出。如果在应用程序中写了下面的代码,那么在提交程序的时候是不能被审核通过的。所以下面的代码是不允许写的。在这里只是作了解。
exit(0); // 只要执行这个语句,程序就会直接退出

24.容器视图控制器

把一个视图控制器作为容器视图控制器,在这个容器视图控制器上添加多个其他视图控制器,并把其他控制器的视图添加上来
TableViewController *tableViewController = [[TableViewController alloc] init];
[self addChildViewController:tableViewController]; // self在这里就是容器视图控制器
[self.view addSubView:tableViewController.tableView];

使用场景:当我们某个视图控制器要使用多个子界面,并且多个子界面的处理事务的逻辑比较复杂,我们就可以通过这种方式将不同的逻辑处理拆分开,在各自的视图控制器中处理自己的逻辑,而不是所有逻辑都在当前视图控制器中处理。

 

25.问题处理:cell是有重用机制的,但有时候,我们的cell是自适应高度,但是所有cell的标识都是一个,那么,在重用的时候会出现 有的单元格高,有的单元格矮的情况,和本身想要的frame不匹配,这个时候,只需要给cell上面的视图在懒加载的时候,重新赋frame值就好了。也就是在if判断外,再赋值一次frame。(例如,豆瓣项目电影院列表)

 

26.问题处理:有时候self是加在parentViewController(父ViewController)上的,self上面是没有navigationController的,但是这时还想使用self父类的navigationController,那么,此时需要第二种方法push过去

[self.navigationController pushViewController:detailViewController animated:YES];
[self.parentViewController.navigationController pushViewController:detailViewController animated:YES];

 

27.视图是否自动(只是把第一个自动)向下挪64

self.automaticallyAdjustsScrollViewInsets = NO; // 不让系统帮咱们把scrollView及其子类的视图向下调整64

 

28. 懒加载里面的判断条件(含义)

!_imageView 等同于 _imageView == nil
_imageView 等同于 _imageView != nil

29. 什么时候用宏,什么时候用变量(宏和变量都方便修改参数值)

如果在一个方法里面的时候,用变量
如果在多个方法里面,或者多个类中,用宏

 

30. xib的本质是xml文件

xib编译之后生成的是nib文件


 

 

31. UIImage

UIImage image = [UIImage imageNamed:@“ha.jpg”];
【特别注意】imageNamed:带有缓存,通过imageNamed创建的图片会放到缓存中
UIImage image = [UIImage imageWithContentsOfFile:path];
【特别注意】imageWithContentsOfFile:不带缓存,所以图片量比较大得时候,用这个方法

延迟(时间参数)执行(clearImages)方法
[self performSelector:@selector(clearImages) withObject:nil afterDelay:(延迟多长时间参数)];


32. UIImageView做动画

NSArray *animationImages; // 把图片赋值给动画数组【帧动画】
NSInteger animationRepeatCount; // 默认是0,无限循环
NSTimeInterval animationDuration; // 执行一轮图片的时间

 

33.返回cell高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *string = self.lrcArr[indexPath.row];

    CGRect frame = [string boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width, 10000) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:[NSDictionary dictionaryWithObject:[UIFont systemFontOfSize:17] forKey:NSFontAttributeName] context:nil];

    return frame.size.height;
}

 

34.图片缓存的基本代码,就是这么简单

 [imageView sd_setImageWithURL:[NSURL URLWithString:self.titleImageArray[i]]];

 

35.在storyboard上添加ScrollView

 

36.相对路径

 

$(SRCROOT)/

 

37.导入框架方法

38.全局断点+僵尸模式 排错

 

39.模糊效果

// 模糊效果
    UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
    UIVisualEffectView *test = [[UIVisualEffectView alloc] initWithEffect:effect];
    test.frame = self.view.bounds;
    test.alpha = 0.5;
    [self.view addSubview:test];

 

 

40.在状态栏显示有网络请求的提示器

//- (void)webViewDidStartLoad:(UIWebView *)webView {
//    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
//}
//- (void)webViewDidFishLoad:(UIWebView *)webView {
//    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
//}
//接收响应
// 在状态栏显示有网络请求的提示器
//- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response{
//    
//    //网络活动指示器
//    
//    [UIApplication sharedApplication].networkActivityIndicatorVisible=YES;
//    
//}

//隐藏状态栏

//- (BOOL)prefersStatusBarHidden
//
//{
//    
//    return YES;
//    
//}

 

41.监测网络状态

只要网络状态发生了变化,在任何一个视图控制器都会给出相应的提示

说明: 这里需要导入第三方库,1. MBProgressHUD 2. AFNetworking
导入头文件 MBProgressHUD.h, AFNetworking.h

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 应用程序加载完成

    UIWindow *window = ((AppDelegate *) [UIApplication sharedApplication].delegate).window;

    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        // 使用MBProgressHUD三方库创建弹框,给出相应的提示
        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:window animated:YES];
        hud.mode = MBProgressHUDModeText;
        switch (status) {
            case AFNetworkReachabilityStatusNotReachable:
                // 弹框提示的内容
                hud.labelText = @"世界上最遥远的距离就是没网";
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                hud.labelText = @"2G/3G/4G";
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                hud.labelText = @"WiFi在线";
            default:
                break;
        }
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            // 显示时间2s
            sleep(2);
            dispatch_async(dispatch_get_main_queue(), ^{
                // 让弹框消失
                [MBProgressHUD hideHUDForView:window animated:YES];
            });
        });
    }];
    [manager startMonitoring];

    return YES;
}

另一种:

 

 

 

42.将window上的显示在最外层

  [[[[UIApplication sharedApplication] delegate] window] addSubview:topImgView];

 

 

43.强制横屏代码

#pragma mark - 强制横屏代码
- (BOOL)shouldAutorotate
{
    //是否支持转屏
    return NO;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    //支持哪些转屏方向
    return UIInterfaceOrientationMaskLandscape;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeRight;
}

- (BOOL)prefersStatusBarHidden
{
    return NO;
}

44.添加每个cell出现时的3D动画

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    // 动画1
    //    CATransform3D rotation;//3D旋转
    //    rotation = CATransform3DMakeRotation( (90.0*M_PI)/180, 0.0, 0.7, 0.4);
    //    //逆时针旋转
    //    rotation.m34 = 1.0/ -600;
    //
    //    cell.layer.shadowColor = [[UIColor blackColor]CGColor];
    //    cell.layer.shadowOffset = CGSizeMake(10, 10);
    //    cell.alpha = 0;
    //
    //    cell.layer.transform = rotation;
    //
    //    [UIView beginAnimations:@"rotation" context:NULL];
    //    //旋转时间
    //    [UIView setAnimationDuration:0.8];
    //    cell.layer.transform = CATransform3DIdentity;
    //    cell.alpha = 1;
    //    cell.layer.shadowOffset = CGSizeMake(0, 0);
    //    [UIView commitAnimations];




    // 动画2
    cell.alpha = 0.5;

    CGAffineTransform transformScale = CGAffineTransformMakeScale(0.3,0.8);
    CGAffineTransform transformTranslate = CGAffineTransformMakeTranslation(0.5, 0.6);

    cell.transform = CGAffineTransformConcat(transformScale, transformTranslate);

    [tableView bringSubviewToFront:cell];
    [UIView animateWithDuration:.4f
                          delay:0
                        options:UIViewAnimationOptionAllowUserInteraction
                     animations:^{

                         cell.alpha = 1;
                         //清空 transform
                         cell.transform = CGAffineTransformIdentity;

                     } completion:nil];





    // 动画3
    /*
     // 从锚点位置出发,逆时针绕 Y 和 Z 坐标轴旋转90度
     CATransform3D transform3D = CATransform3DMakeRotation(M_PI_2, 0.0, 1.0, 1.0);

     // 定义 cell 的初始状态
     cell.alpha = 0.0;
     cell.layer.transform = transform3D;
     cell.layer.anchorPoint = CGPointMake(0.0, 0.5); // 设置锚点位置;默认为中心点(0.5, 0.5)

     // 定义 cell 的最终状态,执行动画效果
     // 方式一:普通操作设置动画
     [UIView beginAnimations:@"transform" context:NULL];
     [UIView setAnimationDuration:0.5];
     cell.alpha = 1.0;
     cell.layer.transform = CATransform3DIdentity;
     CGRect rect = cell.frame;
     rect.origin.x = 0.0;
     cell.frame = rect;
     [UIView commitAnimations];

     // 方式二:代码块设置动画
     //        [UIView animateWithDuration:0.5 animations:^{
     //                cell.alpha = 1.0;
     //                 cell.layer.transform = CATransform3DIdentity;
     //                CGRect rect = cell.frame;
     //                 rect.origin.x = 0.0;
     //            cell.frame = rect;
     //             }];

     */





}

 

45.block传值

block回调进行传值操作   
首先思考你的值在什么地方(哪个控制器)A
谁需要这个值 B

一般block都是从后往前传值即(A对象先初始化 在A对象的生命周期中因为某些情况 需要B对象提供一个参数,那我们是在A的实现中初始化了B对象 A对象就可以获取到B对象 那就意味着可以将B对象的block.实现在A的肚子里 B对象可以获取到参数,获取到参数之后调用自己的block,就相当于方法调用,因为这个block实现在A中,所以系统会回到A的肚子里执行block的实现);
示例

A控制器中的一个按钮方法
-(void)buttonAction{
//初始化一个B控制器
    B *bVC = [B new];
//实现B控制器的block
   bVC.block = ^(参数类型  *参数名称){
      nslog:(@“这是block的实现    获取到参数%@”,参数名称);
   };
}

B控制器中请求数据的方法
-(void)requestData{

//获取到数据后调用自己的block并传入参数

   self.block(参数) ;    调用block的时候系统回去寻找这个block的实现 无论它在哪里实现都会执行 如果没有实现会导致奔溃 所以我们一般会加个if判断一下是否实现了block

 

46.iPhone尺寸规格  (2019.9.18更新)

 

47.判断程序是否第一次启动

 if(![[NSUserDefaults standardUserDefaults] boolForKey:@"firstLaunch"]){
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"firstLaunch"];
        NSLog(@"第一次启动");
        [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"isLogin"];

    }else{
        NSLog(@"已经不是第一次启动了");
    }


48.修改状态栏颜色

iOS7默认状态栏文字颜色为黑色,项目需要修改为白色。

1在Info.plist中设置UIViewControllerBasedStatusBarAppearance 为NO
2 在需要改变状态栏颜色的 AppDelegate中在 didFinishLaunchingWithOptions 方法中增加: 
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
如果需要在单个ViewController中添加,在ViewDidLoad方法中增加:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

 

 

 

 

 

 

49.一行代码解决改变展位图文本颜色代码

[_userName setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];

 

50.禁止横屏方法

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window  
{  
    return UIInterfaceOrientationMaskPortrait;  
}

 

 

51.UILabel换行

UILabel *tips = [[UILabel alloc]initWithFrame:CGRectMake(20, 16, kWidth - 20, 45)];  
[tips setTextColor:[UIColor grayColor]];  
[tips setText:@"支付密码必须为6位数字组合。\n您可依次进入 '功能列表' -> '安全中心' 修改支付密码。"];  
[tips setFont:[UIFont boldSystemFontOfSize:12]];  
tips.textAlignment = NSTextAlignmentLeft;  
tips.numberOfLines = 0; // 关键一句  

 

 

 

52.UILabel显示HTML文本

NSString * htmlString = @"<html><body> Some html string \n <font size=\"13\" color=\"red\">This is some text!</font> </body></html>";  
NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];  
UILabel * myLabel = [[UILabel alloc] initWithFrame:self.view.bounds];  
myLabel.attributedText = attrStr;  

 

53.NSString找到网址

 

NSError *error;
    NSString *regulaStr = @"\\bhttps?://[a-zA-Z0-9\\-.]+(?::(\\d+))?(?:(?:/[a-zA-Z0-9\\-._?,'+\\&%$=~*!():@\\\\]*)+)?";
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regulaStr
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:&error];
    NSArray *arrayOfAllMatches = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];
    
    for (NSTextCheckingResult *match in arrayOfAllMatches)
    {
        NSString* substringForMatch = [string substringWithRange:match.range];
     NSLog(@"%@",substringForMatch);
    }

 

54.UIImageView渲染颜色(2016.12.30更新)

设置UIImage的渲染模式:UIImage.renderingMode

着色(Tint Color)是iOS7界面中的一个.设置UIImage的渲染模式:UIImage.renderingMode重大改变,你可以设置一个UIImage在渲染时是否使用当前视图的Tint Color。UIImage新增了一个只读属性:renderingMode,对应的还有一个新增方法:imageWithRenderingMode:,它使用UIImageRenderingMode枚举值来设置图片的renderingMode属性。该枚举中包含下列值:

  1. UIImageRenderingModeAutomatic  // 根据图片的使用环境和所处的绘图上下文自动调整渲染模式。  
  2. UIImageRenderingModeAlwaysOriginal   // 始终绘制图片原始状态,不使用Tint Color。  
  3. UIImageRenderingModeAlwaysTemplate   // 始终根据Tint Color绘制图片,忽略图片的颜色信息。  
UIImage *img = [UIImage imageNamed:@ "myimage" ]; 
img = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
UIImageView *imageView  = [UIImageView alloc] initWithImage:img];
imageView.tintColor = [UIColor redColor];


UIButton上的图片渲染

    UIButton *button = [UIButton buttonWithType:(UIButtonTypeCustom)];
    button.frame = CGRectMake(cWidth - 45, 0, 40, 40);
    [button setImageEdgeInsets:UIEdgeInsetsMake(10, 10, 10, 10)];
    UIImage *image = [UIImage imageNamed:@"jinanguanbi"];
    image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    button.imageView.tintColor = [UIColor whiteColor];
    [button setImage:image forState:(UIControlStateNormal)];


 

55.判断页面消失或出现时是push还是pop操作(2016.12.30更新)

- (void)viewWillDisappear:(BOOL)animated {  
    NSArray *viewControllers = self.navigationController.viewControllers;//获取当前的视图控制其  
    if (viewControllers.count > 1 && [viewControllers objectAtIndex:viewControllers.count-2] == self) {  
        //当前视图控制器在栈中,故为push操作  
        NSLog(@"push");  
    } else if ([viewControllers indexOfObject:self] == NSNotFound) {  
        //当前视图控制器不在栈中,故为pop操作  
        NSLog(@"pop");  
    }  
}  

 

56.直接退出应用(2016.12.30.更新)

//使用  
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{  
    [self exitApplication];  
}  
  
//退出方法  
- (void)exitApp {  
[UIView beginAnimations:@"exitApplication" context:nil];  
 [UIView setAnimationDuration:0.5];   
[UIView setAnimationDelegate:self];   
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view.window cache:NO];   
[UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)];  
 self.view.window.bounds = CGRectMake(0, 0, 0, 0);   
[UIView commitAnimations];  
}  
- (void)animationFinished:(NSString *)animationID finished:(NSNumber *)finished context:(voidvoid *)context {   
if ([animationID compare:@"exitApplication"] == 0)   
{  
 //退出  
   exit(0);  
 }  
}  

 

56.抖动动画(2016.12.30.更新)

 

- (void)shakeAnimation  
{  
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position.x"];  
    //获取当前View的position坐标  
    CGFloat positionX = self.layer.position.x;  
    //设置抖动的范围  
    animation.values = @[@(positionX-10),@(positionX),@(positionX+10)];  
    //动画重复的次数  
    animation.repeatCount = 3;  
    //动画时间  
    animation.duration = 0.07;  
    //设置自动反转  
    animation.autoreverses = YES;  
    [self.layer addAnimation:animation forKey:nil];  
}  

 

57.UIImage转化为Base64字符串(2017.01.12更新)

UIImage *image = [UIImage imageNamed:@"avatar"];
NSData *imageData =UIImagePNGRepresentation(image);
NSString *imageString = [imageData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

 

58.截屏的几种实现方法(2017.08.09更新)

 

- (UIImage *)getImageViewWithView:(UIView *)view
{
    if (CGRectIsEmpty(view.frame)) {
        return nil;
    }
	UIGraphicsBeginImageContext(view.frame.size);
	[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];
	UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
	UIGraphicsEndImageContext();
	
	return image;
}

 

    CGImageRef UIGetScreenImage();
    CGImageRef img = UIGetScreenImage();
    UIImage *scImage = [UIImage imageWithCGImage:img];
    UIImageWriteToSavedPhotosAlbum(scImage, nil, nil, nil);

其中下面的方法对WKWebView画面截取存在问题,具体请参考博文:http://www.jianshu.com/p/aa64fd3dd621

- (UIImage *)imageFromView
{

    UIGraphicsBeginImageContext(self.view.frame.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self.view.layer renderInContext:context];
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return theImage;
}

 

59.NSTimer的暂停和继续 (2017.8.19更新)

API里面NSTimer 是没有暂停继续的方法的,只有fire和invalidate,前者是开工的意思,后者是废掉的意思,如果用废掉来代替暂停的功能?显然是不对的。

那肿么办呢?其实NSTimer 有一个属性叫 fireDate ,啥意思呢?fireDate么,就是fire 的开始时间所以我们就有了思路了。

暂停: [timer setFireDate:[NSDate distantFuture]]; distantFuture,就是问你未来有多远呢?好远好远就是无法到达的时间,所以 timer就一直等待不 fire了。也就是暂停了。

继续: [timer setFireDate:[NSDate date]]; 这个当然就是把fire 的时间设置为当前时刻,所以timer就立刻开工啦!

完事!

60.tabbar隐藏上面的黑线 (2017.8.29更新)

//UITabBarController里面
[[UITabBar appearance] setBackgroundImage:[UIImage imageNamed:@"BarBackground.png"];   
[[UITabBar appearance] setShadowImage:[UIImage new]];

 

61.UIColor新增方法

在iOS10苹果官方建议我们使用sRGB,因为它性能更好,色彩更丰富。如果你自己为UIColor写了一套分类的话也可尝试替换成是RGB,UIColor类中新增了两个Api如下:

+ (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);

- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);

 

62.真彩色的显示

真彩色的显示会根据光感应器来自动的调节达到特定环境下显示与性能的平衡效果,如果需要这个功能的话,可以在info.plist-Source Code里配置:

<key>UIWhitePointAdaptivityStyle</key>

 

它有五种取值,分别是:
<string>UIWhitePointAdaptivityStyleStandard</string> // 标准模式
<string>UIWhitePointAdaptivityStyleReading</string> // 阅读模式
<string>UIWhitePointAdaptivityStylePhoto</string> // 图片模式
<string>UIWhitePointAdaptivityStyleVideo</string> // 视频模式
<string>UIWhitePointAdaptivityStyleStandard</string> // 游戏模式


也就是说如果你的项目是阅读类的,就选择UIWhitePointAdaptivityStyleReading这个模式,五种模式的显示效果是从上往下递减,也就是说如果你的项目是图片处理类的,你选择的是阅读模式,给其选择太好的效果会影响性能.

63.NSDate的使用技巧今天如何得到昨天 今天如何获取明天 (2018.05.19更新)

    NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd"];
    NSDate *nowDate = [NSDate date];
    NSString *nowDateStr = [dateFormatter stringFromDate:nowDate];
    NSDate *lastDate = [nowDate dateByAddingTimeInterval:- 24 * 60 * 60];
    NSString *lastDateStr = [dateFormatter stringFromDate:lastDate];
    NSDate *nextDate = [nowDate dateByAddingTimeInterval:24 * 60 * 60];
    NSString *nextDateStr = [dateFormatter stringFromDate:nextDate];

注:dateByAddingTimeInterval方法是目前使用的,addTimeInterval方法已被废弃。参数为秒数seconds

以上代码Console输出结果为:

2018-05-19

2018-05-18

2018-05-20

64.随机色宏定义(2018.08.27更新)

#define random(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)/255.0]

#define randomColor random(arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256))

65.打印iOS里所有字体(2018.09.12更新)

#pragma mark - Object Private Function

- (void)getFontNames
{
    NSArray *familyNames = [UIFont familyNames];
    
    for (NSString *familyName in familyNames) {
        printf("familyNames = %s\n",[familyName UTF8String]);
        
        NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName];
        
        for (NSString *fontName in fontNames) {
            printf("\tfontName = %s\n",[fontName UTF8String]);
        }
    }
}

常用字体:

familyNames = PingFang SC
    fontName = PingFangSC-Ultralight
    fontName = PingFangSC-Regular
    fontName = PingFangSC-Semibold
    fontName = PingFangSC-Thin
    fontName = PingFangSC-Light
    fontName = PingFangSC-Medium

66.在App内返回到指定页面

pop

for (UIViewController *controller in self.navigationController.viewControllers) {
            if ([controller isKindOfClass:[要返回的类名 class]]) {
                [self.navigationController popToViewController:controller animated:YES];
            }
 }

dismiss 返回rootViewController

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:NO completion:nil];

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值