月度归档:2016年06月

iOS UILabel显示了重叠文字(gets combined, superimposed, overlapped)

Screen Shot 2016-06-30 at 12.07.11 AM

今天调试遇到了一个问题,上图是一个UILabel的截图,该UILabel的text属性实际上是“21张”,然而,如果你仔细看这张截图的话,似乎可以看出,大约是一个“21张”文字的渲染结果叠加了一个“10张”文字的渲染效果。通常,出现这种情况,我的第一反应是我是不是重复的addSubView了,导致多个UILabel相重叠了。

然而,仔细检查了代码,并且用Reveal查看了View层次结构后,我确认了一点,没有多个UILabel重叠,确实只有那一个UILabel并且就是该UILabel把“21张”渲染成了上图的模样。

最后发现,问题在于UILabel的backgroundColor不能设置为nil,也不能设置为透明色。只要给UILabel设置了背景色,这个问题就解决了。

而且,我发现这不是个例,早在2012年,2013年就已经有人遇到这个问题,而且,根据Stackoverflow.com提供的线索,这似乎是iOS 5开始才有的问题(看后面的If I try it on an iPhone 4, the previous text of the label doesn’t disappear)。如今,iOS 10都快要正式版了,没想到这个问题还在。

最后,给大家忠告,一定要仔细检查UILabel的背景,千万不要把backgroundColor设置成透明色或者nil。

参考资料如下

http://www.cocoachina.com/bbs/read.php?tid=257298
主题 : UILabel背景为透明时,刷新文字会和旧文字重叠
楼主 :
发表于: 2013-03-06 17:04

把label的背景色从默认(也就是clear color)设成其他颜色,问题就解决了。

如果有时候需要label背景透明,那又该怎么办呢?

http://stackoverflow.com/questions/2271144/setting-transparent-background-for-uilabel-for-iphone-application

Nullifying the backgroundColor works fine at first, but if you subsequently change the label’s text, the new text will be superimposed on the old. Very weird. – Wienke Sep 27 ’12 at 19:50 (编者注:这是2012年9月27日的评论,原问题发表于2010年4月29日。将backgroundColor属性设置为nil,最开始你会发现能如你所愿,然后,随后你就会发现,如果你更改了label的text属性,新的文本会重叠在旧的文本之上。非常奇怪。)

http://stackoverflow.com/questions/10373119/uilabels-new-text-gets-combined-with-previous-text-when-testing-on-real-iphone#

I have some UILabel objects in my app, and I change their value when a button is pressed. It works fine in the simulator and on old iPhones, but If I try it on an iPhone 4, the previous text of the label doesn’t disappear, it shows behind the the new text (well, sometimes it disappears and only the correct text appears, but most of the times it doesn’t work right). (编者注:提问者说道,在模拟器和比iPhone 4老的iPhone上,一切正常,可是,如果是iPhone 4,UILabel设置了新的文本的话,旧的文本仍然显示在新的文本的后面,这正如本文最开始的截图所显示的那样。)
asked Apr 29 ’12 at 14:53

I can tell you it’s not a bug, and not common. I’m guessing that you have a transparent background behind UILabel? And redraw might not be correctly handled in the background view. You might want to post more about your view hierarchy. – He Shiming Apr 29 ’12 at 17:08 (编者注:后面有人评论,我可以告诉你,这不是bug,也不常见。 我猜测你的UILabel一定有一个透明的背景,而redraw操作或许不能正确处理透明背景的情况。你或许应该告诉大家你的视图层次结构的详细信息。)

cellForRowAtIndexPath: not called,cellForRowAtIndexPath不被调用

今天遇到了一个神奇的事情
tableView:cellForRowAtIndexPath:这个方法,我的TableViewDataSource里已经实现了,可是,无论如何,都不会被调用。
我在numberOfRowsInSection和numberOfSectionsInTableView和cellForRowAtIndexPath三处都设置了断点,然而,前两个方法都得到了调用,唯独最后一个cellForRowAtIndexPath,无论如何都不会被调用。

我可以确定numberOfRowsInSection和numberOfSectionsInTableView都返回了非0的值。

最后我发现,我的DataSource还实现了
sectionIndexTitlesForTableView

titleForHeaderInSection
两个方法,只不过我都在这两个方法中返回了nil。

最后我删除了这两个方法的代码,结果,cellForRowAtIndexPath被系统调用了,我的TableView的内容也可以正常显示了!!!

目前我也不知道怎么回事,因为,sectionIndexTitlesForTableView和titleForHeaderInSection的返回值的声明是nullable的,而且之前这两个方法也是这么实现了,并且上个月,同样的情况,cellForRowAtIndexPath就被系统调用了。

这个事情实在让我百思不得其解,所以写一篇blog记录下来。

在OSX 10.11 El Captain上安装pybonjour时遇到dlopen(libSystem.B.dylib, 6): image not found错误

上一篇讲到,我需要安装PonyDebugger,而安装PonyDebugger需要安装pybonjour,然而,安装pybonjour时,又遇到了错误,错误信息如下,
Traceback (most recent call last):
File “setup.py”, line 32, in
import pybonjour
File “/Users/huangshaojun/Downloads/Eichhoernchen-pybonjour-c63b48c/pybonjour.py”, line 109, in
_libdnssd = ctypes.cdll.LoadLibrary(_libdnssd)
File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py”, line 443, in LoadLibrary
return self._dlltype(name)
File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py”, line 365, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen(libSystem.B.dylib, 6): image not found

我到github上也找到了对应的Issue 192 https://github.com/square/PonyDebugger/issues/192
Issue提到的解决方法是

well, okay i had to do a brew install python

即,不要用OSX内置的python,而用brew新安装一个python。

我并不想再新安装一个新的python,我还是希望用OSX内置的python,为此,我根据
http://stackoverflow.com/questions/32905322/oserror-dlopenlibsystem-dylib-6-image-not-found
的提示,修改了pybonjour.py

if sys.platform == 'darwin':
        _libdnssd = 'libSystem.B.dylib'
    else:

改为

if sys.platform == 'darwin':
        _libdnssd = '/usr/lib/libSystem.B.dylib'
    else:

这样用OSX内置的python就可以正确安装pybonjour了。

PonyDebugger安装错误:Could not find a version that satisfies the requirement pybonjour==1.1.1

之前一直用Reveal,不过Reveal只能查看View Hierarchy,而我听说PonyDebugger不仅仅可以查看View Hierarchy,还能debug network traffic和view core data,所以决定也集成PonyDebugger。

到PonyDebugger的主页(https://github.com/square/PonyDebugger)一看,发现README中有一个Quick Start,这个Quick Start提到首先要运行如下代码安装ponyd

curl -s https://cloud.github.com/downloads/square/PonyDebugger/bootstrap-ponyd.py | \
  python - --ponyd-symlink=/usr/local/bin/ponyd ~/Library/PonyDebugger

我运行了以后,遇到如下错误

Collecting pybonjour==1.1.1 (from ponyd)
  Could not find a version that satisfies the requirement pybonjour==1.1.1 (from ponyd) (from versions: )
No matching distribution found for pybonjour==1.1.1 (from ponyd)
Traceback (most recent call last):
  File "", line 2462, in 
  File "", line 946, in main
  File "", line 1794, in after_install
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 540, in check_call
    raise CalledProcessError(retcode, cmd)

随后,我用关键字

Could not find a version that satisfies the requirement pybonjour==1.1.1 

进行搜索,发现了Issue #186 https://github.com/square/PonyDebugger/pull/186,此issue表明pybonjour的问题已经于2016年2月27日解决了。可是,我为什么仍然遇到了这个问题呢。

接下来,Issue 185解决了我的疑惑 https://github.com/square/PonyDebugger/issues/185,其中 justinseanmartin 在3月15日提到

I was able to clone and then install using python setup.py install. It isn't as convenient as the command from the readme, will look into getting the script fixed up as well.

Issue 188 https://github.com/square/PonyDebugger/issues/188 中,justinseanmartin也提到了,

Dupe of #100. You should be unblocked by:

git clone git@github.com:square/PonyDebugger.git
cd PonyDebugger
python setup.py install

Please confirm this works for you. I've logged #189 to track fixing the install script and/or instructions.

这说明,pybonjour问题的解决方案,还没有应用到https://cloud.github.com/downloads/square/PonyDebugger/bootstrap-ponyd.py,所以,用Quick Start的方式安装仍然有问题,我们目前还是需要把PonyDebugger的git库clone到本地,再进行安装。

评高考题目:“老腔”何以令人震撼

2016年北京的高考作文题目为二选一,其中一题就是“‘老腔’何以令人震撼”。作家陈忠实先生在《白鹿原上奏起一曲老腔》中给老腔以“撼人肺腑”和“酣畅淋漓”的高度评价。然而,我个人听了电影《白鹿原》中的老腔后,却感到“憾人肺腑”的难听,一分钟都听不下去了。

老腔之所以能令人震撼,我认为,这是因为“老腔”这种曲艺的形式,让人要么如陈忠实或者濮存昕这样的人感觉到震撼和好听,要么让如我一样的民众感到十分难听,根本不能接受。一种艺术形式,能达到这种程度,说明它必然极度满足了一批人的体验,这就导致了其他人会根本无法接受。