From f642199224153f7d81cea1a43b338b5567f2d384 Mon Sep 17 00:00:00 2001 From: marq Date: Wed, 26 Aug 2015 05:46:14 -0700 Subject: [PATCH] uikit_uitls and ui_uitls addditions. This CL adds some utility functions that enable operating on common UIKit and CoreGraphics data structures using the language-direction- independent 'leading' and 'trailing' nomenclature. These utilities will be used for iOS9 RTL support downstream. BUG=520568 Review URL: https://codereview.chromium.org/1303013008 Cr-Commit-Position: refs/heads/master@{#345595} --- ios/chrome/browser/ui/rtl_geometry.h | 19 ++++++++++++++++- ios/chrome/browser/ui/rtl_geometry.mm | 30 +++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/ios/chrome/browser/ui/rtl_geometry.h b/ios/chrome/browser/ui/rtl_geometry.h index f79e309d0fc02..ed37bc5535226 100644 --- a/ios/chrome/browser/ui/rtl_geometry.h +++ b/ios/chrome/browser/ui/rtl_geometry.h @@ -94,7 +94,19 @@ LayoutRect LayoutRectGetTrailingLayout(LayoutRect layout); // Return the trailing extent of |layout| (its leading plus its width). CGFloat LayoutRectGetTrailingEdge(LayoutRect layout); -// Utilities for mapping UIKit geometric structures to RTL-independent +// Utilities for mapping UIKit geometric structures to RTL-independent geometry. + +// Get leading and trailing edges of |rect|, assuming layout direction +// |direction|. +CGFloat CGRectGetLeadingEdgeUsingDirection(CGRect rect, + base::i18n::TextDirection direction); +CGFloat CGRectGetTrailingEdgeUsingDirection( + CGRect rect, + base::i18n::TextDirection direction); + +// As above, with |direction| == LayoutDirection(). +CGFloat CGRectGetLeadingEdge(CGRect rect); +CGFloat CGRectGetTrailingEdge(CGRect rect); // Leading/trailing autoresizing masks. 'Leading' is 'Left' under iOS <= 8 or // in an LTR language, 'Right' otherwise; 'Trailing' is the obverse. @@ -116,6 +128,11 @@ UIEdgeInsets UIEdgeInsetsMakeDirected(CGFloat top, CGFloat bottom, CGFloat trailing); +// Inverses of the above functions: return the leading/trailing inset for +// the current direction. +CGFloat UIEdgeInsetsGetLeading(UIEdgeInsets insets); +CGFloat UIEdgeInsetsGetTrailing(UIEdgeInsets insets); + // Autolayout utilities // Returns the correct NSLayoutFormatOption for the current OS and build. This diff --git a/ios/chrome/browser/ui/rtl_geometry.mm b/ios/chrome/browser/ui/rtl_geometry.mm index 65766b8d947d0..a473b6f5268b9 100644 --- a/ios/chrome/browser/ui/rtl_geometry.mm +++ b/ios/chrome/browser/ui/rtl_geometry.mm @@ -116,6 +116,28 @@ CGFloat LayoutRectGetTrailingEdge(LayoutRect layout) { #pragma mark - UIKit utilities +CGFloat CGRectGetLeadingEdgeUsingDirection( + CGRect rect, + base::i18n::TextDirection direction) { + return direction == base::i18n::RIGHT_TO_LEFT ? CGRectGetMaxX(rect) + : CGRectGetMinX(rect); +} + +CGFloat CGRectGetTrailingEdgeUsingDirection( + CGRect rect, + base::i18n::TextDirection direction) { + return direction == base::i18n::RIGHT_TO_LEFT ? CGRectGetMinX(rect) + : CGRectGetMaxX(rect); +} + +CGFloat CGRectGetLeadingEdge(CGRect rect) { + return CGRectGetLeadingEdgeUsingDirection(rect, LayoutDirection()); +} + +CGFloat CGRectGetTrailingEdge(CGRect rect) { + return CGRectGetTrailingEdgeUsingDirection(rect, LayoutDirection()); +} + UIViewAutoresizing UIViewAutoresizingFlexibleLeadingMargin() { return base::i18n::IsRTL() && base::ios::IsRunningOnIOS9OrLater() ? UIViewAutoresizingFlexibleRightMargin @@ -150,6 +172,14 @@ UIEdgeInsets UIEdgeInsetsMakeDirected(CGFloat top, LayoutDirection()); } +CGFloat UIEdgeInsetsGetLeading(UIEdgeInsets insets) { + return UseRTLLayout() ? insets.right : insets.left; +} + +CGFloat UIEdgeInsetsGetTrailing(UIEdgeInsets insets) { + return UseRTLLayout() ? insets.left : insets.right; +} + #pragma mark - autolayout utilities NSLayoutFormatOptions LayoutOptionForRTLSupport() {