Skip to content

Commit 65c014d

Browse files
zhongwuzwfacebook-github-bot
authored andcommittedMar 4, 2019
Keep placeholder attributes sync with text input text's attributes (#23738)
Summary: We need to keep placeholder attributes sync with text input's text attributes, like `font`,`kern` ....., to keep style the same. Also fixes #19002 . [iOS] [Fixed] - Keep placeholder attributes sync with text input text's attributes Pull Request resolved: #23738 Differential Revision: D14298482 Pulled By: cpojer fbshipit-source-id: 3555091bf3bc01e4b026d5a4cdbe93b4122106e8
1 parent d451c03 commit 65c014d

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed
 

‎Libraries/Text/TextInput/Multiline/RCTUITextView.m

+14-2
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ - (NSString *)accessibilityLabel
8282
- (void)setPlaceholder:(NSString *)placeholder
8383
{
8484
_placeholder = placeholder;
85-
_placeholderView.text = _placeholder;
85+
_placeholderView.attributedText = [[NSAttributedString alloc] initWithString:_placeholder ?: @"" attributes:[self placeholderEffectiveTextAttributes]];
8686
}
8787

8888
- (void)setPlaceholderColor:(UIColor *)placeholderColor
@@ -98,7 +98,8 @@ - (void)setReactTextAttributes:(RCTTextAttributes *)reactTextAttributes
9898
}
9999
self.typingAttributes = reactTextAttributes.effectiveTextAttributes;
100100
_reactTextAttributes = reactTextAttributes;
101-
_placeholderView.font = self.font ?: defaultPlaceholderFont();
101+
// Update placeholder text attributes
102+
[self setPlaceholder:_placeholder];
102103
}
103104

104105
- (RCTTextAttributes *)reactTextAttributes
@@ -249,6 +250,17 @@ - (void)invalidatePlaceholderVisibility
249250
_placeholderView.hidden = !isVisible;
250251
}
251252

253+
- (NSDictionary<NSAttributedStringKey, id> *)placeholderEffectiveTextAttributes
254+
{
255+
NSDictionary<NSAttributedStringKey, id> *effectiveTextAttributes = @{
256+
NSFontAttributeName: _reactTextAttributes.effectiveFont ?: defaultPlaceholderFont(),
257+
NSForegroundColorAttributeName: self.placeholderColor ?: defaultPlaceholderColor(),
258+
NSKernAttributeName:isnan(_reactTextAttributes.letterSpacing) ? @0 : @(_reactTextAttributes.letterSpacing)
259+
};
260+
261+
return effectiveTextAttributes;
262+
}
263+
252264
#pragma mark - Utility Methods
253265

254266
- (void)copyTextAttributesFrom:(NSAttributedString *)sourceString

‎Libraries/Text/TextInput/Singleline/RCTUITextField.m

+5
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ - (void)setReactTextAttributes:(RCTTextAttributes *)reactTextAttributes
7070
}
7171
self.defaultTextAttributes = reactTextAttributes.effectiveTextAttributes;
7272
_reactTextAttributes = reactTextAttributes;
73+
[self _updatePlaceholder];
7374
}
7475

7576
- (RCTTextAttributes *)reactTextAttributes
@@ -87,6 +88,10 @@ - (void)_updatePlaceholder
8788
if (_placeholderColor) {
8889
[attributes setObject:_placeholderColor forKey:NSForegroundColorAttributeName];
8990
}
91+
// Kerning
92+
if (!isnan(_reactTextAttributes.letterSpacing)) {
93+
attributes[NSKernAttributeName] = @(_reactTextAttributes.letterSpacing);
94+
}
9095

9196
self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder
9297
attributes:attributes];

0 commit comments

Comments
 (0)
Please sign in to comment.