• iOS 开发技巧总结


    常用代码片断,只为了便于记忆

    日期格式转换

        // 设置数据模型的时间
        NSDate *now = [NSDate date];
        NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
        fmt.dateFormat = @"HH:mm";
    
        msg.time = [fmt stringFromDate:now];
        //  fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
        //  结果:2014-08-09 15:45:56

     Modal

    除了push之外,还有另外一种控制器的切换方式,那就是Modal
    任何控制器都能通过Modal的形式展示出来
    Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止
    // 以Modal的形式展示控制器
    - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion
    
    // 关闭当初Modal出来的控制器
    - (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion;

    @property属性的用法

    • weak(assign) :  代理UI控件
    • strong(retain) : 其他对象(除代理UI控件字符串以外的对象),可变数组
    • copy : 字符串/不可变数组NSArray
    • assign : 非对象类型(基本数据类型intfloatBOOL枚举结构体)

    图片开启交互

    userInteractionEnabled属性默认值为YES,但UIView的一些子类中对该属性进行了覆盖,并将其默认值设置为了NO,其中UIImageView和UILabel就是这样的类。userInteractionEnabled属性在UIImageView和UILabel的文档中都有简单的描述。在实际的界面开发过程中,我们经常用UIImageView来模拟按钮或其它可以响应用户touch事件的显示区,并通过gesture来为其添加事件响应,因此为了保证事件能正常的接受,我们必须要显示的将UIImageView对象的userInteractionEnabled的值设为YES 。

       UIImageView *containerView = [[UIImageView alloc] init];
         containerView.image = [UIImage imageNamed:@"popover_background"];
         containerView.userInteractionEnabled = YES; // 开启交互

    图片固定宽高填充

         // 内容模式
         self.contentMode = UIViewContentModeScaleAspectFill;
         // 超出边框的内容都剪掉
         self.clipsToBounds = YES;

    获取扩展名

    [photo.thumbnail_pic.lowercaseString hasSuffix:@"gif"];

    点击cell的时候不要变色

            self.backgroundColor = [UIColor clearColor];
            // 点击cell的时候不要变色
            self.selectionStyle = UITableViewCellSelectionStyleNone;
            

     状态栏菊花

    状态栏有网络请求前,设置为Yes 。在网络请求结束,设置为No。

        //状态栏菊花
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

     修改pageController默认分页点

        [_pageController setValue:[UIImage imageNamed:@"home_slipt_nor"] forKeyPath:@"_pageImage"];
        [_pageController setValue:[UIImage imageNamed:@"home_slipt_pre"] forKeyPath:@"_currentPageImage"];

    Xib中Lable换行

    Lable的文字想换行,按信Option+空格。

    获取系统所有的View

        for (UIView  *view in [UIApplication sharedApplication].keyWindow.subviews) {
            if ([view isKindOfClass:[LeftMenu class]]) {
                //[view  removeFromSuperview];
                return;
            }
        }

    UIButton 设置图片不变型 setImage:

    [btn.imageView setContentMode:UIViewContentModeScaleAspectFill];

    UIButton设置图片在上面,文字在下面

    见我的另一篇文章:http://www.cnblogs.com/jys509/p/4989893.html

    数组排序

        // 排序
        // 系统是按照从小 -> 大的顺序排列对象
        [parts sortUsingComparator:^NSComparisonResult(HWTextPart *part1, HWTextPart *part2) {
            // NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending
            // 返回NSOrderedSame:两个一样大
            // NSOrderedAscending(升序):part2>part1
            // NSOrderedDescending(降序):part1>part2
            if (part1.range.location > part2.range.location) {
                // part1>part2
                // part1放后面, part2放前面
                return NSOrderedDescending;
            }
            // part1<part2
            // part1放前面, part2放后面
            return NSOrderedAscending;
        }];

    parts 是 NSMutableArray 数组。

     改变状态栏颜色

     定义一个全局的变量

     UIStatusBarStyle    _statusBarStyle

    实现重写方法

    //修改状态栏的状态 浅色
    - (UIStatusBarStyle)preferredStatusBarStyle {
        return _statusBarStyle;
    }

    在需要判断的地方

            //判断状态栏颜色
            _statusBarStyle = (progress > 0.5) ? UIStatusBarStyleLightContent : UIStatusBarStyleDefault;
            //状态栏颜色记得跟新状态
            [self.navigationController setNeedsStatusBarAppearanceUpdate];

     简单导航栏背景颜色

    @implementation UIViewController (navigatinSetting)
    -(void)setNavigationBarBackGroundColor:(UIColor *)color {
        [[self navigationBarBackGroundView] setBackgroundColor:color];
    }
    
    -(void)setNavigationBarAlpha:(CGFloat)alpha {
        [[self navigationBarBackGroundView] setAlpha:alpha];
    }
    
    -(UIView *)navigationBarBackGroundView {
        for (UIView *subView in self.navigationController.navigationBar.subviews) {
            if ([[subView class] isSubclassOfClass:NSClassFromString(@"_UINavigationBarBackground")]) {
                return subView;
            }
        }
        return nil;
    }
    @end

    使用时:

        //[self setNavigationBarBackGroundColor:[UIColor whiteColor]];
        [self setNavigationBarAlpha:0];

     隐藏导航栏时,手势失效

    1.实现代理:UIGestureRecognizerDelegate

    2.在ViewDidLoad 中添加代码

        // 修复 侧滑失效
        self.navigationController.interactivePopGestureRecognizer.delegate = self;

    UITabelViewCell里的元素背景色点击失效

    UITableView的Cell上添加一个UILabel标签,标签设置了背景色,文字颜色为白色。当我设置了cell点击高亮的时候,就会发现Label的背景色没了。

    需要将 _label.backgroundColor 改成 _label.layer.backgroundColor   。

    或者:

    -(void)setSelected:(BOOL)selected animated:(BOOL)animated
    {
        [super setSelected:selected animated:animated];
        imageViewIcon.backgroundColor = UIColor.redColor()
    }
    -(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
    {
        [super setHighlighted:highlighted animated:animated];
        imageViewIcon.backgroundColor = UIColor.redColor()
    }

    block快捷输出

    打inlineBlock

    请求超时

    有时候,我们在请求网络的时候,会加上“正在加载”中的状态,由于网络超时等原因,请求没有响应回来。可以通过设置超时来处理。通过定时器来实现

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            Loading_Hide(self.viewController.view);
        });

     禁用多个按钮同时点击

    最近测试组的同事,经常提的一个bug就是一个界面上,多个按钮或者可以点击的视图,两个手指同时点下,会出现各种错误异常。好多人的解决方法是,利用一个bool值做判断,这样做太乱了。如果一个界面上的按钮在多个视图中,这种情况下应该怎么做呢。查询可一下文档,苹果给出了解决方法。只需要把那些不能同时点下的按钮或者视图设置一下即可。代码如下:

    方法一. 在AppDelegate中添加 [[UIButton appearance] setExclusiveTouch:YES];

    方法二. button.exclusiveTouch = YES;

    [view setExclusiveTouch:YES];

     调试时重新加载页面

        [self.view removeFromSuperview];
        [[UIApplication sharedApplication].keyWindow addSubview:self.view];

     避免多次请求数据交错

    可以通过把请求参数保存起来,当请求返回数据时,判断是不是当前的请求参数。如NSMutableDictionary *param.

    请求网络,点回退

    当发送网络请求的时,如果这个时候,点击返回到上一个页面,就会导致崩溃。有两种处理方法:

    1、请求网络时,加一个全屏的loading框,不允许用户返回

    2、在当前控制器的dealloc时,取消当前的网络请求。

    - (void)dealloc
    {
         [self.manage.operationQueue cancelAllOperations];  
    }
    

     打开sqlite文件 

    使用火狐浏览器--工具--附加组件--扩展--搜索“SQLite Manage”,重启浏览器就可以打开的SQLite Manager打开.sqlite文件

    2020-07-01 ,发现火狐sqlite manage不好用了,没有可视化,最后找了一个

    https://sqlitebrowser.org/dl/

    iOS调用系统相机将英文改成中文

     在info.plist 中设置 Localization native development region 为china 

    显示成英文:en

  • 相关阅读:
    Ext.Msg.alert要注意的问题
    项目终于到了可以轻松下的时候,^_^
    Ext最佳应用
    Google居然无视中国人民的感情
    google的logo居然还是鲜艳色的!!!(下午已经是黑的了,还是感谢google)
    我们必须支持国产,这是义务
    管理软件更需要Open Social
    设计模式外观模式(Facade)
    设计模式代理模式(Proxy)
    设计模式桥接模式(Bridge)
  • 原文地址:https://www.cnblogs.com/jys509/p/4821508.html
Copyright © 2020-2023  润新知