2017-02-17 26 views
3

В ответе на пример, который я разместил ранее, выравнивание чисел, чтобы символы десятичной или прямой косой черты отображались в том же столбце, что и в примере 1 ниже. С этим введением к атрибутным строкам мне было предложено спросить: как отображать каждый столбец другим цветом или шрифтом? (связать данные с типами файлов, найденных в другом месте в приложении)в Swift, как мне чередовать NSMutableParagraphStyle() и NSMutableAttributedString для форматирования строки, отображаемой в UITextView?

Когда я пытаюсь сделать это ближе всего я получаю дисплей показано в примере 2 ниже, и я не могу понять, почему текст не отображается в двух столбцах, один - в синем, другой - в красном, цифры в красном столбце выравниваются так же, как в примере 1. Пример 2 имеет две проблемы. Во-первых, форматирование абзаца в примере 1 теряется при вводе форматирования шрифтов, а во-вторых, есть две версии текста: одна в цвете, другая - в черном. Я подозреваю, что обе проблемы имеют одну и ту же причину. enter image description here

На основании ответа Андреаса, в первом примере кода ниже собирает строки, которые составляют каждую строку, а затем использует 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 

ответ

1

Вы должны добавить стиль абзаца к каждому приписываемой строку, вы добавляете (например, также к новой строки и символы табуляции); самый простой способ будет добавить стиль в самом конце, в полном диапазоне:

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 getParagraphStyles() -> NSMutableParagraphStyle { 
    let paragraphStyle     = NSMutableParagraphStyle() 
    let leftTabLocation     = CGFloat(50.0) 
    let leftTab       = NSTextTab(textAlignment: .left, location: leftTabLocation, options: [:]) 

    let rightTabLocation    = CGFloat(185.0) 
    let rightSeparators:CharacterSet = [".", "/"] 
    let rightTabOptions     = [NSTabColumnTerminatorsAttributeName: rightSeparators] 
    let rightTab      = NSTextTab(textAlignment: .natural, location: rightTabLocation, options: rightTabOptions) 

    paragraphStyle.tabStops    = [leftTab, rightTab] 
    return paragraphStyle 
} 


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) 

    appendTab() 
    appendRightColumnFont(i: i) 

    appendNewLine() 

} 

// Apply paragraph to whole string: 
var paragraphStyle = getParagraphStyles() 
let fullRange = NSRange(location: 0, length: attributedTextMessage.length) 
attributedTextMessage.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: fullRange) 

formattedString      = attributedTextMessage 


let formattedText      = UITextView(frame:CGRect(x:0, y:0, width:300, height:200)) 
formattedText.attributedText   = formattedString 

PlaygroundPage.current.liveView   = formattedText 

enter image description here

+0

Andreas, атрибуты так что в конце каждой строки, getParagraphStyles() будет затем добавить стиль абзаца, основанный на позиции leftTab или rightTab, и примените их к полному диапазону строки. Это имеет смысл и намного опережает, чем я пытался это сделать. Это определенно результат, который я искал. Еще раз спасибо) – Greg