Ta odpowiedź została zaktualizowana do wersji Swift 4.2.
Krótki przegląd
Ogólna forma tworzenia i ustawiania przypisanego ciągu znaków jest następująca. Poniżej znajdziesz inne popularne opcje.
// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute)
// set attributed text on a UILabel
myLabel.attributedText = myAttrString
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myAttribute = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ]
let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray
let myAttribute = [ NSAttributedString.Key.shadow: myShadow ]
Pozostała część tego postu zawiera więcej szczegółów dla zainteresowanych.
Atrybuty
Atrybuty ciągów to tylko słownik w formie [NSAttributedString.Key: Any]
, gdzie NSAttributedString.Key
jest kluczową nazwą atrybutu i Any
wartością jakiegoś typu. Wartością może być czcionka, kolor, liczba całkowita lub coś innego. W Swift istnieje wiele standardowych atrybutów, które zostały wcześniej zdefiniowane. Na przykład:
- nazwa klucza:,
NSAttributedString.Key.font
wartość: aUIFont
- nazwa klucza:,
NSAttributedString.Key.foregroundColor
wartość: aUIColor
- nazwa klucza:,
NSAttributedString.Key.link
wartość: an NSURL
lubNSString
Jest wiele innych. Zobacz ten link, aby uzyskać więcej. Możesz nawet tworzyć własne atrybuty, takie jak:
nazwa klucza:, NSAttributedString.Key.myName
wartość: niektóre Wpisz.
jeśli zrobisz rozszerzenie :
extension NSAttributedString.Key {
static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
}
Tworzenie atrybutów w Swift
Możesz zadeklarować atrybuty, tak jak zadeklarowanie innego słownika.
// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// multiple attributes declared at once
let multipleAttributes: [NSAttributedString.Key : Any] = [
NSAttributedString.Key.foregroundColor: UIColor.green,
NSAttributedString.Key.backgroundColor: UIColor.yellow,
NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// custom attribute
let customAttribute = [ NSAttributedString.Key.myName: "Some value" ]
Zwróć uwagę, rawValue
że było to konieczne dla wartości stylu podkreślenia.
Ponieważ atrybuty są tylko Słownikami, możesz je również utworzyć, tworząc pusty Słownik, a następnie dodając do niego pary klucz-wartość. Jeśli wartość będzie zawierać wiele typów, musisz użyć jej Any
jako typu. Oto multipleAttributes
przykład z góry, odtworzony w ten sposób:
var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue
Przypisane ciągi
Teraz, gdy rozumiesz atrybuty, możesz tworzyć przypisane ciągi.
Inicjalizacja
Istnieje kilka sposobów tworzenia przypisywanych ciągów. Jeśli potrzebujesz tylko ciągu tylko do odczytu, możesz go użyć NSAttributedString
. Oto kilka sposobów na jego zainicjowanie:
// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)
Jeśli będziesz musiał później zmienić atrybuty lub treść ciągu, powinieneś użyć NSMutableAttributedString
. Deklaracje są bardzo podobne:
// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()
// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)
Zmiana przypisanego ciągu
Jako przykład, stwórzmy przypisany ciąg na górze tego postu.
Najpierw utwórz NSMutableAttributedString
nowy atrybut czcionki.
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )
Jeśli pracujesz dalej, ustaw przypisany ciąg na UITextView
(lub UILabel
) w następujący sposób:
textView.attributedText = myString
Państwo nie używaćtextView.text
.
Oto wynik:
Następnie dołącz kolejny przypisany ciąg, który nie ma żadnych ustawionych atrybutów. (Zauważ, że chociaż wcześniej let
deklarowałem myString
, nadal mogę go modyfikować, ponieważ jest to NSMutableAttributedString
. Wydaje mi się to dość szybkie i nie zdziwiłbym się, gdyby to się zmieniło w przyszłości. Zostaw mi komentarz, kiedy to nastąpi.)
let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)
Następnie wybierzemy słowo „Ciągi”, które zaczyna się od indeksu 17
i ma długość 7
. Zauważ, że jest to NSRange
szybki, a nie szybki Range
. (Zobacz tę odpowiedź, aby uzyskać więcej informacji na temat zakresów.) Ta addAttribute
metoda pozwala nam umieścić nazwę klucza atrybutu w pierwszym miejscu, wartość atrybutu w drugim miejscu, a zakres w trzecim miejscu.
var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)
Na koniec dodajmy kolor tła. Dla urozmaicenia zastosujmy addAttributes
metodę (zwróć uwagę na s
). Mógłbym dodać wiele atrybutów jednocześnie za pomocą tej metody, ale dodam tylko jeden ponownie.
myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)
Zauważ, że atrybuty nakładają się w niektórych miejscach. Dodanie atrybutu nie zastępuje już istniejącego atrybutu.
Związane z
Dalsza lektura
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue
textView.atrributedtText = myString
lubmyLabel.attributedText = myString
na początku swojej odpowiedzi. Jako początkujący właśnie to robiłemmyLabel.text
i nie sądziłem, że muszę przejść całą twoją odpowiedź. ** 3) ** Czy to oznacza, że możesz mieć tylko jedno,attributedText
czytext
posiadanie ich obu byłoby bez znaczenia? 4) I zaleca, aby również zawieraćlineSpacing
przykład jak ten w swojej odpowiedzi, ponieważ jest bardzo przydatna. 5) ачаар дахинappendAttributedString
jest jak „łączenie ciągów”.addAttribute
dodaje nowy atrybut do łańcucha.addAttribute
jest metodąNSMutableAttributedString
. Masz rację, że nie możesz go używać zString
lubNSAttributedString
. (SprawdźmyString
definicję w sekcji Zmiana ciągu przypisywanego tego postu. Myślę, że cię wyrzuciłem, ponieważ użyłem równieżmyString
nazwy zmiennej w pierwszej części postu, w której byłaNSAttributedString
.)Swift używa tego samego,
NSMutableAttributedString
co Obj-C. Utworzysz go, przekazując obliczoną wartość jako ciąg:Teraz utwórz przypisany
g
ciąg (heh). Uwaga:UIFont.systemFontOfSize(_)
jest teraz inicjalizatorem awaryjnym, dlatego należy go rozpakować, zanim będzie można go użyć:A następnie dodaj:
Następnie można ustawić UILabel, aby wyświetlał NSAttributString w następujący sposób:
źródło
//Part 1 Set Up The Lower Case g var coffeeText = NSMutableAttributedString(string:"\(calculateCoffee())") //Part 2 set the font attributes for the lower case g var coffeeTypeFaceAttributes = [NSFontAttributeName : UIFont.systemFontOfSize(18)] //Part 3 create the "g" character and give it the attributes var coffeeG = NSMutableAttributedString(string:"g", attributes:coffeeTypeFaceAttributes)
Gdy ustawiam UILabel.text = coffeeText, pojawia się błąd: „NSMutableAttributString nie można przekonwertować na„ String ”. Czy istnieje sposób, aby UILabel akceptował NSMutableAttributeString?Wersja Xcode 6 :
Wersja Xcode 9.3 :
Xcode 10, iOS 12, Swift 4 :
źródło
Swift 4:
źródło
Type 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
Gorąco polecam użycie biblioteki dla przypisywanych ciągów. To sprawia, że o wiele łatwiej, kiedy chcesz, na przykład, jeden ciąg z czterech różnych kolorach i czterech różnych czcionek. Oto mój ulubiony.Nazywa się SwiftyAttributes
Jeśli chcesz utworzyć ciąg z czterema różnymi kolorami i różnymi czcionkami za pomocą SwiftyAttributes:
finalString
pokazałby się jakoźródło
Swift: xcode 6.1
źródło
Najlepszym sposobem na podejście do atrybutowanych ciągów w systemie iOS jest użycie wbudowanego edytora tekstów przypisanych w narzędziu do tworzenia interfejsów i uniknięcie niepotrzebnego kodowania NSAtrortedStringKeys w plikach źródłowych.
Możesz później dynamicznie zastąpić placehoderls w czasie wykonywania, używając tego rozszerzenia:
Dodaj etykietę serii ujęć z przypisanym tekstem wyglądającym tak.
Następnie po prostu aktualizuj wartość za każdym razem, gdy potrzebujesz:
Pamiętaj, aby zapisać w initalAttributString oryginalną wartość.
Możesz lepiej zrozumieć to podejście, czytając ten artykuł: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e
źródło
let nsRange = NSRange(range,in:valueString)
linii.Swift 2.0
Oto próbka:
Swift 5.x
LUB
źródło
Działa dobrze w wersji beta 6
źródło
Stworzyłem narzędzie online, które rozwiąże twój problem! Możesz napisać swój ciąg i zastosować style graficznie, a narzędzie daje ci cel i szybki kod do wygenerowania tego ciągu.
Jest również open source, więc możesz go rozszerzyć i wysłać PR.
Narzędzie transformatora
Github
źródło
Swift 5 i wyżej
źródło
//Realizacja
źródło
Szybki 4
Musisz usunąć surową wartość w swift 4
źródło
Dla mnie powyższe rozwiązania nie działały podczas ustawiania określonego koloru lub właściwości.
To zadziałało:
źródło
Swift 2.1 - Xcode 7
źródło
Użyj tego przykładowego kodu. Jest to bardzo krótki kod, aby spełnić twoje wymagania. To działa dla mnie.
źródło
źródło
Atrybuty można ustawić bezpośrednio w szybkim 3 ...
Następnie użyj zmiennej w dowolnej klasie z atrybutami
źródło
Szybki 4.2
źródło
Detale
Rozwiązanie
Stosowanie
Pełny przykład
Wynik
źródło
Naprawdę łatwo będzie rozwiązać problem z biblioteką, którą utworzyłem. Nazywa się to Atributika.
Można go znaleźć tutaj https://github.com/psharanda/Atributika
źródło
źródło
Swifter Swift ma całkiem przyjemny sposób na zrobienie tego bez żadnej pracy. Po prostu podaj wzór, który powinien być dopasowany i jakie atrybuty go zastosować. Są świetne do wielu rzeczy, sprawdź je.
Jeśli masz wiele miejsc, w których byłoby to stosowane i chcesz, aby tak się stało tylko w określonych przypadkach, ta metoda nie zadziałałaby.
Możesz to zrobić w jednym kroku, po prostu łatwiej je odczytać po oddzieleniu.
źródło
Swift 4.x
źródło
Swift 3.0 // utwórz przypisany ciąg
Zdefiniuj atrybuty, takie jak
źródło
Proszę rozważyć użycie Prestyler
źródło
Szybki 5
źródło
}
// Użyj go jak poniżej
źródło