2015-03-24 43 views

Trả lời

45

Hầu hết các câu trả lời + ví dụ đều có trong ObjC, nhưng đây là cách thực hiện trong Swift.

let font:UIFont? = UIFont(name: "Helvetica", size:20) 
let fontSuper:UIFont? = UIFont(name: "Helvetica", size:10) 
let attString:NSMutableAttributedString = NSMutableAttributedString(string: "6.022*1023", attributes: [.font:font!]) 
attString.setAttributes([.font:fontSuper!,.baselineOffset:10], range: NSRange(location:8,length:2)) 
labelVarName.attributedText = attString 

này mang lại cho tôi:

SuperScript Example

Trong một lời giải thích chi tiết hơn:

  1. Nhận UIFont bạn muốn cho cả hai mặc định và phong cách superscript, superscript phải nhỏ.
  2. Tạo NSMutableAttributedString bằng chuỗi đầy đủ và phông chữ mặc định.
  3. Thêm thuộc tính vào các ký tự bạn muốn thay đổi (NSRange), với số nhỏ hơn/số đăng ký UIFont và giá trị NSBaselineOffsetAttributeName là số tiền bạn muốn bù trừ theo chiều dọc.
  4. Gán cho nó để UILabel

Hy vọng rằng điều này giúp các nhà phát triển Swift khác của bạn như tôi cần thiết này là tốt.

+0

Câu trả lời hoàn hảo, cảm ơn !! –

+0

Sự cố này xảy ra nếu Helvetica không có sẵn ở các kích thước điểm 10 hoặc 20. Ngay cả mã mẫu cũng phải được viết với một chút sửa lỗi. Ngoài ra các tên biến làm cho nó khó hiểu, và nó không biên dịch. –

5

Nếu bạn có thể nhận được cùng với văn bản mà không nhìn hoàn hảo, và chỉ cần một tập hợp con của các nhân vật, bạn có thể tận dụng các superscript unicode và số subscript: ⁰ ¹ ² ³ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ₀ ₁ 2 ₃ ₄ ₅ ₆ ₇ ₈ ₉ Điều này có lợi thế là ít cồng kềnh hơn nhiều.

+0

Một ưu điểm khác của điều này là khi bạn có nhiều dòng, điều này không gây rối với các đường thẳng khi chuyển đường cơ sở trong chuỗi được phân bổ. –

7

Là một cách tiếp cận khác nhau, tôi đã viết một hàm mang theo trong một chuỗi mà số mũ được prepended với ^ như 2^2•3•5^2 và trả 2²•3•5²

func exponentize(str: String) -> String { 

    let supers = [ 
     "1": "\u{00B9}", 
     "2": "\u{00B2}", 
     "3": "\u{00B3}", 
     "4": "\u{2074}", 
     "5": "\u{2075}", 
     "6": "\u{2076}", 
     "7": "\u{2077}", 
     "8": "\u{2078}", 
     "9": "\u{2079}"] 

    var newStr = "" 
    var isExp = false 
    for (_, char) in str.characters.enumerate() { 
     if char == "^" { 
      isExp = true 
     } else { 
      if isExp { 
       let key = String(char) 
       if supers.keys.contains(key) { 
        newStr.append(Character(supers[key]!)) 
       } else { 
        isExp = false 
        newStr.append(char) 
       } 
      } else { 
       newStr.append(char) 
      } 
     } 
    } 
    return newStr 
} 

Đó là một chút của một phương pháp brute force, nhưng nó hoạt động nếu bạn không muốn xử lý các chuỗi được phân bổ hoặc bạn muốn chuỗi của bạn độc lập với phông chữ.

4

Tôi đã viết phần mở rộng sau đây hoặc bạn có thể sử dụng nó làm chức năng, nó hoạt động tốt cho tôi. bạn có thể sửa đổi nó bằng cách bỏ qua những phần mà không phải là điều cần thiết để bạn

extension NSMutableAttributedString 
{ 
enum scripting : Int 
{ 
    case aSub = -1 
    case aSuper = 1 
} 

func characterSubscriptAndSuperscript(string:String, 
             characters:[Character], 
             type:scripting, 
             fontSize:CGFloat, 
             scriptFontSize:CGFloat, 
             offSet:Int, 
             length:[Int], 
             alignment:NSTextAlignment)-> NSMutableAttributedString 
{ 
    let paraghraphStyle = NSMutableParagraphStyle() 
    // Set The Paragraph aligmnet , you can ignore this part and delet off the function 
    paraghraphStyle.alignment = alignment 

    var scriptedCharaterLocation = Int() 
    //Define the fonts you want to use and sizes 
    let stringFont = UIFont.boldSystemFont(ofSize: fontSize) 
    let scriptFont = UIFont.boldSystemFont(ofSize: scriptFontSize) 
    // Define Attributes of the text body , this part can be removed of the function 
    let attString = NSMutableAttributedString(string:string, attributes: [NSFontAttributeName:stringFont,NSForegroundColorAttributeName:UIColor.black,NSParagraphStyleAttributeName: paraghraphStyle]) 

    // the enum is used here declaring the required offset 
    let baseLineOffset = offSet * type.rawValue 
    // enumerated the main text characters using a for loop 
    for (i,c) in string.characters.enumerated() 
    { 
     // enumerated the array of first characters to subscript 
     for (theLength,aCharacter) in characters.enumerated() 
     { 
      if c == aCharacter 
      { 
       // Get to location of the first character 
       scriptedCharaterLocation = i 
       //Now set attributes starting from the character above  
       attString.setAttributes([NSFontAttributeName:scriptFont, 
       // baseline off set from . the enum i.e. +/- 1   
       NSBaselineOffsetAttributeName:baseLineOffset, 
       NSForegroundColorAttributeName:UIColor.black], 
       // the range from above location 
     range:NSRange(location:scriptedCharaterLocation, 
     // you define the length in the length array 
     // if subscripting at different location 
     // you need to define the length for each one 
     length:length[theLength])) 

      } 
     } 
    } 
    return attString} 
    } 

ví dụ:

let attStr1 = NSMutableAttributedString().characterSubscriptAndSuperscript(
       string: "23 x 456", 
       characters:["3","5"], 
       type: .aSuper, 
       fontSize: 20, 
       scriptFontSize: 15, 
       offSet: 10, 
       length: [1,2], 
       alignment: .left) 

enter image description here

let attStr2 = NSMutableAttributedString().characterSubscriptAndSuperscript(
      string: "H2SO4", 
      characters: ["2","4"], 
      type: .aSub, 
      fontSize: 20, 
      scriptFontSize: 15, 
      offSet: 8, 
      length: [1,1], 
      alignment: .left) 

enter image description here

+0

Rất đẹp. Tôi mở rộng nó một chút bằng cách thêm tham số 'textColor'. Và thay thế 'UIFont.boldSystemFont' bằng' UIFont.systemFont'. – Isuru

+0

Tôi có thể xem phiên bản mở rộng của bạn @Isuru không? –

1

Đối với một đơn giản để sử dụng Swift giải pháp, bạn m ight muốn thanh toán HandyUIKit. Sau khi nhập nó vào dự án của bạn (ví dụ:qua Carthage - xem hướng dẫn trong README) bạn có thể làm một cái gì đó như thế này:

import HandyUIKit 

"6.022*10^{23}".superscripted(font: UIFont.systemFont(ofSize: 20, weight: .medium)) 

Dòng này sẽ trả về một NSAttributedString đó sẽ trông giống hệt như những gì bạn đang tìm kiếm. Chỉ cần gán cho nó đến một UILabel s attributedText thuộc tính và là xong!


Nếu bạn đang tìm kiếm subscripting một văn bản, chỉ cần sử dụng subscripted(font:) để thay thế. Nó sẽ nhận ra các cấu trúc như CO_{2}. Ngoài ra còn có superAndSubscripted(font:) nếu bạn muốn kết hợp cả hai.

Xem docs để biết thêm thông tin và ví dụ bổ sung.

+0

nhóm này cực kỳ tiện dụng. cảm ơn vì nó. –

0

Đây là phiên bản đơn giản có xử lý lỗi chính xác và sẽ biên dịch trong sân chơi.

import UIKit 

func setMyLabelText(myLabel: UILabel) { 
    if let largeFont = UIFont(name: "Helvetica", size: 20), let superScriptFont = UIFont(name: "Helvetica", size:10) { 
     let numberString = NSMutableAttributedString(string: "6.022*10", attributes: [.font: largeFont]) 
     numberString.append(NSAttributedString(string: "23", attributes: [.font: superScriptFont, .baselineOffset: 10])) 
     myLabel.attributedText = numberString 
    } 
} 

let myLabel = UILabel() 
setMyLabelText(myLabel: myLabel) 
Các vấn đề liên quan