iOS开发中的一些小技巧(不断更新)

程序员其实就是在不断地学习中进步, 这个帖子会记录一些iOS开发中的小技巧, 我也会不断更新的, until I leave from iOS.

2016.09.02于广州 雨

1.设置UITextField的起始光标位置
光标的起始位置太靠近左侧

解决方法是UITextField有一个leftView属性, 使用改属性即可解决该问题.

UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, wantWidth, searchTextField.my_height)];
    searchTextField.leftViewMode = UITextFieldViewModeAlways;
    leftView.backgroundColor = [UIColor clearColor];
    searchTextField.leftView = leftView;

其中wantSize就是光标距离textField左侧的距离, 而且一定要设置leftViewMode, 否则leftView是不会显示的, 因为leftView是默认UITextFieldViewModeNever.

typedef NS_ENUM(NSInteger, UITextFieldViewMode) {
    UITextFieldViewModeNever,
    UITextFieldViewModeWhileEditing,
    UITextFieldViewModeUnlessEditing,
    UITextFieldViewModeAlways
};
设置完leftView

这样是不是就好看多了~

2.导航栏的隐藏问题

当从一个没有导航栏的控制器A push一个应该有导航栏的控制器B中.
可以在A的viewWillAppear中写[self.navigationController setNavigationBarHidden:YES];
在B的viewDidLoad中写[self.navigationController setNavigationBarHidden:NO];
乍看之下是解决了这个问题. 可是当你在B控制器中用侧滑返回到一半, 接着又不想返回到A控制器了,再回到B控制器你会发现B的导航栏消失了.

导航栏消失

你在网上寻求解决方法, 哦, 原来应该在B控制器中的viewWillAppear中写[self.navigationController setNavigationBarHidden:NO];. 你满心欢喜认为问题解决了, 可是你在侧滑返回的时候导航栏仍然是隐藏的, 是因为此时已经触发了A控制器的viewWillAppear方法.下面是解决方法:
在不显示导航栏的控制器(A), 遵循导航栏的代理.实现其代理方法:

#pragma mark - UINavigationControllerDelegate
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    BOOL isShowBar = [viewController isKindOfClass:[self class]];
    [self.navigationController setNavigationBarHidden:isShowBar animated:YES];
}
这样导航栏就不会隐藏了

2016.09.19 最近比较闲,项目等待审核呢,天天自己看看书挺好的

3.在APPDelegate显示UIAlertViewController

UIAlertView在8.0的时候已经过期了,很多SDK种在APPDelegate中仍使用 UIAlertView,就会报警告.

因此需要将 UIAlertView替换为 UIAlertViewController, 在UIViewController中显示UIAlertViewController是很简单的,只需要modal就可以.但是如何在APPDelegate显示呢? 下面上代码

  UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"在APPDelegate中打开UIAlertController" message:@"开~" preferredStyle:UIAlertControllerStyleAlert];
    [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
这样就可以解决了

2016.11.02 广州,进步中.

4.改变不同状态下的UIButton的背景颜色

最近要做充值页面, 金额按钮在选中状态的背景颜色需要变成橙色


充值页面

UIButton只有一个backgroundColor的属性, 无法根据不同状态改变背景颜色.
但是UIButton有这样一个接口, 根据不同状态修改背景图片

- (void)setBackgroundImage:(nullable UIImage *)image forState:(UIControlState)state UI_APPEARANCE_SELECTOR;

所以我们可以将颜色装换成图片, 写一个UIImgae的分类

+ (UIImage *)imageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}

这样就可以完成需求了

[self.selectMoneyBtn setBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor]] forState:UIControlStateNormal];
[self.selectMoneyBtn setBackgroundImage:[UIImage imageWithColor:LHZColor(255, 242, 236)] forState:UIControlStateSelected];

2017.05.02 好久没更新了, 不喜欢转载那些已经被别人转无数次的东西, 自己的积累又不够,导致更新这么慢

5.在NSConcreteValue中取出CGRect的值

KVO监听某一个对象frame的改变, 在- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context这个方法中,通过change这个字典拿到前后改变的frame.
可是当你用[change objectForKey:NSKeyValueChangeNewKey]或者[change objectForKey:NSKeyValueChangeOldKey]取值时,却发现得出的类型是NSConcreteValue.这下该如何是好呢?其实很简单,先将值类型由NSConcreteValue转为NSString, 就可以得到CGRect咯/

NSString *oldFrameStr = [NSString stringWithFormat:@"%@", [change objectForKey:NSKeyValueChangeOldKey]];
CGRect oldFrame = CGRectFromString(oldFrameStr);

注意点, 第一步转换的时候不要用NSString *oldFrameStr = (NSString *) [change objectForKey:NSKeyValueChangeOldKey];

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

推荐阅读更多精彩内容

  • 1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现cl...
    以德扶人阅读 2,333评论 2 50
  • 多久之前呢,那时候还小,小到还不懂的什么叫别离,那时候也有看过这部电视剧,可是似乎除了那战火纷飞中的拥抱以...
    大猫小米阅读 323评论 0 1
  • 一 远离南方的家,北上西安,到今天已经满两个月了。 从登上火车出发时的兴致勃勃,到如今漫步陌生街头的寂寞,我的心里...
    朱泽润阅读 357评论 4 2
  • 一、事由 4月14日,傍晚,父亲垂钓骑车归来,顿觉头昏目眩,面色煞白,心里憋闷得慌,未用晚餐而眠。 儿子也不轻松,...
    晴鹤1阅读 281评论 0 0