iOS 小技巧总结

链接:http://www.jianshu.com/p/4523eafb4cd4


在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新。


UITableView的Group样式下顶部空白处理


//分组列表头部空白处理

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0.1)];

self.tableView.tableHeaderView = view;


UITableView的plain样式下,取消区头停滞效果


(void)scrollViewDidScroll:(UIScrollView *)scrollView

{

    CGFloat sectionHeaderHeight = sectionHead.height;

    if (scrollView.contentOffset.y=0)

    {

        scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);

    }

    else if(scrollView.contentOffset.y>=sectionHeaderHeight)

    {

        scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);

    }

}


那个,其实,还是用Group样式吧哈哈。


获取某个view所在的控制器


(UIViewController *)viewController

{

  UIViewController *viewController = nil;  

  UIResponder *next = self.nextResponder;

  while (next)

  {

    if ([next isKindOfClass:[UIViewController class]])

    {

      viewController = (UIViewController *)next;      

      break;    

    }    

    next = next.nextResponder;  

  }

    return viewController;

}


两种方法删除NSUserDefaults所有记录


//方法一

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

 

 

//方法二

(void)resetDefaults

{

    NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];

    NSDictionary * dict = [defs dictionaryRepresentation];

    for (id key in dict)

    {

        [defs removeObjectForKey:key];

    }

    [defs synchronize];

}


打印系统所有已注册的字体名称


#pragma mark - 打印系统所有已注册的字体名称

void enumerateFonts()

{

    for(NSString *familyName in [UIFont familyNames])

   {

        NSLog(@"%@",familyName);               

        NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName];       

        for(NSString *fontName in fontNames)

       {

            NSLog(@"\t|- %@",fontName);

       }

   }

}


获取图片某一点的颜色


(UIColor*) getPixelColorAtLocation:(CGPoint)point inImage:(UIImage *)image

{

 

    UIColor* color = nil;

    CGImageRef inImage = image.CGImage;

    CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];

 

    if (cgctx == NULL) {

        return nil; /* error */

    }

    size_t w = CGImageGetWidth(inImage);

    size_t h = CGImageGetHeight(inImage);

    CGRect rect = {{0,0},{w,h}};

 

    CGContextDrawImage(cgctx, rect, inImage);

    unsigned chardata = CGBitmapContextGetData (cgctx);

    if (data != NULL) {

        int offset = 4*((w*round(point.y))+round(point.x));

        int alpha =  data[offset];

        int red = data[offset+1];

        int green = data[offset+2];

        int blue = data[offset+3];

        color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:

                 (blue/255.0f) alpha:(alpha/255.0f)];

    }

    CGContextRelease(cgctx);

    if (data) {

        free(data);

    }

    return color;

}


字符串反转


第一种:

(NSString *)reverseWordsInString:(NSString *)str

{    

    NSMutableString *newString = [[NSMutableString alloc] initWithCapacity:str.length];

    for (NSInteger i = str.length - 1; i >= 0 ; i --)

    {

        unichar ch = [str characterAtIndex:i];       

        [newString appendFormat:@"%c", ch];    

    }    

     return newString;

}

 

//第二种:

(NSString*)reverseWordsInString:(NSString*)str

{    

     NSMutableString *reverString = [NSMutableString stringWithCapacity:str.length];    

     [str enumerateSubstringsInRange:NSMakeRange(0, str.length) options:NSStringEnumerationReverse | NSStringEnumerationByComposedCharacterSequences  usingBlock:^(NSString *substring, NSRange substringRange,NSRange enclosingRange, BOOL *stop) {

          [reverString appendString:substring];                         

      }];    

     return reverString;

}


禁止锁屏,


默认情况下,当设备一段时间没有触控动作时,iOS会锁住屏幕。但有一些应用是不需要锁屏的,比如视频播放器。


[UIApplication sharedApplication].idleTimerDisabled = YES;

[[UIApplication sharedApplication] setIdleTimerDisabled:YES];


模态推出透明界面


UIViewController *vc = [[UIViewController alloc] init];

UINavigationController *na = [[UINavigationController alloc] initWithRootViewController:vc];

 

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

{

     na.modalPresentationStyle = UIModalPresentationOverCurrentContext;

}

else

{

     self.modalPresentationStyle=UIModalPresentationCurrentContext;

}

 

[self presentViewController:na animated:YES completion:nil];


Xcode调试不显示内存占用


editSCheme  里面有个选项叫叫做enable zoombie Objects  取消选中


显示隐藏文件


//显示

defaults write com.apple.finder AppleShowAllFiles -bool true

killall Finder

 

//隐藏

defaults write com.apple.finder AppleShowAllFiles -bool false

killall Finder


字符串按多个符号分割



iOS跳转到App Store下载应用评分


[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=APPID"]];


iOS 获取汉字的拼音


(NSString *)transform:(NSString *)chinese

{    

    //将NSString装换成NSMutableString 

    NSMutableString *pinyin = [chinese mutableCopy];    

    //将汉字转换为拼音(带音标)    

    CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO);    

    NSLog(@"%@", pinyin);    

    //去掉拼音的音标    

    CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripCombiningMarks, NO);    

    NSLog(@"%@", pinyin);    

    //返回最近结果    

    return pinyin;

}


手动更改iOS状态栏的颜色


(void)setStatusBarBackgroundColor:(UIColor *)color

{

    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];

 

    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)])

    {

        statusBar.backgroundColor = color;    

    }

}


判断当前ViewController是push还是present的方式显示的


NSArray *viewcontrollers=self.navigationController.viewControllers;

 

if (viewcontrollers.count > 1)

{

    if ([viewcontrollers objectAtIndex:viewcontrollers.count - 1] == self)

    {

        //push方式

       [self.navigationController popViewControllerAnimated:YES];

    }

}

else

{

    //present方式

    [self dismissViewControllerAnimated:YES completion:nil];

}


获取实际使用的LaunchImage图片


(NSString *)getLaunchImageName

{

    CGSize viewSize = self.window.bounds.size;

    // 竖屏    

    NSString *viewOrientation = @"Portrait";  

    NSString *launchImageName = nil;    

    NSArray* imagesDict = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"UILaunchImages"];

    for (NSDictionary* dict in imagesDict)

    {

        CGSize imageSize = CGSizeFromString(dict[@"UILaunchImageSize"]);

        if (CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]])

        {

            launchImageName = dict[@"UILaunchImageName"];        

        }    

    }    

    return launchImageName;

}


iOS在当前屏幕获取第一响应


UIWindow * keyWindow = [[UIApplication sharedApplication] keyWindow];

UIView * firstResponder = [keyWindow performSelector:@selector(firstResponder)];


判断对象是否遵循了某协议


if ([self.selectedController conformsToProtocol:@protocol(RefreshPtotocol)])

{

     [self.selectedController performSelector:@selector(onTriggerRefresh)];

}


判断view是不是指定视图的子视图


BOOL isView = [textView isDescendantOfView:self.view];


NSArray 快速求总和 最大值 最小值 和 平均值


NSArray *array = [NSArray arrayWithObjects:@"2.0", @"2.3", @"3.0", @"4.0", @"10", nil];

CGFloat sum = [[array valueForKeyPath:@"@sum.floatValue"] floatValue];

CGFloat avg = [[array valueForKeyPath:@"@avg.floatValue"] floatValue];

CGFloat max =[[array valueForKeyPath:@"@max.floatValue"] floatValue];

CGFloat min =[[array valueForKeyPath:@"@min.floatValue"] floatValue];

NSLog(@"%f\n%f\n%f\n%f",sum,avg,max,min);


修改UITextField中Placeholder的文字颜色


[textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];


关于NSDateFormatter的格式


G: 公元时代,例如AD公元

yy: 年的后2位

yyyy: 完整年

MM: 月,显示为1-12

MMM: 月,显示为英文月份简写,如 Jan

MMMM: 月,显示为英文月份全称,如 Janualy

dd: 日,2位数表示,如02

d: 日,1-2位显示,如 2

EEE: 简写星期几,如Sun

EEEE: 全写星期几,如Sunday

aa: 上下午,AM/PM

H: 时,24小时制,0-23

K:时,12小时制,0-11

m: 分,1-2位

mm: 分,2位

s: 秒,1-2位

ss: 秒,2位

S: 毫秒


获取一个类的所有子类


(NSArray *) allSubclasses

{

    Class myClass = [self class];

    NSMutableArray *mySubclasses = [NSMutableArray array];

    unsigned int numOfClasses;

    Class *classes = objc_copyClassList(&numOfClasses;);

    for (unsigned int ci = 0; ci


监测IOS设备是否设置了代理,需要CFNetwork.framework


NSDictionary *proxySettings = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings());

NSArray *proxies = (__bridge NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:@"http://www.baidu.com"]), (__bridge CFDictionaryRef _Nonnull)(proxySettings)));

NSLog(@"\n%@",proxies);

 

NSDictionary *settings = proxies[0];

NSLog(@"%@",[settings objectForKey:(NSString *)kCFProxyHostNameKey]);

NSLog(@"%@",[settings objectForKey:(NSString *)kCFProxyPortNumberKey]);

NSLog(@"%@",[settings objectForKey:(NSString *)kCFProxyTypeKey]);

 

if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"])

{

     NSLog(@"没代理");

}

else

{

     NSLog(@"设置了代理");

}


阿拉伯数字转中文格式


+(NSString *)translation:(NSString *)arebic

{  

    NSString *str = arebic;

    NSArray *arabic_numerals = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"0"];

    NSArray *chinese_numerals = @[@"一",@"二",@"三",@"四",@"五",@"六",@"七",@"八",@"九",@"零"];

    NSArray *digits = @[@"个",@"十",@"百",@"千",@"万",@"十",@"百",@"千",@"亿",@"十",@"百",@"千",@"兆"];

    NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:chinese_numerals forKeys:arabic_numerals];

 

    NSMutableArray *sums = [NSMutableArray array];

    for (int i = 0; i


Base64编码与NSString对象或NSData对象的转换


// Create NSData object

NSData *nsdata = [@"iOS Developer Tips encoded in Base64"

  dataUsingEncoding:NSUTF8StringEncoding];

 

// Get NSString from NSData object in Base64

NSString *base64Encoded = [nsdata base64EncodedStringWithOptions:0];

 

// Print the Base64 encoded string

NSLog(@"Encoded: %@", base64Encoded);

 

// Let's go the other way...

 

// NSData from the Base64 encoded str

NSData *nsdataFromBase64String = [[NSData alloc]

  initWithBase64EncodedString:base64Encoded options:0];

 

// Decoded NSString from the NSData

NSString *base64Decoded = [[NSString alloc]

  initWithData:nsdataFromBase64String encoding:NSUTF8StringEncoding];

NSLog(@"Decoded: %@", base64Decoded);


取消UICollectionView的隐式动画


UICollectionView在reloadItems的时候,默认会附加一个隐式的fade动画,有时候很讨厌,尤其是当你的cell是复合cell的情况下(比如cell使用到了UIStackView)。

下面几种方法都可以帮你去除这些动画


//方法一

[UIView performWithoutAnimation:^{

    [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];

}];

 

//方法二

[UIView animateWithDuration:0 animations:^{

    [collectionView performBatchUpdates:^{

        [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];

    } completion:nil];

}];

 

//方法三

[UIView setAnimationsEnabled:NO];

[self.trackPanel performBatchUpdates:^{

    [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];

} completion:^(BOOL finished) {

    [UIView setAnimationsEnabled:YES];

}];


让Xcode的控制台支持LLDB类型的打印


打开终端输入三条命令:

touch ~/.lldbinit

echo display @import UIKit >> ~/.lldbinit

echo target stop-hook add -o \"target stop-hook disable\" >> ~/.lldbinit


CocoaPods pod install/pod update更新慢的问题


pod install --verbose --no-repo-update 

pod update --verbose --no-repo-update

如果不加后面的参数,默认会升级CocoaPodsspec仓库,加一个参数可以省略这一步,然后速度就会提升不少


UIImage 占用内存大小


UIImage *image = [UIImage imageNamed:@"aa"];

NSUInteger size  = CGImageGetHeight(image.CGImage) * CGImageGetBytesPerRow(image.CGImage);


GCD timer定时器


dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);

dispatch_source_set_timer(timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行

dispatch_source_set_event_handler(timer, ^{

    //@"倒计时结束,关闭"

    dispatch_source_cancel(timer);

    dispatch_async(dispatch_get_main_queue(), ^{

 

    });

});

dispatch_resume(timer);


图片上绘制文字 写一个UIImage的category


(UIImage *)imageWithTitle:(NSString *)title fontSize:(CGFloat)fontSize

{

    //画布大小

    CGSize size=CGSizeMake(self.size.width,self.size.height);

    //创建一个基于位图的上下文

    UIGraphicsBeginImageContextWithOptions(size,NO,0.0);//opaque:NO  scale:0.0

 

    [self drawAtPoint:CGPointMake(0.0,0.0)];

 

    //文字居中显示在画布上

    NSMutableParagraphStyle* paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];

    paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;

    paragraphStyle.alignment=NSTextAlignmentCenter;//文字居中

 

    //计算文字所占的size,文字居中显示在画布上

    CGSize sizeText=[title boundingRectWithSize:self.size options:NSStringDrawingUsesLineFragmentOrigin

                                     attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}context:nil].size;

    CGFloat width = self.size.width;

    CGFloat height = self.size.height;

 

    CGRect rect = CGRectMake((width-sizeText.width)/2, (height-sizeText.height)/2, sizeText.width, sizeText.height);

    //绘制文字

    [title drawInRect:rect withAttributes:@{ NSFontAttributeName:[UIFont systemFontOfSize:fontSize],NSForegroundColorAttributeName:[ UIColor whiteColor],NSParagraphStyleAttributeName:paragraphStyle}];

 

    //返回绘制的新图形

    UIImage *newImageUIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return newImage;

}


查找一个视图的所有子视图


(NSMutableArray *)allSubViewsForView:(UIView *)view

{

    NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];

    for (UIView *subView in view.subviews)

    {

        [array addObject:subView];

        if (subView.subviews.count > 0)

        {

            [array addObjectsFromArray:[self allSubViewsForView:subView]];

        }

    }

    return array;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值