2016-08-03 64 views
8

Chcę dostać się do białych przestrzeni z przodu i na końcu mojego NSAttributedString (przycinanie). Nie mogę po prostu przekształcić go w ciąg i przycinać, ponieważ są w nim obrazy (załączniki). Jak mogę to zrobić?Swift NSAttributedString Trim

+1

https://github.com/ovenbits/ Alexandria/blob/master/Sources/NSAttributedString% 2BExtensions.swift? Jeśli szukasz NSAttributedString i Trim w wyszukiwarce, masz kilka rozwiązań, one nie działają? – Larme

+0

dziękuję Larme, ten projekt github jest naprawdę pomocny! –

Odpowiedz

17

Utwórz rozszerzenie NSAttributedString jak poniżej.

extension NSAttributedString { 
    public func attributedStringByTrimmingCharacterSet(charSet: NSCharacterSet) -> NSAttributedString { 
     let modifiedString = NSMutableAttributedString(attributedString: self) 
     modifiedString.trimCharactersInSet(charSet) 
     return NSAttributedString(attributedString: modifiedString) 
    } 
} 

extension NSMutableAttributedString { 
    public func trimCharactersInSet(charSet: NSCharacterSet) { 
     var range = (string as NSString).rangeOfCharacterFromSet(charSet) 

     // Trim leading characters from character set. 
     while range.length != 0 && range.location == 0 { 
      replaceCharactersInRange(range, withString: "") 
      range = (string as NSString).rangeOfCharacterFromSet(charSet) 
     } 

     // Trim trailing characters from character set. 
     range = (string as NSString).rangeOfCharacterFromSet(charSet, options: .BackwardsSearch) 
     while range.length != 0 && NSMaxRange(range) == length { 
      replaceCharactersInRange(range, withString: "") 
      range = (string as NSString).rangeOfCharacterFromSet(charSet, options: .BackwardsSearch) 
     } 
    } 
} 

i używać w viewController, gdzie chcesz użyć. jak to

let attstring = NSAttributedString(string: "this is test message. Please wait.     ") 
let result = attstring.attributedStringByTrimmingCharacterSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) 
+0

Thx, właśnie tego chciałem !!!! –

+0

Twoje powitanie :) –

+0

Przyjemne rozwiązanie :) – chrysAllwood

-2

Poniższy kod będzie działał zgodnie z Twoimi wymaganiami.

var attString: NSAttributedString = NSAttributedString(string: " this is att string") 

let trimmedString = attString.string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) 
+0

Jak dokładnie mogę uzyskać zasięg? –

+0

spróbuj powyższego kodu, aby usunąć przedni i końcowy obszar z przypisanego ciągu znaków. – macpandit

+0

Powyższy kod działa poprawnie. ale zwróci ci 'String', a nie' NSAttributedString'. musisz tylko przekonwertować 'String' na' NSAttributedString', że to. ładne dwie linijki kodu. –

1

Zrobiłem szybką realizację 3, tylko w przypadku gdy ktoś jest zainteresowany:

/** 
Trim an attributed string. Can for example be used to remove all leading and trailing spaces and line breaks. 
*/ 
public func attributedStringByTrimmingCharactersInSet(set: CharacterSet) -> NSAttributedString { 
    let invertedSet = set.inverted 
    let rangeFromStart = string.rangeOfCharacter(from: invertedSet) 
    let rangeFromEnd = string.rangeOfCharacter(from: invertedSet, options: .backwards) 
    if let startLocation = rangeFromStart?.upperBound, let endLocation = rangeFromEnd?.lowerBound { 
     let location = string.distance(from: string.startIndex, to: startLocation) - 1 
     let length = string.distance(from: startLocation, to: endLocation) + 2 
     let newRange = NSRange(location: location, length: length) 
     return self.attributedSubstring(from: newRange) 
    } else { 
     return NSAttributedString() 
    } 
} 
0

Swift 3.2 Wersja:

extension NSAttributedString { 
    public func trimmingCharacters(in characterSet: CharacterSet) -> NSAttributedString { 
     let modifiedString = NSMutableAttributedString(attributedString: self) 
     modifiedString.trimCharacters(in: characterSet) 
     return NSAttributedString(attributedString: modifiedString) 
    } 
} 

extension NSMutableAttributedString { 
    public func trimCharacters(in characterSet: CharacterSet) { 
     var range = (string as NSString).rangeOfCharacter(from: characterSet) 

     // Trim leading characters from character set. 
     while range.length != 0 && range.location == 0 { 
      replaceCharacters(in: range, with: "") 
      range = (string as NSString).rangeOfCharacter(from: characterSet) 
     } 

     // Trim trailing characters from character set. 
     range = (string as NSString).rangeOfCharacter(from: characterSet, options: .backwards) 
     while range.length != 0 && NSMaxRange(range) == length { 
      replaceCharacters(in: range, with: "") 
      range = (string as NSString).rangeOfCharacter(from: characterSet, options: .backwards) 
     } 
    } 
}