美文网首页iOS知识集算法或者代码 ios零碎记录
iOS开发中的一些小技巧(不断更新)

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

作者: Pusswzy | 来源:发表于2016-09-02 16:19 被阅读833次

    程序员其实就是在不断地学习中进步, 这个帖子会记录一些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];

    相关文章

      网友评论

        本文标题:iOS开发中的一些小技巧(不断更新)

        本文链接:https://www.haomeiwen.com/subject/xutkettx.html