2016-10-03 7 views
3

iOS 10의 Apple Activity 앱 (예 : 수면 분석) 또는 Fitbit 수면 추적에서 찾을 수있는 것처럼 iOS 앱에 속성 문자열로 타임 스탬프를 표시하려고합니다. 아래 이미지에서 알 수 있듯이 단위는 숫자보다 작습니다.iOS 10의 액티비티 앱에 표시된 것처럼 3 시간 32 분 같은 시간 간격으로 속성이 지정된 문자열을 만드는 방법은 무엇입니까?

시간 간격을 초 단위로 가정 해 봅시다.

DateComponentsFormatter을 사용하고 나서 localizedString(from:unitsStyle:)을 사용하여 문자열을 가져 오는 것으로 생각했습니다. 하지만이 문자열을 단위를 작게하고 글꼴 색이 다른 속성으로 변환하는 방법을 모르겠습니다.

또한 NSMeasurement + NSUnitDuration을 사용하려고 생각한 다음 NSMeasurementFormatter을 사용하여 측정을 문자열로 바꿉니다. 그러나 나는 동일한 문제, 즉 인물과 그림을 어떻게 분리 할 것인가?

물론 이것은 모든 언어와 로케일에서 작동합니다. 이상적인 것은 숫자와 단위를 추출하고 숫자와 "순수한"문자열의 다른 범위에 다른 스타일을 적용하는 것입니다. 이것이 어떻게 풀릴 수 있는지 어떤 생각?

enter image description here

+2

이 있습니다 NSAttributedString은 형식이 지정된 문자열의 숫자 범위를 찾아 특성 문자열의 해당 부분에 특성을 적용하여 만들어야합니다. – rmaddy

+0

숫자의 범위는 어떻게 알 수 있습니까? 이것이 당신의 대답의 열쇠입니다. – alpennec

답변

3

는 UILabel의에 .attributedText 속성이 있습니다. 이 같은 텍스트를 만들어야합니다 :

let hoursNumber = 6 
    let hoursUnit = "h" 
    let minutesNumber = 40 
    let minutesUnit = "m" 
    let numberFont = [ NSFontAttributeName: UIFont.systemFont(ofSize: 20) ] 
    let unitFont = [ NSFontAttributeName: UIFont.systemFont(ofSize: 14) ] 
    let timeString = NSMutableAttributedString(string: "\(hoursNumber)", attributes: numberFont) 
    timeString.append(NSAttributedString(string: hoursUnit, attributes: unitFont)) 
    timeString.append(NSAttributedString(string: "\(minutesNumber)", attributes: numberFont)) 
    timeString.append((NSAttributedString(string: minutesUnit, attributes: unitFont))) 

그런 다음 설정 당신이 timeLabel.attributedText = TIMESTRING

편집이 ..., 까다 롭고 까다 롭고 )

let formatter = DateComponentsFormatter() 
    formatter.allowedUnits = [.hour, .minute] 
    formatter.unitsStyle = .abbreviated 
    formatter.zeroFormattingBehavior = .pad 
    let unitFont = [NSFontAttributeName: UIFont.systemFont(ofSize: 14)] 
    let numberFont = [NSFontAttributeName: UIFont.systemFont(ofSize: 22)] 
    let time = formatter.string(from: 300) 
    let timeString = NSMutableAttributedString() 
    for letter in time!.unicodeScalars { 
     let timeLetter : NSAttributedString 
     if CharacterSet.decimalDigits.contains(letter) { 
      timeLetter = NSAttributedString(string: "\(letter)", attributes: numberFont) 
     } else { 
      timeLetter = NSAttributedString(string: "\(letter)", attributes: unitFont) 
     } 
     timeString.append(timeLetter) 
    } 
+1

그래, 잘 지워졌어. 이건 아무것도 아니지만 완벽 해. –

+0

답변을 주셔서 감사합니다. @zig하지만 장치가 하드 코딩되어 있고 형식이 장치의 로케일을 고려하지 않았으므로 이상적이지 않습니다. – alpennec

+0

편집 해 주셔서 감사합니다! 실제로 CharacterSet을 살펴 보았습니다. decimalDigits에 아랍어, 일본어, 한국어 등도 포함되어 있는지 알고 계십니까? 숫자에 대한 문자는 무엇입니까? 귀하의 "if"조건으로 해당 문자가 숫자인지 또는 이들 언어에서 작동하지 않는지 확인하십시오. 감사! – alpennec