mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
feat(iOS): line break mode cpp changes and new functions (#46130)
Summary: Solves this issue: https://github.com/facebook/react-native/issues/44107 ## Changelog: <!-- Help reviewers and the release process by writing your own changelog entry. Pick one each for the category and type tags: [ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message For more details, see: https://reactnative.dev/contributing/changelogs-in-pull-requests --> [IOS] [ADDED] - Line break mode for TextInput components. **This includes cpp changes and new functions.** This PR is a breakdown of [this](https://github.com/facebook/react-native/pull/45968) PR. Pull Request resolved: https://github.com/facebook/react-native/pull/46130 Test Plan: - Tested builds in new and old architecture mode. Reviewed By: andrewdacenko Differential Revision: D61656894 Pulled By: cipolleschi fbshipit-source-id: 9a25387cb27cded072e76575e6d2fca01963c621
This commit is contained in:
committed by
Facebook GitHub Bot
parent
b22970e3cf
commit
6cab6c2a13
@@ -44,6 +44,7 @@ extern NSString *const RCTTextAttributesTagAttributeName;
|
||||
@property (nonatomic, assign) NSTextAlignment alignment;
|
||||
@property (nonatomic, assign) NSWritingDirection baseWritingDirection;
|
||||
@property (nonatomic, assign) NSLineBreakStrategy lineBreakStrategy;
|
||||
@property (nonatomic, assign) NSLineBreakMode lineBreakMode;
|
||||
// Decoration
|
||||
@property (nonatomic, strong, nullable) UIColor *textDecorationColor;
|
||||
@property (nonatomic, assign) NSUnderlineStyle textDecorationStyle;
|
||||
|
||||
@@ -28,6 +28,7 @@ NSString *const RCTTextAttributesTagAttributeName = @"RCTTextAttributesTagAttrib
|
||||
_alignment = NSTextAlignmentNatural;
|
||||
_baseWritingDirection = NSWritingDirectionNatural;
|
||||
_lineBreakStrategy = NSLineBreakStrategyNone;
|
||||
_lineBreakMode = NSLineBreakByWordWrapping;
|
||||
_textShadowRadius = NAN;
|
||||
_opacity = NAN;
|
||||
_textTransform = RCTTextTransformUndefined;
|
||||
@@ -70,6 +71,7 @@ NSString *const RCTTextAttributesTagAttributeName = @"RCTTextAttributesTagAttrib
|
||||
? textAttributes->_baseWritingDirection
|
||||
: _baseWritingDirection; // *
|
||||
_lineBreakStrategy = textAttributes->_lineBreakStrategy ?: _lineBreakStrategy;
|
||||
_lineBreakMode = textAttributes->_lineBreakMode ?: _lineBreakMode;
|
||||
|
||||
// Decoration
|
||||
_textDecorationColor = textAttributes->_textDecorationColor ?: _textDecorationColor;
|
||||
@@ -128,6 +130,11 @@ NSString *const RCTTextAttributesTagAttributeName = @"RCTTextAttributesTagAttrib
|
||||
}
|
||||
}
|
||||
|
||||
if (_lineBreakMode != NSLineBreakByWordWrapping) {
|
||||
paragraphStyle.lineBreakMode = _lineBreakMode;
|
||||
isParagraphStyleUsed = YES;
|
||||
}
|
||||
|
||||
if (!isnan(_lineHeight)) {
|
||||
CGFloat lineHeight = _lineHeight * self.effectiveFontSizeMultiplier;
|
||||
paragraphStyle.minimumLineHeight = lineHeight;
|
||||
@@ -336,6 +343,7 @@ static NSString *capitalizeText(NSString *text)
|
||||
// Paragraph Styles
|
||||
RCTTextAttributesCompareFloats(_lineHeight) && RCTTextAttributesCompareFloats(_alignment) &&
|
||||
RCTTextAttributesCompareOthers(_baseWritingDirection) && RCTTextAttributesCompareOthers(_lineBreakStrategy) &&
|
||||
RCTTextAttributesCompareOthers(_lineBreakMode) &&
|
||||
// Decoration
|
||||
RCTTextAttributesCompareObjects(_textDecorationColor) && RCTTextAttributesCompareOthers(_textDecorationStyle) &&
|
||||
RCTTextAttributesCompareOthers(_textDecorationLine) &&
|
||||
|
||||
@@ -60,6 +60,7 @@ class TextAttributes : public DebugStringConvertible {
|
||||
std::optional<TextAlignment> alignment{};
|
||||
std::optional<WritingDirection> baseWritingDirection{};
|
||||
std::optional<LineBreakStrategy> lineBreakStrategy{};
|
||||
std::optional<LineBreakMode> lineBreakMode{};
|
||||
|
||||
// Decoration
|
||||
SharedColor textDecorationColor{};
|
||||
@@ -128,6 +129,7 @@ struct hash<facebook::react::TextAttributes> {
|
||||
textAttributes.textAlignVertical,
|
||||
textAttributes.baseWritingDirection,
|
||||
textAttributes.lineBreakStrategy,
|
||||
textAttributes.lineBreakMode,
|
||||
textAttributes.textDecorationColor,
|
||||
textAttributes.textDecorationLineType,
|
||||
textAttributes.textDecorationStyle,
|
||||
|
||||
@@ -103,6 +103,15 @@ enum class LineBreakStrategy {
|
||||
// system uses for standard UI labels.
|
||||
};
|
||||
|
||||
enum class LineBreakMode {
|
||||
Word, // Wrap at word boundaries, default
|
||||
Char, // Wrap at character boundaries
|
||||
Clip, // Simply clip
|
||||
Head, // Truncate at head of line: "...wxyz"
|
||||
Middle, // Truncate middle of line: "ab...yz"
|
||||
Tail // Truncate at tail of line: "abcd..."
|
||||
};
|
||||
|
||||
enum class TextDecorationLineType {
|
||||
None,
|
||||
Underline,
|
||||
|
||||
+5
@@ -233,6 +233,11 @@ NSDictionary<NSAttributedStringKey, id> *RCTNSTextAttributesFromTextAttributes(c
|
||||
isParagraphStyleUsed = YES;
|
||||
}
|
||||
|
||||
if (textAttributes.lineBreakMode.has_value()) {
|
||||
paragraphStyle.lineBreakMode = RCTNSLineBreakModeFromLineBreakMode(textAttributes.lineBreakMode.value());
|
||||
isParagraphStyleUsed = YES;
|
||||
}
|
||||
|
||||
if (!isnan(textAttributes.lineHeight)) {
|
||||
CGFloat lineHeight = textAttributes.lineHeight * RCTEffectiveFontSizeMultiplierFromTextAttributes(textAttributes);
|
||||
paragraphStyle.minimumLineHeight = lineHeight;
|
||||
|
||||
+18
@@ -63,6 +63,24 @@ inline static NSLineBreakStrategy RCTNSLineBreakStrategyFromLineBreakStrategy(
|
||||
}
|
||||
}
|
||||
|
||||
inline static NSLineBreakMode RCTNSLineBreakModeFromLineBreakMode(facebook::react::LineBreakMode lineBreakMode)
|
||||
{
|
||||
switch (lineBreakMode) {
|
||||
case facebook::react::LineBreakMode::Word:
|
||||
return NSLineBreakByWordWrapping;
|
||||
case facebook::react::LineBreakMode::Char:
|
||||
return NSLineBreakByCharWrapping;
|
||||
case facebook::react::LineBreakMode::Clip:
|
||||
return NSLineBreakByClipping;
|
||||
case facebook::react::LineBreakMode::Head:
|
||||
return NSLineBreakByTruncatingHead;
|
||||
case facebook::react::LineBreakMode::Middle:
|
||||
return NSLineBreakByTruncatingMiddle;
|
||||
case facebook::react::LineBreakMode::Tail:
|
||||
return NSLineBreakByTruncatingTail;
|
||||
}
|
||||
}
|
||||
|
||||
inline static RCTFontStyle RCTFontStyleFromFontStyle(facebook::react::FontStyle fontStyle)
|
||||
{
|
||||
switch (fontStyle) {
|
||||
|
||||
Reference in New Issue
Block a user