IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    最近开发中遇到的问题汇总(2014年4月2日)

    Xcodev发表于 2016-03-11 02:33:57
    love 0

    有段时间没有归纳开发中遇到的一些问题了,今天就写一下之前开发中遇到的几个问题。希望这篇文章能让读者在以后的开发中少走弯路。本文将依次介绍《UIButton在Disabled状态下标题混乱的问题》、《含软连字符的字符串计算显示长度的问题》和《UINavigationBar左右两边按钮可同时点击的问题》。

    UIButton在Disabled状态下标题混乱的问题

    你应该知道,UIButton的Disabled状态下标题在没有设定的时候,取Normal状态下的标题。这是对的,但这也许并不是你想象的那样。比如这段代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //创建Button并显示
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    button.frame = CGRectMake(100, 100, 100, 30);
    [self.window addSubview:button];
    //设置Normal状态下button的标题为“Title1”
    [button setTitle:@"Title1" forState:UIControlStateNormal];
    button.enabled = NO;
    NSLog(@"%@", [button titleForState:UIControlStateDisabled]);
    //重新设置Normal状态下button的标题为“Title2”
    [button setTitle:@"Title2" forState:UIControlStateNormal];
    NSLog(@"%@", [button titleForState:UIControlStateDisabled]);
    1
    2
    3
    4
    5
    //异步方式再重新设置Normal状态下button的标题为“Title3”
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [button setTitle:@"Title3" forState:UIControlStateNormal];
    NSLog(@"%@", [button titleForState:UIControlStateDisabled]);
    }];

    这段代码依次按不同的方式把button的Normal状态下的标题设置为Title1、Title2和Title3。注意一下,设置Title3时我用了异步方式,也就是说调用界面需要更新后才会设置Title3。

    但最终button显示的标题是Title3吗?答案是:不一定。你可以在iOS6下和iOS7下分别运行试试。通过titleForState取出的Disabled状态下的标题确实是对的,在iOS6下显示和预期一样是Title3,但iOS7下却显示是Title2。个人推断iOS7应该重构了之前UIButton的代码。

    • UIButton在显示时才会取标题来显示,如果Disabled状态下标题如果在没有设定的时候,取Normal状态下的标题。
    • 设置UIButton的Normal状态下的标题,如果按钮的状态是Disabled,不会刷新目前显示的标题。

    第二点看起来像是一个bug,目前我在最新的iOS7.1的设备上出现了这个问题。不保证以后的版本是否会把这个当成一个bug修复掉。

    为了解决这个问题,我们在设置按钮多状态下的标题时,建议还是多写几行代码去设置Disabled状态下的标题,而不是让它自动去取Normal状态下的标题。

    含软连字符的字符串计算显示长度的问题

    另一个问题是群里碰到的一个问题。当字符串为软连字符和划线字符开头一些组合时,计算长度时会出现负无穷大(-inf)。如下面代码:

    1
    2
    3
    NSString *string = @"\u00AD\u0336\u00AD\u0336测试";
    CGSize size = [string sizeWithFont:[UIFont systemFontOfSize:14]];
    NSLog(@"%@",NSStringFromCGSize(size));

    输出是:

    1
    2014-04-02 11:52:46.290 Test[3499:907] {-inf, 18}

    而我们经常会根据计算出的文字大小来布局视图,如果你遇到这些字符串,而且没有对-inf进行特殊处理的话,很有可能App就运行异常了。现在App有很多用户自行输入内容,如评论,信息等,这些很容易让一些恶意用户输入并上传这些bug文本,那么你的App就很容易异常了,所以还是有必要进行一些特殊处理的。这些特殊的字符串一般不会由本地App产生,而是用户产生,建议在服务器端处理。本地简单的处理方法就是Trim一下:

    1
    string = [string stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithRange:NSMakeRange(0xAD, 1)]];

    UINavigationBar左右两边按钮可同时点击的问题

    这个问题是我们这边测试发现的。UINavigationBar左右两边的按钮竟然可以同时点击,他们可以连续响应。如果它们的操作是互斥的,如“发送”和“取消”,很可能因为没有做同时操作的处理,引起App异常。一个比较方便的解决办法就是设置button的exclusiveTouch属性设置为YES,这样只要此按钮排他性地接受的Touch事件。如果你的左右两边不是按钮,而是UIBarButtonItem,只能在代码逻辑上做一些容错处理了。



沪ICP备19023445号-2号
友情链接