0

我想使用NSDirectionalEdgeInsetstoUIButtoncontentEdgeInsets. titleEdgeInsets那可能吗?

背景

出于本地化目的,在设置组件的插图时,iOS 应用程序可能需要同时适应从左到右和从右到左的语言。

Apple 推出NSDirectionalEdgeInsets了 iOS11,不幸的是,这仅适用于少数属性,例如directionalLayoutMargins, 不推荐UIEdgeInsets用于layoutMargins.

NSDirectionalEdgeInsets使用前导尾随修饰符而不是其对应项使用的左右修饰符来尊重界面布局方向。UIEdgeInsets

当前不正确的解决方案

对每个修改过的属性的每个按钮/视图使用以下代码UIEdgeInsets非常麻烦,并且在进行更改时容易出错:

let isRTL: UIUserInterfaceLayoutDirection = // logic to determine language direction 

if isRTL == .leftToRight {
    nextButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 0)
} else {
    nextButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10)
}
4

1 回答 1

2

解决方案

import UIKit

extension UIView {
    // Returns `UIEdgeInsets` set using `leading` and `trailing` modifiers adaptive to the language direction
    func getDirectionalUIEdgeInsets(top: CGFloat, leading: CGFloat, bottom: CGFloat, trailing: CGFloat) -> UIEdgeInsets {
        // NOTE: this wil be deprecated when Apple use `NSDirectioanlEdgeInsets` (https://developer.apple.com/documentation/uikit/nsdirectionaledgeinsets) for your insets property instead of `UIEdgeInsets`

        if self.userInterfaceLayoutDirection == .leftToRight {
            return UIEdgeInsets(top: top, left: leading, bottom: bottom, right: trailing)
        } else {
            return UIEdgeInsets(top: top, left: trailing, bottom: bottom, right: leading)
        }
    }

    /// Returns text and UI direction based on current view settings
    var userInterfaceLayoutDirection: UIUserInterfaceLayoutDirection
    {
        if #available(iOS 9.0, *) {
            return UIView.userInterfaceLayoutDirection(for: self.semanticContentAttribute)
        } else {
            return UIApplication.shared.userInterfaceLayoutDirection
        }
    }
}

用法

nextButton.contentEdgeInsets = nextButton.getDirectionalUIEdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 0)

我在 Stackoverflow 上寻找答案,但一无所获。因此,我正在分享我的答案。

学分

感谢David Rysanek对Stackoverflow的扩展回答。userInterfaceLayoutDirection

于 2018-12-31T12:09:28.790 回答