layoutSubviews() {
    const {
      frame,
      _layouter,
      subviews,
      visibleArea
    } = this;
    const existingLayout = viewsToLayout(subviews);

    const newLayout = _layouter(existingLayout, frame);

    collapseLayoutIntoViews(newLayout);
    subviews.forEach((subview, subviewIndex) => {
      if (rectIntersectsRect(visibleArea, subview.frame)) {
        subview.setVisibleArea(intersectionOfRects(visibleArea, subview.frame));
      } else {
        subview.setVisibleArea(zeroRect);
      }
    });
  }
Layout self and subviews.

Implementations should call `setNeedsDisplay` if a draw is required.

The default implementation uses `this.layouter` to lay out subviews.

Can be overwritten by subclasses that wish to manually manage their
subviews' layout.

NOTE: Do not call directly! Use `displayIfNeeded`.

@see displayIfNeeded