Don't call layoutSubviews directly; always use setNeedsLayout instead.