Tôi muốn UILabel hiển thị văn bản theo cách sau 6.022 * 10 . Những gì fumctions nhanh chóng có cho subscript và superscript?Cách sử dụng subscript và superscript trong Swift
Trả lời
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:
Trong một lời giải thích chi tiết hơn:
- Nhận
UIFont
bạn muốn cho cả hai mặc định và phong cách superscript, superscript phải nhỏ. - Tạo
NSMutableAttributedString
bằng chuỗi đầy đủ và phông chữ mặc định. - 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. - 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.
Câu trả lời hoàn hảo, cảm ơn !! –
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. –
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.
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ổ. –
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ữ.
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)
let attStr2 = NSMutableAttributedString().characterSubscriptAndSuperscript(
string: "H2SO4",
characters: ["2","4"],
type: .aSub,
fontSize: 20,
scriptFontSize: 15,
offSet: 8,
length: [1,1],
alignment: .left)
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
Tôi có thể xem phiên bản mở rộng của bạn @Isuru không? –
Đố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.
nhóm này cực kỳ tiện dụng. cảm ơn vì nó. –
Đâ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)
- 1. subscript và superscript trong ylab của qplot [R]
- 2. kCTSuperscriptAttributeName không hoạt động cho việc sử dụng subscript và superscript
- 3. superscript/subscript trong nhãn cho gnuplot đọc từ tệp dữ liệu
- 4. Cách sử dụng sub và superscript trong văn bản Mathematica, ví dụ: công thức hóa học?
- 5. Truy cập NSCache thông qua subscript trong Swift 3
- 6. Tạo một superscript trong mtext
- 7. Swift 3 JSON NSFastEnumerationIterator không có thành viên subscript
- 8. Swift 3 Loại 'Any' không có thành viên subscript
- 9. Cách sử dụng JSTileMap trong swift
- 10. Swift: Cách sử dụng sizeof?
- 11. Cách sử dụng bộ nhớ trong Swift
- 12. Cách sử dụng addAttribute trong Swift
- 13. Cách sử dụng dispatch_queue_create trong Swift 2.0?
- 14. Cách sử dụng kCTSuperscriptAttributeName?
- 15. Nằm ở trên của superscript trong WPF
- 16. Sử dụng AudioBufferList với Swift
- 17. Sử dụng UIBezierPath: byRoundingCorners: với Swift 2 và Swift 3
- 18. sử dụng nhập nhằng của subscript xcode 7.1
- 19. Sử dụng thẻ trong Swift
- 20. Sử dụng Predicate trong Swift
- 21. Nhập 'Bất kỳ' Không có Thành viên Subscript nào trong xcode 8 Swift 3
- 22. Làm thế nào để sử dụng đồng thời superscript và biến trong một nhãn trục với ggplot2
- 23. FUITableViewDataSource mới - cách sử dụng? Swift 3
- 24. Bị kẹt khi sử dụng MKPinAnnotationView() trong Swift và MapKit
- 25. Tham chiếu mơ hồ đến 'subscript' của thành viên trong Swift 3
- 26. Cách sử dụng đúng CFNotificationCenterAddObserver trong Swift cho iOS
- 27. Cách sử dụng tùy chọn ràng buộc trong Swift 2
- 28. Cách sử dụng URLSession với Proxy trong Swift 3
- 29. cách sử dụng chặn/đóng cửa trong swift
- 30. Sử dụng CGPathContainsPoint SWIFT
Xem http://stackoverflow.com/questions/8555735/how-to-make-subscripts-and-superscripts-using-nsattributedstring. –