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

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

2016.09.02于广州 雨

1.设置UITextField的起始光标位置
iOS开发中的一些小技巧(不断更新)_第1张图片
光标的起始位置太靠近左侧

解决方法是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
};
iOS开发中的一些小技巧(不断更新)_第2张图片
设置完leftView

这样是不是就好看多了~

2.导航栏的隐藏问题

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

iOS开发中的一些小技巧(不断更新)_第3张图片
导航栏消失

你在网上寻求解决方法, 哦, 原来应该在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];
}
iOS开发中的一些小技巧(不断更新)_第4张图片
这样导航栏就不会隐藏了

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];
iOS开发中的一些小技巧(不断更新)_第5张图片
这样就可以解决了

2016.11.02 广州,进步中.

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

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


iOS开发中的一些小技巧(不断更新)_第6张图片
充值页面

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 *)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];

你可能感兴趣的:(iOS开发中的一些小技巧(不断更新))