Я работаю над text view, который заменяет заполнители UITextFields. Я передаю ему объект (структуру или словарь) с текстом, содержащим несколько экземпляров токена-заполнителя. Словарь также содержит массив полей, из которых мы хотим собирать данные. Моя цель - разместить UITextFields (или другие виды) во всем тексте и скрыть маркеры.Интерполирование UITextFields с UITextView с использованием текстового набора?
Использование методов NSLayoutManager для расчета местоположения токенов-заполнителей в текстовых контейнерах, я конвертирую эти точки в CGRects, а затем пути исключения, перетекаю текст по текстовым полям. Вот как это выглядит:
func createAndAssignExclusionPathsForInputTextFields() {
var index = 0
let textFieldCount = self.textFields.count
var exclusionPaths : [UIBezierPath] = []
while index < textFieldCount {
let textField : AgreementTextField = self.textFields[index]
let location = self.calculatePositionOfPlaceholderAtIndex(index)
let size = textField.intrinsicContentSize()
textField.frame = CGRectMake(location.x, location.y, size.width, size.height)
exclusionPaths.append(textField.exclusionPath())
index = index + 1
}
self.textContainer.exclusionPaths = exclusionPaths
}
// ...
func calculatePositionOfPlaceholderAtIndex(textIndex : NSInteger) -> CGPoint {
let layoutManager : NSLayoutManager = self.textContainer.layoutManager!
let delimiterRange = self.indices[textIndex]
let characterIndex = delimiterRange.location
let glyphRange = self.layoutManager.glyphRangeForCharacterRange(delimiterRange, actualCharacterRange:nil)
let glyphIndex = glyphRange.location
let rect = layoutManager.lineFragmentRectForGlyphAtIndex(glyphIndex, effectiveRange: nil, withoutAdditionalLayout: true)
let remainingRect : UnsafeMutablePointer<CGRect> = nil
let textContainerRect = self.textContainer.lineFragmentRectForProposedRect(rect, atIndex: characterIndex, writingDirection: .LeftToRight, remainingRect: remainingRect)
let position = CGPointMake(textContainerRect.origin.x, textContainerRect.origin.y)
return position
}
На данный момент у меня есть три вопроса:
- После того, как я назначить путь исключения к textContainer, рассчитанными местоположениями глифов для других заполнителей теперь все неправильно.
- Метод
calculatePositionOfPlaceholderAtIndex
дает мне довольно хорошие значения y, но значения x равны 0. - Я не смог скрыть тег-заполнитель.
Таким образом, чтобы решить первый вопрос в моем списке, я пытался добавить путь исключения перед вычислением следующего, изменив createAndAssignExclusionPathsForInputTextFields
:
func createAndAssignExclusionPathsForInputTextFields() {
var index = 0
let textFieldCount = self.textFields.count
while index < textFieldCount {
let textField : AgreementTextField = self.textFields[index]
let location = self.calculatePositionOfPlaceholderAtIndex(index)
let size = textField.intrinsicContentSize()
textField.frame = CGRectMake(location.x, location.y, size.width, size.height)
self.textContainer.exclusionPaths.append(textField.exclusionPath())
index = index + 1
}
}
Теперь мои расчетные позиции все возвращается 0, 0 Не то, что мы хотим. Добавление пути исключения, по-видимому, делает расчетные местоположения недействительными, но получение 0, 0 назад для каждого прямого метода не помогает.
Как я могу попросить менеджера компоновки пересчитать позицию для глифов на экране после добавления пути исключения или скрытия глифа?
EDIT: ответ Per Alain T, я попытался следующие без везения:
func createAndAssignExclusionPathsForInputTextFields() {
var index = 0
let textFieldCount = self.textFields.count
var exclusionPaths : [UIBezierPath] = []
while index < textFieldCount {
let textField : AgreementTextField = self.textFields[index]
let location = self.calculatePositionOfPlaceholderAtIndex(index)
let size = textField.intrinsicContentSize()
textField.frame = CGRectMake(location.x, location.y, size.width, size.height)
exclusionPaths.append(textField.exclusionPath())
self.textContainer.exclusionPaths = exclusionPaths
self.layoutManager.ensureLayoutForTextContainer(self.textContainer)
index = index + 1
}
self.textContainer.exclusionPaths = exclusionPaths
}
Я не понял этого. Вместо этого я реализовал подкласс UITextField, который делает что-то подобное. – Moshe
вы можете подключить образец проекта xcode и поделиться им? Я бы хотел попробовать. – ShahiM
У меня нет образца проекта на данный момент, но я посмотрю, смогу ли я его создать. – Moshe