В ответе на пример, который я разместил ранее, выравнивание чисел, чтобы символы десятичной или прямой косой черты отображались в том же столбце, что и в примере 1 ниже. С этим введением к атрибутным строкам мне было предложено спросить: как отображать каждый столбец другим цветом или шрифтом? (связать данные с типами файлов, найденных в другом месте в приложении)в Swift, как мне чередовать NSMutableParagraphStyle() и NSMutableAttributedString для форматирования строки, отображаемой в UITextView?
Когда я пытаюсь сделать это ближе всего я получаю дисплей показано в примере 2 ниже, и я не могу понять, почему текст не отображается в двух столбцах, один - в синем, другой - в красном, цифры в красном столбце выравниваются так же, как в примере 1. Пример 2 имеет две проблемы. Во-первых, форматирование абзаца в примере 1 теряется при вводе форматирования шрифтов, а во-вторых, есть две версии текста: одна в цвете, другая - в черном. Я подозреваю, что обе проблемы имеют одну и ту же причину.
На основании ответа Андреаса, в первом примере кода ниже собирает строки, которые составляют каждую строку, а затем использует NSMutableParagraphStyle()
для создания макета, показанного в примере 1 (выше). Второй пример кода применяет форматирование к строкам до добавления форматированных строк в каждой строке - моя попытка чередования NSMutableParagraphStyle()
и NSMutableAttributedString
- для создания макета, показанного в примере 2 (выше). Оба были протестированы на игровой площадке. Во втором примере я попытался переключить порядок вызова функций форматирования, например.
appendLeftColumnParagraph(textIn: column1)
appendLeftColumnFont(i: i)
и
appendRightColumnParagraph(textIn: column2)
appendRightColumnFont(i: i)
вместо
appendLeftColumnFont(i: i)
appendLeftColumnParagraph(textIn: column1)
и
appendRightColumnFont(i: i)
appendRightColumnParagraph(textIn: column2)
, но это только делает цветные символы появляются после того, как черные символы вместо ранее. Это почти так, как если бы я мог ожидать добавления атрибутной строки, используя либо NSMutableAttributedString
, либо NSMutableParagraphStyle()
, но не оба. Либо это, либо есть что-то основное, я не понимаю о добавлении атрибутированных строк.
Итак, если предположить, что это правильный вопрос, как я могу чередовать NSMutableParagraphStyle()
и NSMutableAttributedString
для форматирования строки отображается в UITextView
в виде двух столбцов, один в синем, других в красном с числами в красной колонке выровнен таким же, как в Пример 1.
Буду признателен, если кто-то из свежих клеток мозга поможет мне ответить на этот вопрос. Благодарю.
Пример кода 1 - с NSMutableParagraphStyle() только
import UIKit
import PlaygroundSupport
var tuningArray = ["1/1", "76.04900", "193.15686", "310.26471", "5/4", "503.42157", "579.47057", "696.57843", "25/16", "889.73529", "1006.84314", "1082.89214"]
var keyArray = ["x", "1", "x", "x", "4", "x", "6", "x", "x", "9", "x", "11"]
let scaleSize = tuningArray.count
var textMessage = ""
for i in 0..<scaleSize {
var textLine = "\t" + keyArray[i] + "\t" + tuningArray[i] + "\n"
textMessage += textLine
}
let paragraphStyle = NSMutableParagraphStyle()
let leftTabLocation = CGFloat(50)
let rightTabLocation = CGFloat(185)
var leftTab = NSTextTab(textAlignment: .left, location: leftTabLocation, options: [:])
let rightTerminators:CharacterSet = [".", "/"]
let rightTabOptions = [NSTabColumnTerminatorsAttributeName:rightTerminators]
var rightTab = NSTextTab(textAlignment: .natural, location: rightTabLocation, options:rightTabOptions)
paragraphStyle.tabStops = [leftTab, rightTab]
var attributedText = NSAttributedString(string:textMessage,attributes: [NSParagraphStyleAttributeName: paragraphStyle])
let formattedText = UITextView(frame:CGRect(x:0, y:0, width:300, height:200))
formattedText.attributedText = attributedText
PlaygroundPage.current.liveView = formattedText
Пример кода 2 - NSMutableParagraphStyle() с NSMutableAttributedString.INIT (строка:)
import UIKit
import PlaygroundSupport
var tuningArray = ["1/1", "76.04900", "193.15686", "310.26471", "5/4", "503.42157", "579.47057", "696.57843", "25/16", "889.73529", "1006.84314", "1082.89214"]
var keyArray = ["x", "1", "x", "x", "4", "x", "6", "x", "x", "9", "x", "11"]
let scaleSize = tuningArray.count
var textMessage = ""
var textString = String()
var formattedString = NSAttributedString()
var rangeOfKeyString = NSRange()
var attributeKey = NSMutableAttributedString()
var rangeOfTuningString = NSRange()
var attributeTuning = NSMutableAttributedString()
let attributedTextMessage = NSMutableAttributedString()
func appendLeftColumnParagraph(textIn: String) {
let paragraphStyle = NSMutableParagraphStyle()
let leftTabLocation = CGFloat(50.0)
let leftTab = NSTextTab(textAlignment: .left, location: leftTabLocation, options: [:])
paragraphStyle.tabStops = [leftTab]
let attributedLeftColumnParagraph = NSAttributedString(string:textIn, attributes: [NSParagraphStyleAttributeName: paragraphStyle])
attributedTextMessage.append(attributedLeftColumnParagraph)
}
func appendRightColumnParagraph(textIn: String) {
let paragraphStyle = NSMutableParagraphStyle()
let rightTabLocation = CGFloat(185.0)
let rightSeparators:CharacterSet = [".", "/"]
let rightTabOptions = [NSTabColumnTerminatorsAttributeName: rightSeparators]
let rightTab = NSTextTab(textAlignment: .natural, location: rightTabLocation, options: rightTabOptions)
paragraphStyle.tabStops = [rightTab]
let attributedRightColumnParagraph = NSAttributedString(string:textIn, attributes: [NSParagraphStyleAttributeName: paragraphStyle])
attributedTextMessage.append(attributedRightColumnParagraph)
}
func appendLeftColumnFont(i: Int){
rangeOfKeyString = (keyArray[i] as NSString).range(of: keyArray[i])
attributeKey = NSMutableAttributedString.init(string: keyArray[i])
attributeKey.addAttribute(NSForegroundColorAttributeName, value: UIColor.blue, range: rangeOfKeyString)
attributedTextMessage.append(attributeKey)
}
func appendRightColumnFont(i: Int){
rangeOfTuningString = (tuningArray[i] as NSString).range(of: tuningArray[i])
attributeTuning = NSMutableAttributedString.init(string: tuningArray[i])
attributeTuning.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: rangeOfTuningString)
attributedTextMessage.append(attributeTuning)
}
func appendTab(){
let attributedTab = NSMutableAttributedString.init(string: "\t")
attributedTextMessage.append(attributedTab)
}
func appendNewLine(){
let attributedNewLine = NSMutableAttributedString.init(string: "\n")
attributedTextMessage.append(attributedNewLine)
}
for i in 0..<scaleSize {
// var textLine = "\t" + keyArray[i] + "\t" + tuningArray[i] + "\n"
let column1 = keyArray[i]
let column2 = tuningArray[i]
appendTab()
appendLeftColumnFont(i: i)
appendLeftColumnParagraph(textIn: column1)
appendTab()
appendRightColumnFont(i: i)
appendRightColumnParagraph(textIn: column2)
appendNewLine()
}
formattedString = attributedTextMessage
let formattedText = UITextView(frame:CGRect(x:0, y:0, width:300, height:200))
formattedText.attributedText = formattedString
PlaygroundPage.current.liveView = formattedText
Andreas, атрибуты так что в конце каждой строки, getParagraphStyles() будет затем добавить стиль абзаца, основанный на позиции leftTab или rightTab, и примените их к полному диапазону строки. Это имеет смысл и намного опережает, чем я пытался это сделать. Это определенно результат, который я искал. Еще раз спасибо) – Greg