I'm displaying opaque PNGs with UIImageView
s inside of a superview with a white background color. What's best for performance?
UIImageView
Defaults
opaque = NO
, backgroundColor = nil
, clearsContextBeforeDrawing = YES
.
iOS Developer Library: UIView
Class Reference
UIView Class Reference: backgroundColor says, "[
nil
] results in a transparent background color." If I set aUIView
sopaque
property toYES
, must I also set itsbackgroundColor
to[UIColor clearColor]
, or is that extra line of code & processing unnecessary? I.e., is[UIColor clearColor]
considered opaque (not transparent)?Does the value of
clearsContextBeforeDrawing
matter for opaque views?The comments for
clearsContextBeforeDrawing
inUIView.h
say it's ignored for opaque views.But, UIView Class Reference: clearsContextBeforeDrawing says:
If the view’s
opaque
property is also set toYES
, thebackgroundColor
property of the view must not benil
or drawing errors may occur.Which is it?
If you set UIView's opaque property to YES, you must ensure your drawing completely fills the view with no transparency. So, you need to set a white background colour (a clear one won't work, because that's not opaque).
I don't think you want to change the defaults for your image view, but you should ensure that your PNGs do not have any transparency (that is, have no alpha channel; you can check this in Preview's image inspector; ensure it doesn't say 'Has Alpha'.). I believe UIImageView will do the right thing if you give it an opaque image.
Depending on what's in the background, you might get better performance with opaque = YES and a white background for your image views, (to prevent redrawing parts of the parent view) but I wouldn't start that way.
Assuming that your PNGs always fills the entire
UIImageView
, you should get the best performance using:opaque = YES
,clearsContextBeforeDrawing = NO
. In this modebackgroundColor
is irrelevant. The pixels are simply replaced with the new image data.For transparent PNGs on a single-color background, the fastest will be:
opaque = YES
,clearsContextBeforeDrawing = YES
, andbackgroundColor
matching whatever you need. In this case[UIColor whiteColor]
.