2017-01-13 7 views
1

나는 항목 목록이 있으며 각 항목에는 레이블이 있습니다. mySearchBar.textmyLabel.text의 하위 문자열인지에 따라 테이블의 항목을 필터링하는 데 사용되는 검색 표시 줄도 있습니다.검색 문자열과 일치하는 문자열의 부분을 굵게 표시합니다.

모두 정상적으로 작동하지만 검색 문자열과 일치하는 레이블 텍스트의 부분을 굵게 표시하고 싶습니다.

최종 제품은 Google지도 검색과 비슷할 것입니다.

enter image description here

답변

2

는 여기에 내가 구현 결국 무엇의 샘플입니다 :

사용하는 대신
@IBOutlet weak var mySearchBar: UISearchBar! 
@IBOutlet weak var myLabel: UILabel! 

... 

func makeMatchingPartBold(searchText: String) { 

    // check label text & search text 
    guard 
     let labelText = myLabel.text, 
     let searchText = mySearchBar.text 
    else { 
     return 
    } 

    // bold attribute 
    let boldAttr = [NSFontAttributeName: UIFont.boldSystemFont(ofSize: myLabel.font.pointSize)] 

    // check if label text contains search text 
    if let matchRange: Range = labelText.lowercased().range(of: searchText.lowercased()) { 

     // get range start/length because NSMutableAttributedString.setAttributes() needs NSRange not Range<String.Index> 
     let matchRangeStart: Int = labelText.distance(from: labelText.startIndex, to: matchRange.lowerBound) 
     let matchRangeEnd: Int = labelText.distance(from: labelText.startIndex, to: matchRange.upperBound) 
     let matchRangeLength: Int = matchRangeEnd - matchRangeStart 

     // create mutable attributed string & bold matching part 
     let newLabelText = NSMutableAttributedString(string: labelText) 
     newLabelText.setAttributes(boldAttr, range: NSMakeRange(matchRangeStart, matchRangeLength)) 

     // set label attributed text 
     myLabel.attributedText = newNameText 
    } 
} 
+1

'.lowercased() 범위 (의 : searchText.lowercased()).'당신이 사용할 수 있습니다. " 범위 (of : searchText, 옵션 : .caseInsensitive) " – mholgate