iOS开发过程中的小 tips

之前在做项目的时候经常会遇到一些细小的知识点,不影响做项目的大方向,但确影响了很多细小的点..比如公式转换,汉字拼音,颜色转换等等,什么都涉及...上次写的还是在CSDN写blog时记录的:iOS开发 容易犯错的知识点和不错的细小知识点(持续更新),现在换地方了,就不在接着原来的写了,重开一个,依旧持续更新/记录.

35.当你向项目中添加一个文件夹时,往往会面对Create groupsCreate folder references的选择

前者Create groups for any added folders  : 给任一你添加的文件创建一个组groups
后者Create folder references for any added folders  :给任一你添加的文件创建一个文件夹folder
两的区别是:前者的文件夹是黄色的;后者的文件夹是蓝色的
如果有一个info.h文件需要引用:前者直接导入import "info.h"就可能使用;后者你需要import "文件夹名字/info.h"才可能使用,否则编译时找不到文件info.h。

36.Pointer is missing a nullability type specifier (__nonnull or __nullable)的解决方法:

首尾加入NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END

37.UIButton文本对齐问题

这里使用button.titleLabel.textAlignment = NSTextAlignmentLeft;这行代码是没有效果的,这只是让标签中的文本左对齐,但并没有改变标签在按钮中的对齐方式.
所以,我们首先要使用button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; 这行代码,把按钮的内容(控件)的对齐方式修改为水平左对齐,但是这们会紧紧靠着左边,不好看...
所以我们还可以修改属性:button.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);这行代码可以让按钮的内容(控件)距离左边10个像素,这样就OK了

38.获取window的方法之前都是直接[UIApplication sharedApplication].keyWindow;

之后导入bug tags的时候提醒用比较严谨的获取方法

- (UIWindow *)lastWindow
{
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *window in [windows reverseObjectEnumerator]) {
         
        if ([window isKindOfClass:[UIWindow class]] &&
            CGRectEqualToRect(window.bounds, [UIScreen mainScreen].bounds))
             
            return window;
    }
     
    return [UIApplication sharedApplication].keyWindow;
}

39.延长LaunchImage的显示时间

如果你觉得你开启太快,那么漂亮得LaunchImage还没怎么展示就跳过了.你可以在你的第一个加载页面中添加如下代码来
NSThread.sleepForTimeInterval(3.0)//延长3秒

40.关闭键盘的自动联想和首字母大写功能

[_userNameTextField setAutocorrectionType:UITextAutocorrectionTypeNo];
[_userNameTextField setAutocapitalizationType:UITextAutocapitalizationTypeNone];

41.设置导航栏下方不显示内容(此时导航栏无透明度)

self.extendedLayoutIncludesOpaqueBars = YES;

42.监测键盘通知时,发送多次的解决情况

typedef NS_ENUM(NSInteger, KeyBoardAction) {
    KeyBoardActionShow = 0,
    KeyBoardActionHide = 1
}

self.action = 0;
// Do any additional setup after loading the view, typically from a nib.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(show) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hide) name:UIKeyboardWillHideNotification object:nil];


- (void)show {
    // 防止按home键退出后台再返回前台发送的多余通知
    if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
        return;
    }
    if (_action == KeyBoardActionShow) {
        NSLog(@" name = %s",__FUNCTION__);
        _action = KeyBoardActionHide;
    }
}

- (void)hide {
    if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
        return;
    }
    if (_action == KeyBoardActionHide) {
        NSLog(@" name = %s",__FUNCTION__);
        _action = KeyBoardActionShow;
    }
}

43.http/https请求获取cookie的问题

项目需要获取cookie,但是网上找的获取cookie的方法:

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
   NSLog(@"%@", cookie);
}

无法获取完整的cookie,打印出来的只有一小部分....实际获取的方法是:
NSString *cookieString = [[request.requestOperation.response allHeaderFields ] valueForKey:@"Set-Cookie"];

44.金融产品的金额形式变化

// 30000000 - > 30,000,000
- (NSString *)addMarkToString {
    NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setFormatterBehavior: NSNumberFormatterBehavior10_4];
    [numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
    NSString *numberString = [numberFormatter stringFromNumber: [NSNumber numberWithInteger: self.intValue]];
    return numberString;
}

+(NSString *)countNumAndChangeformat:(CGFloat)num
{
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init] ;
    [numberFormatter setPositiveFormat:@"###,##0.00;"];
    NSString *formattedNumberString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:num]];
    return formattedNumberString;
}

45.iOS中使用blend改变图片颜色

// UIImage Category
- (UIImage *) imageWithTintColor:(UIColor *)tintColor blendMode:(CGBlendMode)blendMode
{
    //We want to keep alpha, set opaque to NO; Use 0.0f for scale to use the scale factor of the device’s main screen.
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0f);
    [tintColor setFill];
    CGRect bounds = CGRectMake(0, 0, self.size.width, self.size.height);
    UIRectFill(bounds);
    
    //Draw the tinted image in context
    [self drawInRect:bounds blendMode:blendMode alpha:1.0f];
    
    if (blendMode != kCGBlendModeDestinationIn) {
        [self drawInRect:bounds blendMode:kCGBlendModeDestinationIn alpha:1.0f];
    }
    
    UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return tintedImage;
}

喵神有篇文章讲这个的->iOS中使用blend改变图片颜色

46.tableView的分割线左边不到头的问题

tableView.separatorInset = UIEdgeInsetsZero
tableView.layoutMargins = UIEdgeInsetsZero
    func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        cell.separatorInset = UIEdgeInsetsZero
        cell.layoutMargins = UIEdgeInsetsZero
        cell.preservesSuperviewLayoutMargins = false
    }

47.实现UITableView Plain SectionView和table不停留一起滑动

1) 这个代码是通过scroll偏移量来监听和改变你的tableview的contentInset 可见很不好(试试就知道) X

   // 去掉UItableview headerview黏性(sticky)
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        CGFloat sectionHeaderHeight = 40;(你的section高度)
        if (scrollView.contentOffset.y<=sectionHeaderHeight&&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);
        }
    }

2)和第一个没太大本质区别,在自定义headSectionView中重写setframe方法来重载table的sectionTablePlainSectionView

- (void)setFrame:(CGRect)frame{
    CGRect sectionRect = [self.tableView rectForSection:self.section];
    CGRect newFrame = CGRectMake(CGRectGetMinX(frame), CGRectGetMinY(sectionRect), CGRectGetWidth(frame), CGRectGetHeight(frame)); [super setFrame:newFrame];
}

3)不推荐使用Plain style,改用 Group style, 只需要将 footerSectionHeight 设置为0.01(不是固定的,保证很小就行), HeaderSectionHeight按照实际需求高度多少设置就行,一样可以实现 Plain style 的效果

48.Swift 沙盒路径集合

// MARK: - 沙盒路径集合
// http://stackoverflow.com/questions/32501627/stringbyappendingpathcomponent-is-unavailable
// http://stackoverflow.com/questions/32120581/stringbyappendingpathcomponent-is-unavailable
extension String {
    var lastPathComponent: String {
        return (self as NSString).lastPathComponent
    }
    
    var pathExtension: String {
        return (self as NSString).pathExtension
    }
    
    var stringByDeletingLastPathComponent: String {
        return (self as NSString).stringByDeletingLastPathComponent
    }
    
    var stringByDeletingPathExtension: String {
        return (self as NSString).stringByDeletingPathExtension
    }
    
    var pathComponents: [String] {
        return (self as NSString).pathComponents
    }
    
    func stringByAppendingPathComponent(path: String) -> String {
        let nsSt = self as NSString
        return nsSt.stringByAppendingPathComponent(path)
    }
    
    func stringByAppendingPathExtension(ext: String) -> String? {
        let nsSt = self as NSString
        return nsSt.stringByAppendingPathExtension(ext)  
    }  
}

49.用hidesBottomBarWhenPushed属性实现隐藏BottomBar时候的的几个坑!

在创建好后,马上调用 vc.hidesBottomBarWhenPushed = true
下面有几个新手常掉进去的坑:
1.不能够在viewDidLoad() 方法里调用, 一定要在viewDidLoad加载之前  也就是 push之前调用:
2.区分下面两个方法
    A -> hidesBottomBarWhenPushed = true
    B -> self.navigationController?.hidesBottomBarWhenPushed = true  这个方法会因为没有被push前,就没有navigationController, 所以设置无效

50.UIViewcontroller的title

// will set the title of a navigationBar and also cause the title to cascade down to a UITabBarItem, if present.
self.title = @"Your title";

// will only set the title of the navigationBar, assuming a UINavigationController is present, and NOT affect a UITabBarItem.
self.navigationItem.title = @"Your title";  

// will set the title of a UITabBarItem but NOT the UINavigationBar.
self.navigationController.title = @"Your title";

51.memory-leak-when-using-wkscriptmessagehandler

http://stackoverflow.com/questions/31094110/memory-leak-when-using-wkscriptmessagehandler

52. UIScrollView 的 autolayout

Storyboard中,如果父视图是 UIScrollView, 在它上面不要直接绘制各个子控件, 应该先拖一个UIView约束为(0,0,0,0),再到这个 view 上去绘制.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容