Calling setNeedsDisplay:YES on layer-hosting view does not redraw the view
After further research in Apple's sample code of a kiosk-style menu I found out that if you are using a layer-hosting view, you have to take care of the screen updates which are neccessary due to model changes yourself. Calling setNeedsDisplay:YES
on the NSView will not do anything.
So what one has to do if one has to update a view one should write a method like reloadData and in it one should call setNeedsDisplay
on each CALayer that needs a refresh. I am still not sure if a call to this method on the root layer will propagate through all the children layers but I do not think so.
I solved the problem now by calling setNeedsDisplay
on the individual CALayers that needed recaching. It works without problems.
There is also an oft-used practice of having an empty "drawrect", a la -(void) drawRect:(NSRect)dirtyRect {}
to help coerce things into drawing, i believe via good ole view.needsDisplay = YES;
.
and it should be noted.. that what is indeed happening is that - by saying your NSView *view;
is layer.delegate = view;
causes the layer to be drawn when [layer setNeedsDisplay];
is called.... via - (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {...}
..
along the same vein... when saying layer.layoutManager = view
... subsequent demands that [layer setNeedsLayout];
will be fulfilled only when the - (void) layoutSublayersOfLayer:(CALayer *)layer {..}
method is implemented..
These vital concepts are glossed over / strewn about in Apple's docs... and they are really so pivotal to making absolutely anything work at all.