#swift #uidatepicker #ios14
#swift #uidatepicker #ios14
Вопрос:
Я хочу, чтобы в моем средстве выбора даты текст был выровнен по правому краю, поскольку он содержится в выровненном по правому краю табличном представлении. Я использую стиль iOS 14 по умолчанию, когда выбор средства выбора даты заканчивается во всплывающем окне для выбора даты, поэтому по умолчанию метка выравнивается по левому краю, когда всплывающее окно не отображается. Я пытался использовать datePicker.contentHorizontalAlignment = .right
, но ничего не меняется. Есть ли какой-либо другой способ изменить выравнивание, поскольку это выглядит странно таким образом?
Комментарии:
1. вы уверены в своих ограничениях?
2. Ограничения устанавливаются на все четыре стороны, иначе серый прямоугольник был бы другим
3. Для тех, кто хочет переместить всю область серого прямоугольника, вы можете справа привязать средство выбора даты, а затем вызвать
.sizeToFit()
, чтобы задать ширину
Ответ №1:
Явного способа сделать это нет, поскольку сам виджет, похоже, не соблюдает выравнивание содержимого; НО: я нашел способ сделать это, который в настоящее время работает с iOS. В какой-то момент средство выбора даты создает UILabel, по-видимому, с «ведущим» ограничением, независимо от выравнивания содержимого. Но мы можем переопределить, что означает это «ведущее», с умным использованием semanticContentAttribute
.
datePicker.semanticContentAttribute = .forceRightToLeft
datePicker.subviews.first?.semanticContentAttribute = .forceRightToLeft
- Этот код не может привести к сбою приложения, даже если виджет изменится, он безопасно получает доступ к первому вложенному представлению и устанавливает для него официальный API.
- Он работает с iOS 14.2; и
- Предположим, в iOS 14.3 или 15 Apple изменяет структуру виджета таким образом, что этот трюк не работает, возможно, из-за наличия другого вложенного представления, все, что может произойти, — это возврат к макету по умолчанию.
Возможно, требуется только вторая строка кода, но моя первая попытка была с первой строкой, которая не сработала, поэтому я добавил вторую строку.