Skip to content

Commit

Permalink
[TextControls] Prepare to expose preferredContainerHeight on text con…
Browse files Browse the repository at this point in the history
…trols

PiperOrigin-RevId: 322856550
  • Loading branch information
andrewoverton authored and material-automation committed Jul 23, 2020
1 parent c5dbf01 commit 49b441e
Show file tree
Hide file tree
Showing 15 changed files with 183 additions and 178 deletions.
3 changes: 2 additions & 1 deletion components/TextControls/src/BaseTextAreas/MDCBaseTextArea.m
Expand Up @@ -243,7 +243,8 @@ - (MDCBaseTextAreaLayout *)calculateLayoutWithSize:(CGSize)size {
self.normalFont.leading)
numberOfTextRows:self.numberOfLinesOfVisibleText
density:0
preferredContainerHeight:self.preferredContainerHeight];
preferredContainerHeight:self.preferredContainerHeight
isMultilineTextControl:YES];
}

- (id<MDCTextControlHorizontalPositioning>)createHorizontalPositioningReference {
Expand Down
Expand Up @@ -258,7 +258,8 @@ - (MDCBaseTextFieldLayout *)calculateLayoutWithTextFieldSize:(CGSize)textFieldSi
textRowHeight:self.normalFont.lineHeight
numberOfTextRows:self.numberOfLinesOfVisibleText
density:0
preferredContainerHeight:self.preferredContainerHeight];
preferredContainerHeight:self.preferredContainerHeight
isMultilineTextControl:NO];
}

- (CGFloat)clampedCustomAssistiveLabelDrawPriority:(CGFloat)customPriority {
Expand Down
Expand Up @@ -43,14 +43,16 @@ - (void)removeStyleFrom:(id<MDCTextControl>)textControl {
textRowHeight:(CGFloat)textRowHeight
numberOfTextRows:(CGFloat)numberOfTextRows
density:(CGFloat)density
preferredContainerHeight:(CGFloat)preferredContainerHeight {
preferredContainerHeight:(CGFloat)preferredContainerHeight
isMultilineTextControl:(BOOL)isMultilineTextControl {
return [[MDCTextControlVerticalPositioningReferenceBase alloc]
initWithFloatingFontLineHeight:floatingLabelHeight
normalFontLineHeight:normalFontLineHeight
textRowHeight:textRowHeight
numberOfTextRows:numberOfTextRows
density:density
preferredContainerHeight:preferredContainerHeight];
preferredContainerHeight:preferredContainerHeight
isMultilineTextControl:isMultilineTextControl];
}

- (MDCTextControlHorizontalPositioningReference *)horizontalPositioningReference {
Expand Down
Expand Up @@ -24,6 +24,7 @@
textRowHeight:(CGFloat)textRowHeight
numberOfTextRows:(CGFloat)numberOfTextRows
density:(CGFloat)density
preferredContainerHeight:(CGFloat)preferredContainerHeight;
preferredContainerHeight:(CGFloat)preferredContainerHeight
isMultilineTextControl:(BOOL)isMultilineTextControl;

@end
Expand Up @@ -16,8 +16,8 @@
#import "MaterialMath.h"
#import "MDCTextControlVerticalPositioningReference.h"

static const CGFloat kMinPaddingAroundTextWhenNoLabel = 6.0f;
static const CGFloat kMaxPaddingAroundTextWhenNoLabel = 10.0f;
static const CGFloat kMinPaddingAroundTextWhenNoFloatingLabel = 6.0f;
static const CGFloat kMaxPaddingAroundTextWhenNoFloatingLabel = 10.0f;
static const CGFloat kMinPaddingBetweenContainerTopAndFloatingLabel = (CGFloat)6.0;
static const CGFloat kMaxPaddingBetweenContainerTopAndFloatingLabel = (CGFloat)10.0;
static const CGFloat kMinPaddingBetweenFloatingLabelAndEditingText = (CGFloat)3.0;
Expand Down Expand Up @@ -51,15 +51,17 @@ - (instancetype)initWithFloatingFontLineHeight:(CGFloat)floatingLabelHeight
textRowHeight:(CGFloat)textRowHeight
numberOfTextRows:(CGFloat)numberOfTextRows
density:(CGFloat)density
preferredContainerHeight:(CGFloat)preferredContainerHeight {
preferredContainerHeight:(CGFloat)preferredContainerHeight
isMultilineTextControl:(BOOL)isMultilineTextControl {
self = [super init];
if (self) {
[self calculatePaddingValuesWithFoatingFontLineHeight:floatingLabelHeight
normalFontLineHeight:normalFontLineHeight
textRowHeight:textRowHeight
numberOfTextRows:numberOfTextRows
density:density
preferredContainerHeight:preferredContainerHeight];
preferredContainerHeight:preferredContainerHeight
isMultilineTextControl:isMultilineTextControl];
}
return self;
}
Expand All @@ -69,13 +71,10 @@ - (void)calculatePaddingValuesWithFoatingFontLineHeight:(CGFloat)floatingLabelHe
textRowHeight:(CGFloat)textRowHeight
numberOfTextRows:(CGFloat)numberOfTextRows
density:(CGFloat)density
preferredContainerHeight:(CGFloat)preferredContainerHeight {
BOOL isMultiline = numberOfTextRows > 1 || numberOfTextRows == 0;
preferredContainerHeight:(CGFloat)preferredContainerHeight
isMultilineTextControl:(CGFloat)isMultilineTextControl {
CGFloat clampedDensity = MDCTextControlClampDensity(density);

_paddingAroundTextWhenNoFloatingLabel = MDCTextControlPaddingValueWithMinimumPadding(
kMinPaddingAroundTextWhenNoLabel, kMaxPaddingAroundTextWhenNoLabel, clampedDensity);

_paddingBetweenContainerTopAndFloatingLabel = MDCTextControlPaddingValueWithMinimumPadding(
kMinPaddingBetweenContainerTopAndFloatingLabel,
kMaxPaddingBetweenContainerTopAndFloatingLabel, clampedDensity);
Expand All @@ -90,78 +89,72 @@ - (void)calculatePaddingValuesWithFoatingFontLineHeight:(CGFloat)floatingLabelHe

_paddingAboveAssistiveLabels = MDCTextControlPaddingValueWithMinimumPadding(
kMinPaddingAboveAssistiveLabels, kMaxPaddingAboveAssistiveLabels, clampedDensity);

_paddingBelowAssistiveLabels = MDCTextControlPaddingValueWithMinimumPadding(
kMinPaddingBelowAssistiveLabels, kMaxPaddingBelowAssistiveLabels, clampedDensity);

// The container height below is the "default" container height, given the density. This height
// will be used if the client has not specified a preferredContainerHeight.
CGFloat containerHeightWithPaddingsDeterminedByDensity =
CGFloat defaultContainerHeightForFloatingLabel =
MDCTextControlCalculateContainerHeightWithFloatingLabelHeight(
floatingLabelHeight, textRowHeight, numberOfTextRows,
_paddingBetweenContainerTopAndFloatingLabel, _paddingBetweenFloatingLabelAndEditingText,
_paddingBetweenEditingTextAndContainerBottom);
BOOL clientHasSpecifiedValidPreferredContainerHeight =
preferredContainerHeight > containerHeightWithPaddingsDeterminedByDensity;
if (clientHasSpecifiedValidPreferredContainerHeight && !isMultiline) {
// modify the previously computed padding values so that they ultimately result in a container
// with the preferred container height.
CGFloat difference = preferredContainerHeight - containerHeightWithPaddingsDeterminedByDensity;
CGFloat sumOfPaddingValues = _paddingBetweenContainerTopAndFloatingLabel +
_paddingBetweenFloatingLabelAndEditingText +
_paddingBetweenEditingTextAndContainerBottom;
_paddingBetweenContainerTopAndFloatingLabel =
_paddingBetweenContainerTopAndFloatingLabel +
((_paddingBetweenContainerTopAndFloatingLabel / sumOfPaddingValues) * difference);
_paddingBetweenFloatingLabelAndEditingText =
_paddingBetweenFloatingLabelAndEditingText +
((_paddingBetweenFloatingLabelAndEditingText / sumOfPaddingValues) * difference);
_paddingBetweenEditingTextAndContainerBottom =
_paddingBetweenEditingTextAndContainerBottom +
((_paddingBetweenEditingTextAndContainerBottom / sumOfPaddingValues) * difference);
BOOL preferredContainerHeightIsValidForFloatingLabel =
preferredContainerHeight > defaultContainerHeightForFloatingLabel;
if (preferredContainerHeightIsValidForFloatingLabel) {
_containerHeightWithFloatingLabel = preferredContainerHeight;
BOOL shouldUpdatePaddingValuesToMeetMinimumHeight = !isMultilineTextControl;
if (shouldUpdatePaddingValuesToMeetMinimumHeight) {
CGFloat difference = preferredContainerHeight - defaultContainerHeightForFloatingLabel;
CGFloat sumOfPaddingValues = _paddingBetweenContainerTopAndFloatingLabel +
_paddingBetweenFloatingLabelAndEditingText +
_paddingBetweenEditingTextAndContainerBottom;
_paddingBetweenContainerTopAndFloatingLabel =
_paddingBetweenContainerTopAndFloatingLabel +
((_paddingBetweenContainerTopAndFloatingLabel / sumOfPaddingValues) * difference);
_paddingBetweenFloatingLabelAndEditingText =
_paddingBetweenFloatingLabelAndEditingText +
((_paddingBetweenFloatingLabelAndEditingText / sumOfPaddingValues) * difference);
_paddingBetweenEditingTextAndContainerBottom =
_paddingBetweenEditingTextAndContainerBottom +
((_paddingBetweenEditingTextAndContainerBottom / sumOfPaddingValues) * difference);
}
} else {
_containerHeightWithFloatingLabel = defaultContainerHeightForFloatingLabel;
}

if (clientHasSpecifiedValidPreferredContainerHeight) {
_containerHeightWithFloatingLabel = preferredContainerHeight;
_paddingAroundTextWhenNoFloatingLabel = MDCTextControlPaddingValueWithMinimumPadding(
kMinPaddingAroundTextWhenNoFloatingLabel, kMaxPaddingAroundTextWhenNoFloatingLabel,
clampedDensity);

CGFloat defaultContainerHeightForNoFloatingLabel =
MDCTextControlCalculateContainerHeightWhenNoFloatingLabelWithTextRowHeight(
textRowHeight, numberOfTextRows, _paddingAroundTextWhenNoFloatingLabel);
BOOL preferredContainerHeightIsValidForNoFloatingLabel =
preferredContainerHeight > defaultContainerHeightForNoFloatingLabel;
if (preferredContainerHeightIsValidForNoFloatingLabel) {
_containerHeightWithoutFloatingLabel = preferredContainerHeight;
BOOL shouldUpdatePaddingValuesToMeetMinimumHeight = !isMultilineTextControl;
if (shouldUpdatePaddingValuesToMeetMinimumHeight) {
CGFloat difference = preferredContainerHeight - defaultContainerHeightForNoFloatingLabel;
CGFloat sumOfPaddingValues = _paddingAroundTextWhenNoFloatingLabel * 2.0f;
_paddingAroundTextWhenNoFloatingLabel =
_paddingAroundTextWhenNoFloatingLabel +
((_paddingAroundTextWhenNoFloatingLabel / sumOfPaddingValues) * difference);
}
} else {
_containerHeightWithFloatingLabel = containerHeightWithPaddingsDeterminedByDensity;
_containerHeightWithoutFloatingLabel = defaultContainerHeightForNoFloatingLabel;
}

CGFloat halfOfNormalFontLineHeight = (CGFloat)0.5 * normalFontLineHeight;
if (isMultiline) {
// For multiline text controls the normal label (i.e. the label when it's not floating) should
// be positioned where it would be positioned if it were single-line.
if (isMultilineTextControl) {
CGFloat heightWithOneRow = MDCTextControlCalculateContainerHeightWithFloatingLabelHeight(
floatingLabelHeight, textRowHeight, 1, _paddingBetweenContainerTopAndFloatingLabel,
_paddingBetweenFloatingLabelAndEditingText, _paddingBetweenEditingTextAndContainerBottom);
CGFloat halfOfHeightWithOneRow = (CGFloat)0.5 * heightWithOneRow;
_paddingBetweenContainerTopAndNormalLabel = halfOfHeightWithOneRow - halfOfNormalFontLineHeight;
} else {
// For single-line text controls the normal label (i.e. the label when it's not floating) should
// be vertically centered.
CGFloat halfOfContainerHeight = (CGFloat)0.5 * _containerHeightWithFloatingLabel;
_paddingBetweenContainerTopAndNormalLabel = halfOfContainerHeight - halfOfNormalFontLineHeight;
}

CGFloat containerHeightWhenNoFloatingLabelWithPaddingsDeterminedByDensity =
MDCTextControlCalculateContainerHeightWhenNoFloatingLabelWithTextRowHeight(
textRowHeight, numberOfTextRows, _paddingAroundTextWhenNoFloatingLabel);
BOOL clientHasSpecifiedValidPreferredContainerHeightWhenNoFloatingLabel =
preferredContainerHeight > containerHeightWhenNoFloatingLabelWithPaddingsDeterminedByDensity;
if (clientHasSpecifiedValidPreferredContainerHeightWhenNoFloatingLabel && !isMultiline) {
CGFloat difference = preferredContainerHeight - containerHeightWithPaddingsDeterminedByDensity;
CGFloat sumOfPaddingValues = _paddingAroundTextWhenNoFloatingLabel * 2.0f;
_paddingAroundTextWhenNoFloatingLabel =
_paddingAroundTextWhenNoFloatingLabel +
((_paddingAroundTextWhenNoFloatingLabel / sumOfPaddingValues) * difference);
}

if (clientHasSpecifiedValidPreferredContainerHeightWhenNoFloatingLabel) {
_containerHeightWithoutFloatingLabel = preferredContainerHeight;
} else {
_containerHeightWithoutFloatingLabel =
containerHeightWhenNoFloatingLabelWithPaddingsDeterminedByDensity;
}
}

- (CGFloat)paddingBetweenContainerTopAndFloatingLabel {
Expand Down
Expand Up @@ -102,14 +102,16 @@ - (void)removeStyleFrom:(id<MDCTextControl>)textControl {
textRowHeight:(CGFloat)textRowHeight
numberOfTextRows:(CGFloat)numberOfTextRows
density:(CGFloat)density
preferredContainerHeight:(CGFloat)preferredContainerHeight {
preferredContainerHeight:(CGFloat)preferredContainerHeight
isMultilineTextControl:(BOOL)isMultilineTextControl {
return [[MDCTextControlVerticalPositioningReferenceFilled alloc]
initWithFloatingFontLineHeight:floatingLabelHeight
normalFontLineHeight:normalFontLineHeight
textRowHeight:textRowHeight
numberOfTextRows:numberOfTextRows
density:density
preferredContainerHeight:preferredContainerHeight];
preferredContainerHeight:preferredContainerHeight
isMultilineTextControl:isMultilineTextControl];
}

- (nonnull MDCTextControlHorizontalPositioningReference *)horizontalPositioningReference {
Expand Down
Expand Up @@ -26,6 +26,7 @@
textRowHeight:(CGFloat)textRowHeight
numberOfTextRows:(CGFloat)numberOfTextRows
density:(CGFloat)density
preferredContainerHeight:(CGFloat)preferredContainerHeight;
preferredContainerHeight:(CGFloat)preferredContainerHeight
isMultilineTextControl:(BOOL)isMultilineTextControl;

@end
Expand Up @@ -51,10 +51,10 @@ - (instancetype)initWithFloatingFontLineHeight:(CGFloat)floatingLabelHeight
textRowHeight:(CGFloat)textRowHeight
numberOfTextRows:(CGFloat)numberOfTextRows
density:(CGFloat)density
preferredContainerHeight:(CGFloat)preferredContainerHeight {
preferredContainerHeight:(CGFloat)preferredContainerHeight
isMultilineTextControl:(BOOL)isMultilineTextControl {
self = [super init];
if (self) {
BOOL isMultilineTextControl = numberOfTextRows > 1 || numberOfTextRows == 0;
CGFloat clampedDensity = MDCTextControlClampDensity(density);

_paddingBetweenContainerTopAndFloatingLabel = MDCTextControlPaddingValueWithMinimumPadding(
Expand Down
Expand Up @@ -122,14 +122,16 @@ - (void)removeStyleFrom:(id<MDCTextControl>)TextControl {
textRowHeight:(CGFloat)textRowHeight
numberOfTextRows:(CGFloat)numberOfTextRows
density:(CGFloat)density
preferredContainerHeight:(CGFloat)preferredContainerHeight {
preferredContainerHeight:(CGFloat)preferredContainerHeight
isMultilineTextControl:(BOOL)isMultilineTextControl {
return [[MDCTextControlVerticalPositioningReferenceOutlined alloc]
initWithFloatingFontLineHeight:floatingLabelHeight
normalFontLineHeight:normalFontLineHeight
textRowHeight:textRowHeight
numberOfTextRows:numberOfTextRows
density:density
preferredContainerHeight:preferredContainerHeight];
preferredContainerHeight:preferredContainerHeight
isMultilineTextControl:isMultilineTextControl];
}

- (MDCTextControlHorizontalPositioningReference *)horizontalPositioningReference {
Expand Down
Expand Up @@ -25,6 +25,7 @@
textRowHeight:(CGFloat)textRowHeight
numberOfTextRows:(CGFloat)numberOfTextRows
density:(CGFloat)density
preferredContainerHeight:(CGFloat)preferredContainerHeight;
preferredContainerHeight:(CGFloat)preferredContainerHeight
isMultilineTextControl:(BOOL)isMultilineTextControl;

@end

0 comments on commit 49b441e

Please sign in to comment.