作者leondemon (狗狗)
看板MacDev
标题[问题] 关於UIView的setNeedsDisplay
时间Sat Oct 30 19:57:35 2010
我使用了Cooca的observer pattern让UIView观察自己的properties
当被观察的properties改变时,便会要重新计算该UIView的frame/bounds
由於一个run loop内 可能会同时改变多个被观察的properties
而导致在这个run loop内 需要多次计算新的frame/bounds
我希望能够能够在每个run loop结束前 才去判断是否重新计算新的frame/bounds
於是我就是在UIView发现到properties被改变时 送了[self setNeedsDisplay]的讯息
可是这结果却导致drawRect:的方法并没有被呼叫
code大致如下:
*在initWithFrame:内 加入下面这行 以注册观察自己的property(font)
[self addObserver:self
forKeyPath:@"font"
options:NSKeyValueObservingOptionNew
context:NULL];
*在观察到改变时
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context{
if ([keyPath isEqual:@"font"]) {
[self setNeedsDisplay];
}
}
这样的方式 在我改变该UIView的font时 并没有呼叫到drawRect:的方法
(注:该UIView一开始是使用CGRectZero当frame大小 然後改变ivar来决定最後的frame)
想请问一下是否我有哪边搞错了呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.83.65.55
1F:→ zonble:你先把 isEqual: 改成 isEqualToString 看看 10/31 00:26
2F:→ zonble:isEqual 是比对指标,不是比对字串内容 10/31 00:27
3F:→ uranusjr:我记得 isEqual 会比对物件内容耶, 是要 = 才是比指标 10/31 00:51
4F:→ leondemon:我有用NSLog在setNeedsDisplay下行 确实有进入 10/31 01:10
5F:→ leondemon:而且我是抄Apple的 应该不会有错 @~@ 10/31 01:11
6F:→ leondemon:我是想要实作lazy loading的概念 可是作不出来 :( 10/31 01:13
7F:→ zonble:isEqual 很难说,因为 subclass 可以 override 10/31 01:14
8F:→ zonble:但是 NSObject 的实作是比对指标 10/31 01:14
9F:→ leondemon:嗯 我有测试过了isEqual和isEqualToString都可以pass 10/31 01:17
10F:→ leondemon:不过谢谢Zonble大给的概念 以後都用isEqualToString 10/31 01:18
11F:→ leondemon:不过我记得code里面@"string"的物件都会是相同的指标.. 10/31 01:19
12F:→ leondemon:用isEqual或许比较不吃资源... :) 10/31 01:19
13F:→ leondemon:好像是这些字串是static object, retain count为极大值 10/31 01:23
14F:→ leondemon:若用词或叙述有误,请帮忙指正 Tks 10/31 01:23
15F:→ zonble:用 @"" 会是 static 的物件,但是很难说传进来的会不会 10/31 01:27
16F:→ zonble:是另外用 mutable string 改过的东西 10/31 01:27
17F:→ leondemon:嗯~ 不过我目前遇到的问题不是这个 XDDD 10/31 01:33
我目前只有查到如果UIView本身如果不是visible的话
就算送出了setNeedsDisplay 最後也不会呼叫drawRect:
但是我怎麽实作都不会呼叫 =.=
※ 编辑: leondemon 来自: 114.136.206.195 (10/31 01:35)
18F:→ leondemon:如果有其他可以实作的方法 也可以让我参考一下 :) tks 10/31 01:37
谢谢zonble大
我在TestView的- (void)_init内加入
self.backgroundColor = [UIColor redColor];
然後在TestView的- (void)drawRect:(CGRect)rect 内加入
CGSize newFrameSize = [@"Test" sizeWithFont:self.font];
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y,
newFrameSize.width, newFrameSize.height);
就会变成我要的
不过我的code就是没办法成功,我在研究看看罗...
※ 编辑: leondemon 来自: 111.83.137.34 (10/31 12:20)
20F:→ leondemon:不过程式刚开始时Test字串无法显示 直到slider改变值 10/31 12:21