Ios UIView setNeedsDisplay是否无效?
我有一个UIView派生视图,它只绘制一次,从未更新 调用Ios UIView setNeedsDisplay是否无效?,ios,uiview,drawing,Ios,Uiview,Drawing,我有一个UIView派生视图,它只绘制一次,从未更新 调用[self-setNeedsDisplay]无效。这是什么原因造成的 图形代码是否在中并不重要 drawRect:,或 drawLayer:inContext:(定义了一个空的drawRect()) 如果未定义drawLayer:inContext,则调用drawRect。但只有一次(在布局期间) 我尝试过的内容的小列表: [自我设置需要显示] [self.layer setNeedsDisplay] [self.mySubLaye
[self-setNeedsDisplay]
无效。这是什么原因造成的
图形代码是否在中并不重要
,或drawRect:
(定义了一个空的drawRect())drawLayer:inContext:
- [自我设置需要显示]
- [self.layer setNeedsDisplay]
- [self.mySubLayer setNeedsDisplay]
- self.contentMode=UIViewContentModeRedraw李>
- 手动创建视图,而不是从.nib加载视图(无效)
- 删除层(和子层)的使用,仅使用drawRect(无效果)
- 因此可以将其标记为已应答:确保在主线程上调用UIKit方法 因此可以将其标记为已应答:确保在主线程上调用UIKit方法 您确定调用了setNeedsDisplay吗?显示代码,在预期发生的位置设置断点,然后报告…为了跟踪Cubs的评论,您确定要在主线程上调用UIKit方法吗?这可能会产生一些奇怪的后果,比如如果不这样做,什么也不会发生。是的,我已经设置了断点。说得好。绝对肯定。我花了几个小时在这上面,阅读了我能找到的所有帖子,并仔细检查了所有内容。即使是实例也与由nib初始化并推入IBOutput的实例相同(地址不变)。有很多变量,所以我把所有的东西都转换成不使用CALayer,但这没有什么区别,所以我把它放回去。iOS框架有些奇怪…@darren:就是这样!我从非UI线程的回调调用setNeedsDisplay。如果你加上这个作为答案,我会把它标记为答案。多么奇怪的要求啊!大多数UI框架不允许从非UI线程绘制,但您至少可以通知它们应该绘制。相反,框架只是决定忽略这个请求?很酷,很高兴它成功了。当我粗心的时候,同样的问题已经困扰了我好几次。老实说,我宁愿程序崩溃也不愿什么都不做。你确定会调用setNeedsDisplay吗?显示代码,在预期发生的位置设置断点,然后报告…为了跟踪Cubs的评论,您确定要在主线程上调用UIKit方法吗?这可能会产生一些奇怪的后果,比如如果不这样做,什么也不会发生。是的,我已经设置了断点。说得好。绝对肯定。我花了几个小时在这上面,阅读了我能找到的所有帖子,并仔细检查了所有内容。即使是实例也与由nib初始化并推入IBOutput的实例相同(地址不变)。有很多变量,所以我把所有的东西都转换成不使用CALayer,但这没有什么区别,所以我把它放回去。iOS框架有些奇怪…@darren:就是这样!我从非UI线程的回调调用setNeedsDisplay。如果你加上这个作为答案,我会把它标记为答案。多么奇怪的要求啊!大多数UI框架不允许从非UI线程绘制,但您至少可以通知它们应该绘制。相反,框架只是决定忽略这个请求?很酷,很高兴它成功了。当我粗心的时候,同样的问题已经困扰了我好几次。老实说,我更喜欢程序崩溃,而不是什么都不做。具体来说,使用以下命令:
[self-performselectornmainthread:@selector(setNeedsDisplay)with-object:self-waitUntilDone:TRUE]代码>具体地说,使用以下命令:[self-performSelectorOnMainThread:@selector(setNeedsDisplay)with-Object:self-waitUntilDone:TRUE]代码>
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx {
// drawing occurs, but just once (during view layout)
}
`- (void)drawRect:(CGRect) rect {
// empty -- never called
}