Поддержка NSDirectionalEdgeInsets для contenEdgeInsets UIButton? - PullRequest
0 голосов
/ 31 декабря 2018

Я хотел бы использовать NSDirectionalEdgeInsets до UIButton s contentEdgeInsets и 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)
}

1 Ответ

0 голосов
/ 31 декабря 2018

Решение

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 и ничего не нашел.Таким образом, я делюсь своим ответом.

Кредиты

Благодаря этот ответ Stackoverflow от David Rysanek для userInterfaceLayoutDirection расширения.

...