Gagan Singh
Gagan Singh

Reputation: 986

How do I “redraw layers” in Core Graphics?

I remember that when I was reading the Apple documentation, it would mention that when you call a function such as addSubview, you are adding a “layer of paint,” so to speak, and every time it is called, another layer is overlaid.

This should be an easy question to answer, but I had a hard time thinking of keywords to google for, so please excuse the asking of such a simple question.

How do I clear the “layers” of a custom UIView?

My situation, as it may be relevant: I have these “user cards” that are displayed on the screen. They are initialized with some user images. The cards stay the same, but I call a method in my custom UIView (the card UIView) to redraw the images when I want to display a different user. The problem is that some elements of this custom UIView are transparent, and redrawing these images each time builds on that transparency (an obvious problem).

Upvotes: 1

Views: 474

Answers (2)

Tim B.
Tim B.

Reputation: 467

Ryan's code for clearing UIViews is more or less correct, but if you came here from Google looking for how to clear CLLayers from a view, I was getting a crash when I attempted to fast enumerate customView.layer like Ryan has in his example.

When I switched it to regular enumeration, it worked for me. Here's a code snippet:

for (int i = 0; i > yourView.layer.sublayers.count; i++) {
    CALayer *layer = [self.yourView.layer.sublayers objectAtIndex:i];
    [layer removeFromSuperlayer];
}

Upvotes: 0

Ryan Poolos
Ryan Poolos

Reputation: 18551

In Core Graphics, what you draw is what gets shown. The painter’s analogy only refers to a single frame. So if you’re using drawRect, you just don’t cache the previous drawing.

But I suspect you’re talking about some UIKit stuff where you’ve added subviews or sublayers. This will remove those leftover views if you just want to clear everything:

for (UIView *view in customView) {
    [view removeFromSuperview];
}

for (CALayer *layer in customView.layer) {
    [layer removeFromSuperlayer];
}

Upvotes: 2

Related Questions