最近开发中遇到的问题汇总

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

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

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

//创建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]); //异步方式再重新设置Normal状态下button的标题为“Title3”
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[button setTitle:@"Title3" forState:UIControlStateNormal];
NSLog(@"%@", [button titleForState:UIControlStateDisabled]);
}];

这段代码依次按不同的方式把button的Normal状态下的标题设置为Title1Title2Title3。注意一下,设置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)。如下面代码:

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

输出是:

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

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

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

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

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

UIButton在Disabled状态下标题混乱的问题的更多相关文章

  1. UIButton在不同状态下显示不同背景色

    参考自:原文地址(内容与原文并无区别,只是自己以后方便使用整理了一下) 1.UIButton的background是不支持在针对不同的状态显示不同的颜色. 2.UIButton的backgroundI ...

  2. ios UIButton设置高亮状态下的背景色

    一,通过按钮的事件来设置背景色 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 - (void)viewDidLoad {     [ ...

  3. 帝国cms7.0设置标题图片(缺失状态下)

    有时候因为我们没有设置标题图片,程序就会是使用自己的标题图片,这就是问题所在,现在有2个办法解决这个问题, [1]直接替换调程序的标签图片,但是这样的方法虽然简单,但是图片大小固定,要是每个模版的图片 ...

  4. iOS开发UI篇-tableView在编辑状态下的批量操作(多选)

    先看下效果图 直接上代码 #import "MyController.h" @interface MyController () { UIButton *button; } @pr ...

  5. iOS小技巧 - 为按钮设置不同状态下的背景色

    我们知道直接在Storyboard中设置按钮的背景色是不能根据不同状态来更改的,那问题来了,如果我们需要在不同的状态下(比如按钮没有被按下或者被按下),使得按钮呈现不同的背景色怎么办? 比如上图左边是 ...

  6. 关于老Windows平板电脑睡眠状态下无法开机(睡死)的问题及解决方案

    1.简述 前几天我从闲鱼上淘了一个二手Windows平板, 拿来上课记笔记用. 型号是联想的Thinkpad Helix 2nd, 2015年出产. cpu是酷睿m-5y71超低功耗处理器, TDP只 ...

  7. android 控件在不同状态下的内容样式与背景样式

    1 控件内容(如字体颜色)在不同状态下有不同的表现色ref:http://developer.android.com/guide/topics/resources/color-list-resourc ...

  8. wpf,离线状态下部分功能不可用。

    离线状态下,设置按钮的不可用.通过改变资源字典的值. App.xaml 文件下添加如下 xmlns:sys="clr-namespace:System;assembly=mscorlib&q ...

  9. 利用selector设置ImageButton不同状态下的背景图片

    1.自定义MyButton类 public class MyButton extends Button { //This constructormust be public MyButton(Cont ...

随机推荐

  1. SSH入门简单搭建例子

    因为公司涉及项目使用SSH,为了解SSH搭建方式和运作原理,就自己搭建了一个. 采用尽量以最少的JAR包,搭建一个简单的struts2+spring+hibernate环境,希望像我这样的入门者都能理 ...

  2. DB2 日期相减

    简单方法: 使用 days 字符型的日期:2012-01-01,2012-01-11 values  days(date('2012-01-11')) - days(date('2012-01-01' ...

  3. 实现一种快速查找Richedit中可见区域内OLE对象的方法

    Richedit是一个OLE容器,使用Richedit来显示IM聊天内容时,通常使用OLE对象来实现在Richedit中播放表情动画. 触发表情的绘制有两种途径: 1.来自Richedit的刷新消息. ...

  4. css把超出的部分显示为省略号的方法兼容火狐

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  5. Linux学习笔记(5)Linux常用命令之文件搜索命令

    (1)find find命令用于文件搜索,所在路径/bin/find,其语法格式为: find [搜索范围] [匹配条件] 1)-name:根据文件名搜索,如搜索/etc下的init文件 [root@ ...

  6. poj3107 求树的重心(&& poj1655 同样求树的重心)

    题目链接:http://poj.org/problem?id=3107 求树的重心,所谓树的重心就是:在无根树转换为有根树的过程中,去掉根节点之后,剩下的树的最大结点最小,该点即为重心. 剩下的数的 ...

  7. 2016.8.16 JQuery学习记录

    1.$(document).ready(function(){}); 这个函数会在浏览器加载完页面之后,尽快执行: 2.所有的JQuery函数用有个$开始表示,All jQuery functions ...

  8. node.js整理 05进程管理

    简介 NodeJS可以感知和控制自身进程的运行环境和状态,也可以创建子进程并与其协同工作,这使得NodeJS可以把多个程序组合在一起共同完成某项工作,并在其中充当胶水和调度器的作用 常用API Pro ...

  9. [工作中的设计模式]策略模式stategy

    一.模式解析 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式的关键点为: 1.多种算法存在 2.算法继承同样的接口 ...

  10. css3 -- 渐变

    1.Firefox中的线性渐变 E{ background-image:-moz-linear-gradient(point or angle , form-stop, color-stop, to- ...