在创建iOS应用程序时,我很困惑何时需要调用setNeedsDisplay?我知道它与更新/重绘UI有关; 但是,每当我改变任何观点时,是否需要调用它?
例如,我是否需要调用它:
有人可以给我一些关于何时使用这种方法的一般指导原则吗?
UIView方法setNeedsLayout和真正的区别是什么setNeedsDisplay?
像往常一样,文档对此很有雾.
我看到很多线程与这个问题有关,但没有一个解决我的问题(我认为).
我的情况应该很简单,UIView我的控制器中有一个Custom ,从我的控制器,我使用[ self.myView setNeedsDisplay],它完美地工作.
当我试图从内部调用它时,我遇到了问题UIView...我从另一个类发送了一个通知,我的View(这个工作)收到了它传递的信息,我更新内部这个视图的属性,而不是我所谓的[自我setNeedsDisplay]希望我的屏幕更新与新状态,但没有发生任何事情,我NSLOG在我的drawRec方法中使用了一个内部,并且它此时没有被调用,它只是当我的控制器类调用时调用setNeedsDisplay,当发生这种情况时,之前应该发生的更新显示在屏幕上...我不知道为什么它之前没有更新...
这是一些代码:
我的控制器要求更新:(工作正常!)
- (void)addNodeToNetwork:(DTINode *)node
{
[self.myNetwork addNodeInTheNetwork:node];
self.gridView.nodesToDraw = [self.myNetwork.nodesInNetwork copy];
CGRect tempRec = CGRectMake(node.nodePosition.x, node.nodePosition.y node.nodePosition.x, node.nodePosition.y);
NSValue *rectObj = [NSValue valueWithCGRect:tempRec]; //transforma o cgrect num objeto
[self.gridView.fatherNodes setValue:rectObj forKey:node.nodeName];
[self.gridView setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud)
我的通知方法试图更新我的绘图:(不工作!)
- (void) receiveTestNotification:(NSNotification *) notification
{
NSDictionary *userInfo = notification.userInfo;
DTINode *notificationNode = [userInfo objectForKey:@"myNode"];
NSLog(@"Im Here!");
for (DTINode *node in self.nodesToDraw)
{
NSLog(@"Here too"); …Run Code Online (Sandbox Code Playgroud) 我正在CMMotionManager用于检索加速度计数据.问题是加速度计数据会定期打印,实例变量会在视图中更改,但视图不会重新绘制.我已经检查过这hv不是零,而且一切都被吸引住了.在块中调用setNeedsDisplay是否有问题?
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[motionManager startAccelerometerUpdatesToQueue:motionQueue withHandler:
^(CMAccelerometerData *accelerometerData, NSError *error)
{
NSLog(@"%@",accelerometerData);
HypnosisView *hv = (HypnosisView *) [self view];
hv.xShift = 10.0 * accelerometerData.acceleration.x;
hv.yShift = -10.0 * accelerometerData.acceleration.y;
[hv setNeedsDisplay];
}];
}
Run Code Online (Sandbox Code Playgroud) 我正在努力setNeedsDisplay.我认为它应该触发调用drawRect:它的视图的调用和下面的层次结构,如果它在视图的范围内,但我不会发现它是这种情况.这是我的设置:
从应用程序委托中,我创建了一个视图,其大小是一个正方形,基本上覆盖整个屏幕的空间.这个观点叫做TrollCalendarView.TrollCalendarView除了由指南针触发的旋转之外,没有太多事情发生.
有7个TrollCalendarView被调用的子视图PlatformView旨在包含TrollCalendarView以7边排列围绕中心排列的2D绘图对象.因此,当iPad旋转时,这7个视图旋转,使得它们始终以基本方向定向.
每个PlatformView子视图都包含3个子视图Tower.每个塔包含实现的2D绘图对象drawRect:.
所以,总而言之,我TrollCalendarView有空的drawRect:,子视图PlatformView和Platformview- >塔,每个都有drawRect实现.此外,Tower位于Platform的范围内,而Platform位于TrollCalendarView的范围内.
在TrollCalendarView我添加了一个滑动识别器.当我滑动发生时,属性被更新,我打电话[self setNeedsDisplay]但似乎没有任何事情发生.我drawRect:在每个视图中添加了NSLog条目到方法,并且只TrollCalendarView drawRect:调用了该方法.具有讽刺意味的是,这是一个视图,其drawRect方法将为空.
没有xib文件.
我需要做些什么来确保drawRect调用其他子视图中的方法?是否有某些文档描述了可能影响这一点的所有细微差别?
我有一个UIView从缓冲区获取数据(即更改)并绘制它.我希望屏幕以10Hz的频率运行.UIView被称为窗格,这就是我在ViewController中调用它的方式:
//create graphics to display data
GraphPane pane = new GraphPane ();
pane.Frame = UIScreen.MainScreen.Bounds;
Add (pane);
//setup timer to update pane
NSTimer timer = NSTimer.CreateRepeatingTimer (0.1, delegate {pane.SetNeedsDisplay ();});
Run Code Online (Sandbox Code Playgroud)
这不起作用(从不调用Pane.Draw),我没有找到一个如何做到这一点的好例子.任何建议表示赞赏.
我希望有一个UIView实现类似方法的子类setNeedsDisplay,除了重绘(即通常会被调用通过drawRect:)将在后台线程中很快发生,而不是在当前更新周期结束时.
它可能被称为setNeedsAsynchronousDisplay.或者现有的setNeedsDisplay可能被劫持并且不会在循环结束时或者其他任何情况下重绘,只要它允许重绘不会发生在主线程阻塞屏幕上更新交互直到完成.
在重绘之前,视图可以继续使用其当前绘制的表示.
沿着这些方向的事情是否合理可行?
谢谢!
在Cocoa中,当我们想要重绘视图时,我们会向视图发送一条setNeedsDisplay:消息,告诉视图使用参数YES重绘自身.我想知道是否有任何情况你想发送一个视图setNeedsDisplay:NO,比如多线程环境,如果发送一个视图a setNeedsDisplay:YES,然后立即再次设置它setNeedsDisplay:NO会使视图重绘自己.如果没有理由打电话setNeedsDisplay:NO,那么为什么要创建这样一个乏味的方法,他们可以在那里实现类似的东西[view redrawView]
我有一个UIViewController在willRotateToInterfaceOrientation,我打电话[self view] setNeedsLayout];
这个视图调用它是子视图的(a UIScrollView)layoutSubviews方法,但UIScrollView不会调用layoutSubviews它的子视图.这是它的假设吗?我想如果你打电话setNeedsLayout给一个视图,它会调用layoutSubviews每个子视图和他们的子视图,然后...
我一定要手动,覆盖layoutsubview在UIScrollView并调用setNeedsDisplay每个子视图?
谢谢.
我遇到setNeedsDisplay的问题.我有一个带有很多子UIViews的UIView,在Inteface Builder中创建.我还有一个带有IBAction的按钮.在这个IBAction中我想重绘/重新加载所有UIViews(或所有UIElements,如UILabel,UIWebView等等)
我这样做,这对我不起作用,不知道为什么..:
//redraw the UIViews
[self.view_card_0 setNeedsDisplay];
[self.view_card_1 setNeedsDisplay];
[self.view_card_stapel setNeedsDisplay];
//other UI Elements
[self.webView_0 setNeedsDisplay];
[self.webView_1 setNeedsDisplay];
[self.webView_stapel setNeedsDisplay];
[self.lblCardTitle_0 setNeedsDisplay];
[self.lblCardTitle_1 setNeedsDisplay];
[self.lblCardTitle_stapel setNeedsDisplay];
[self.img_card_0 setNeedsDisplay];
[self.img_card_1 setNeedsDisplay];
[self.img_card_stapel setNeedsDisplay];
Run Code Online (Sandbox Code Playgroud)
如何重绘/重新加载/刷新所有UIElements/UIViews和Subviews?
编辑1:
我如何加载视图:
detailViewController = [[DetailViewController alloc]
initWithNibName:@"DetailViewController_iPad" bundle:[NSBundle mainBundle]];
Run Code Online (Sandbox Code Playgroud)
detailviewcontroller没有viewcontroller,只是uiviews,这里是hierarchie:
我期望做什么:
*我不想重置UIView,我想改变它们的背景和内容.*
我在我的detailview中有很多子视图(uiviews),见上面的hierarchie.我在UIViews中显示内容,内容来自coreData.
view1包含coreData的当前行.
view0包含coreData的前一行.
viewStapel包含coreData的下一行.
使用IBAction我想迭代coreData行,如果调用了动作,则显示当前的下一行......依此类推.
在Log中,数据已更改,但未在UIViews中显示.因此我需要重绘或重新加载或类似的东西,以显示当前数据.
编辑2:已解决
我已将代码放入一个新方法,并调用此方法已解决了我的问题.
setneedsdisplay ×10
ios ×7
objective-c ×5
uiview ×4
cocoa-touch ×2
drawrect ×2
subview ×2
autolayout ×1
c# ×1
cocoa ×1
nstimer ×1
nsview ×1
redraw ×1
swift ×1
xamarin ×1