mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
11c8bf3137
Summary: This adds Dynamic Type support in iOS as described [here](https://github.com/react-native-community/discussions-and-proposals/issues/519). `Text` elements have a new prop, `dynamicTypeRamp`, that allows users to specify which font ramp a particular `Text` element should take on as the OS's accessibility setting for text size. The different types line up with different values of `UIFontTextStyle`. If not specified, we default to the current behavior. ~~For the moment, this change is only for Paper. I tried applying a corresponding change to Fabric by adding an additional field to [`facebook::react::TextAttributes`](https://github.com/facebook/react-native/blob/main/ReactCommon/react/renderer/attributedstring/TextAttributes.h) and changing [`RCTEffectiveFontSizeMultiplierFromTextAttributes`](https://github.com/facebook/react-native/blob/afb124dcf0cdf0db525acc7cfd2cea2742c64068/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm#L79-L84) to use that new field, but in the process I discovered that this function doesn't seem to ever get called, hence [this bug](https://github.com/facebook/react-native/issues/34990).~~ ## Changelog [iOS] [Added] - Dynamic Type support Pull Request resolved: https://github.com/facebook/react-native/pull/35017 Test Plan: Validated with a test page in RNTester. Screenshots follow: A) Default text size B) Largest non-accessibility text size C) Largest accessibility text size, split across two screenshots due to size | A | B | C | |-|-|-| |  |  |  | |||  | Reviewed By: sammy-SC Differential Revision: D40779346 Pulled By: NickGerleman fbshipit-source-id: efc7a8e9810a93afc82c5def97af15a2e8453d90
140 lines
4.4 KiB
C++
140 lines
4.4 KiB
C++
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <functional>
|
|
#include <limits>
|
|
#include <optional>
|
|
|
|
#include <folly/Hash.h>
|
|
#include <react/renderer/attributedstring/primitives.h>
|
|
#include <react/renderer/core/LayoutPrimitives.h>
|
|
#include <react/renderer/core/ReactPrimitives.h>
|
|
#include <react/renderer/debug/DebugStringConvertible.h>
|
|
#include <react/renderer/graphics/Color.h>
|
|
#include <react/renderer/graphics/Float.h>
|
|
#include <react/renderer/graphics/Size.h>
|
|
|
|
namespace facebook {
|
|
namespace react {
|
|
|
|
class TextAttributes;
|
|
|
|
using SharedTextAttributes = std::shared_ptr<const TextAttributes>;
|
|
|
|
class TextAttributes : public DebugStringConvertible {
|
|
public:
|
|
/*
|
|
* Returns TextAttribute object which has actual default attribute values
|
|
* (e.g. `foregroundColor = black`), in oppose to TextAttribute's default
|
|
* constructor which creates an object with nulled attributes.
|
|
*/
|
|
static TextAttributes defaultTextAttributes();
|
|
|
|
#pragma mark - Fields
|
|
|
|
// Color
|
|
SharedColor foregroundColor{};
|
|
SharedColor backgroundColor{};
|
|
Float opacity{std::numeric_limits<Float>::quiet_NaN()};
|
|
|
|
// Font
|
|
std::string fontFamily{""};
|
|
Float fontSize{std::numeric_limits<Float>::quiet_NaN()};
|
|
Float fontSizeMultiplier{std::numeric_limits<Float>::quiet_NaN()};
|
|
std::optional<FontWeight> fontWeight{};
|
|
std::optional<FontStyle> fontStyle{};
|
|
std::optional<FontVariant> fontVariant{};
|
|
std::optional<bool> allowFontScaling{};
|
|
std::optional<DynamicTypeRamp> dynamicTypeRamp{};
|
|
Float letterSpacing{std::numeric_limits<Float>::quiet_NaN()};
|
|
std::optional<TextTransform> textTransform{};
|
|
|
|
// Paragraph Styles
|
|
Float lineHeight{std::numeric_limits<Float>::quiet_NaN()};
|
|
std::optional<TextAlignment> alignment{};
|
|
std::optional<WritingDirection> baseWritingDirection{};
|
|
std::optional<LineBreakStrategy> lineBreakStrategy{};
|
|
|
|
// Decoration
|
|
SharedColor textDecorationColor{};
|
|
std::optional<TextDecorationLineType> textDecorationLineType{};
|
|
std::optional<TextDecorationStyle> textDecorationStyle{};
|
|
|
|
// Shadow
|
|
// TODO: Use `Point` type instead of `Size` for `textShadowOffset` attribute.
|
|
std::optional<Size> textShadowOffset{};
|
|
Float textShadowRadius{std::numeric_limits<Float>::quiet_NaN()};
|
|
SharedColor textShadowColor{};
|
|
|
|
// Special
|
|
std::optional<bool> isHighlighted{};
|
|
|
|
// TODO T59221129: document where this value comes from and how it is set.
|
|
// It's not clear if this is being used properly, or if it's being set at all.
|
|
// Currently, it is intentionally *not* being set as part of BaseTextProps
|
|
// construction.
|
|
std::optional<LayoutDirection> layoutDirection{};
|
|
std::optional<AccessibilityRole> accessibilityRole{};
|
|
|
|
#pragma mark - Operations
|
|
|
|
void apply(TextAttributes textAttributes);
|
|
|
|
#pragma mark - Operators
|
|
|
|
bool operator==(const TextAttributes &rhs) const;
|
|
bool operator!=(const TextAttributes &rhs) const;
|
|
|
|
#pragma mark - DebugStringConvertible
|
|
|
|
#if RN_DEBUG_STRING_CONVERTIBLE
|
|
SharedDebugStringConvertibleList getDebugProps() const override;
|
|
#endif
|
|
};
|
|
|
|
} // namespace react
|
|
} // namespace facebook
|
|
|
|
namespace std {
|
|
|
|
template <>
|
|
struct hash<facebook::react::TextAttributes> {
|
|
size_t operator()(
|
|
const facebook::react::TextAttributes &textAttributes) const {
|
|
return folly::hash::hash_combine(
|
|
0,
|
|
textAttributes.foregroundColor,
|
|
textAttributes.backgroundColor,
|
|
textAttributes.opacity,
|
|
textAttributes.fontFamily,
|
|
textAttributes.fontSize,
|
|
textAttributes.fontSizeMultiplier,
|
|
textAttributes.fontWeight,
|
|
textAttributes.fontStyle,
|
|
textAttributes.fontVariant,
|
|
textAttributes.allowFontScaling,
|
|
textAttributes.letterSpacing,
|
|
textAttributes.textTransform,
|
|
textAttributes.lineHeight,
|
|
textAttributes.alignment,
|
|
textAttributes.baseWritingDirection,
|
|
textAttributes.lineBreakStrategy,
|
|
textAttributes.textDecorationColor,
|
|
textAttributes.textDecorationLineType,
|
|
textAttributes.textDecorationStyle,
|
|
textAttributes.textShadowOffset,
|
|
textAttributes.textShadowRadius,
|
|
textAttributes.textShadowColor,
|
|
textAttributes.isHighlighted,
|
|
textAttributes.layoutDirection,
|
|
textAttributes.accessibilityRole);
|
|
}
|
|
};
|
|
} // namespace std
|