Используя методы NSLayoutManager для вычисления местоположения токенов-заполнителей в текстовых контейнерах, я конвертирую эти точки в CGR-объекты, а затем пути исключения, выкладываю текст по текстовым полям. Вот что это выглядит:
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 назад для каждого прямого метода не помогает.
Как я могу попросить менеджера макета пересчитать позицию для глифов на экране после добавления пути исключения или скрытия глифа?
РЕДАКТИРОВАТЬ: Ответ на 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
}