代码改变世界

iOS 开发技巧总结

2015-09-19 15:00  jiangys  阅读(444)  评论(0编辑  收藏  举报

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

日期格式转换

    // 设置数据模型的时间
    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 : 非对象类型(基本数据类型int\float\BOOL\枚举\结构体)

图片开启交互

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