Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIView setNeedsDisplay是否无效?_Ios_Uiview_Drawing - Fatal编程技术网

Ios UIView setNeedsDisplay是否无效?

Ios UIView setNeedsDisplay是否无效?,ios,uiview,drawing,Ios,Uiview,Drawing,我有一个UIView派生视图,它只绘制一次,从未更新 调用[self-setNeedsDisplay]无效。这是什么原因造成的 图形代码是否在中并不重要 drawRect:,或 drawLayer:inContext:(定义了一个空的drawRect()) 如果未定义drawLayer:inContext,则调用drawRect。但只有一次(在布局期间) 我尝试过的内容的小列表: [自我设置需要显示] [self.layer setNeedsDisplay] [self.mySubLaye

我有一个UIView派生视图,它只绘制一次,从未更新

调用
[self-setNeedsDisplay]
无效。这是什么原因造成的

图形代码是否在中并不重要

  • drawRect:
    ,或
  • drawLayer:inContext:
    (定义了一个空的drawRect())
如果未定义drawLayer:inContext,则调用drawRect。但只有一次(在布局期间)

我尝试过的内容的小列表:

  • [自我设置需要显示]
  • [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
      }