Chuỗi thuộc tính có phông chữ tùy chỉnh trong bảng phân cảnh không tải chính xác


100

Chúng tôi đang sử dụng phông chữ tùy chỉnh trong dự án của mình. Nó hoạt động tốt trong Xcode 5. Trong Xcode 6, nó hoạt động ở dạng văn bản thuần túy, chuỗi phân bổ trong mã. Nhưng các chuỗi phân bổ đó được đặt trong bảng phân cảnh đều hoàn nguyên về Helvetica khi chạy trên trình mô phỏng hoặc thiết bị, mặc dù chúng trông hoàn toàn ổn trong bảng phân cảnh.

Tôi không chắc đó là lỗi của SDK Xcode 6 hoặc iOS 8 hay cách sử dụng phông chữ tùy chỉnh bị thay đổi trong Xcode 6 / iOS 8?


Cùng một vấn đề ở đây. Rất thích biết chuyện gì đang xảy ra.
obeattie

1
Hiện tại, chúng tôi đã tạo UILabel tùy chỉnh, có tên là GLMarkdownLabel và xuất một số thuộc tính với IBInspectable, sau đó đặt các chuỗi đánh dấu trong bảng phân cảnh và dịch các chuỗi đánh dấu trở lại các chuỗi được phân bổ khi đánh thức từ nib.
Allen Hsu

Bây giờ nó là một giải pháp lâu dài, hy vọng Apple sẽ sửa lỗi này trong phiên bản tiếp theo của Xcode.
Allen Hsu

Rất tiếc, thật tồi tệ. Cảm ơn bạn đã cho chúng tôi biết đây không phải là vấn đề riêng lẻ. Có radar không?
obeattie

1
Cách giải quyết của chúng tôi cuối cùng là quay lại sử dụng IBCustomFonts cho các nhãn được phân bổ của chúng tôi.
yonix

Câu trả lời:


30

Cách khắc phục đối với tôi là sử dụng một IBDesignablelớp:

import UIKit

@IBDesignable class TIFAttributedLabel: UILabel {

    @IBInspectable var fontSize: CGFloat = 13.0

    @IBInspectable var fontFamily: String = "DIN Light"

    override func awakeFromNib() {
        var attrString = NSMutableAttributedString(attributedString: self.attributedText)
        attrString.addAttribute(NSFontAttributeName, value: UIFont(name: self.fontFamily, size: self.fontSize)!, range: NSMakeRange(0, attrString.length))
        self.attributedText = attrString
    }
}

Cung cấp cho bạn điều này trong Trình tạo giao diện:

Phông chữ tùy chỉnh của Trình tạo giao diện với chuỗi phân bổ

Bạn có thể thiết lập chuỗi phân bổ của mình giống như bình thường, nhưng bạn sẽ phải đặt lại kích thước phông chữ và họ phông chữ trong các thuộc tính mới có sẵn.

Vì Trình tạo giao diện đang làm việc với phông chữ tùy chỉnh theo mặc định, điều này dẫn đến những gì bạn thấy là những gì bạn nhận được , điều mà tôi thích hơn khi xây dựng ứng dụng.

Ghi chú

Lý do tôi sử dụng cái này thay vì chỉ là phiên bản thuần túy là tôi đang đặt các thuộc tính trên nhãn được phân bổ như khoảng cách dòng, không có sẵn khi sử dụng kiểu đơn giản.


1
Giải pháp của bạn chỉ hỗ trợ một họ phông chữ và kích thước cho một nhãn, vậy tại sao không chỉ sử dụng văn bản thuần túy thay thế?
Allen Hsu

Tương tự, chúng tôi @IBInspectabletạm thời sử dụng các thuộc tính, thay vì phông chữ và kích thước. Chúng tôi có một thuộc markdownTexttính, vì hầu hết thời gian, chúng tôi sử dụng chuỗi phân bổ cho văn bản in đậm hoặc gạch chân. Sau đó, phân tích cú pháp văn bản đánh dấu thành chuỗi phân bổ với thông tin phông chữ và kích thước được đặt cho văn bản thuần túy.
Allen Hsu

@AllenHsu, bạn nói đúng. Không đề cập đến điều đó, nhưng tôi đang sử dụng khoảng cách dòng được quy cho nhãn của mình. Offcourse, nếu không bạn sẽ chỉ cần sử dụng phong cách đơn giản :)
Antoine

điểm tốt, chúng tôi cũng đã xuất lineSpacing: p Tôi nghĩ tôi sẽ chấp nhận câu trả lời của bạn vì nó thực sự là một lỗi trong Xcode và không có giải pháp nào tốt hơn cho bây giờ. Hãy cùng chờ đợi phiên bản tiếp theo của Xcode.
Allen Hsu

2
Sẽ không làm việc này nếu tôi muốn một phần in đậm của văn bản
xtrinch

28

Câu trả lời đơn giản nhất hiệu quả là kéo các phông chữ vào FontBook. Nếu các phông chữ có trong dự án của bạn nhưng không có trong FontBook của máy tính, IB đôi khi gặp khó khăn khi tìm kiếm nó. Kỳ lạ, nhưng đã làm việc cho tôi nhiều lần.


17
Mặc dù điều này sẽ cho phép Xcode chọn phông chữ tùy chỉnh, nhưng nó không thực sự hoạt động. Trong thời gian chạy, phông chữ sẽ không được sử dụng như bạn mong đợi.
Daniel

Rất tiếc, tôi không thể đưa ra giải pháp thay thế. Điều tốt nhất tôi có thể làm là ghi lại lỗi với Apple.
Daniel

Vâng, đây là bản sửa lỗi. Tôi đã có bảng phân cảnh của mình được thiết kế bởi một nhà phát triển khác, cập nhật svn ok, nhưng không bao giờ có phông chữ trong giao diện người dùng. Phông chữ có trong tài nguyên nhưng không được hiển thị trong giao diện người dùng thiết bị / trình mô phỏng. Vì anh ấy sử dụng chuỗi phân bổ, tôi phải có nó trong Font Book. Điều đó giải quyết vấn đề.
karim

Đúng. điều này giúp tôi giải quyết vấn đề tương tự. Khi tôi thêm phông chữ tùy chỉnh vào sách phông chữ, mọi thứ hoạt động như một sự quyến rũ.
Sushant Jagtap

1
Trong khi giải pháp này hoạt động trên một số trường hợp, tôi cũng gặp phải vấn đề tương tự như @Daniel trong cùng một dự án với cùng họ phông chữ. XCode cần giải quyết vấn đề này.
dey.shin

16

Bạn có thể thêm phông chữ tùy chỉnh vào sách phông chữ.

Bước 1 : Nhấp vào quản lý phông chữ. Nó mở cuốn sách phông chữ.

nhập mô tả hình ảnh ở đây

Bước 2 : Nhấp vào dấu cộng và thêm phông chữ của bạn.

nhập mô tả hình ảnh ở đây

Lần tiếp theo khi bạn nhấp vào phông chữ có văn bản phân bổ, phông chữ mới được thêm vào cũng sẽ hiển thị trong danh sách. Nhưng hãy đảm bảo rằng phông chữ tùy chỉnh của bạn được thêm vào info.plist và tài nguyên gói.


Việc làm này trong kịch bản nhưng sau khi chạy nó không hiển thị các định dạng
Văn

1
Định dạng @Van? Bạn có thể vui lòng cho tôi biết thêm được không? Khi nó không hoạt động?
mahbaleshwar hegde

Tôi phải đặt văn bản được kết hợp giữa phông chữ rgualr và đậm. Tôi đã sử dụng giải pháp ở trên, vì vậy nó hoạt động trong bảng phân cảnh nhưng khi tôi chạy ứng dụng, nhãn không hiển thị phông chữ được áp dụng thay vào đó nó hiển thị phông chữ hệ thống
Van

Bạn có thêm phông chữ tùy chỉnh của bạn trong info.plist Sau đó chỉ cần in tất cả các gia đình phông chữ?
Mahabaleshwar Hegde

2
Đúng. Tôi có thể đặt phông chữ tùy chỉnh trên tất cả các ứng dụng trong trường hợp văn bản thuần túy, tôi cần đặt cho văn bản được quy
Văn

5

Nhờ chủ đề này, tôi đã đi đến giải pháp này:

private let fontMapping = [
    "HelveticaNeue-Medium": "ITCAvantGardePro-Md",
    "HelveticaNeue": "ITCAvantGardePro-Bk",
    "HelveticaNeue-Bold": "ITCAvantGardePro-Demi",
]

func switchFontFamily(string: NSAttributedString) -> NSAttributedString {
    var result = NSMutableAttributedString(attributedString: string)
    string.enumerateAttribute(NSFontAttributeName, inRange: NSRange(location: 0, length: string.length), options: nil) { (font, range, _) in
        if let font = font as? UIFont {
            result.removeAttribute(NSFontAttributeName, range: range)
            result.addAttribute(NSFontAttributeName, value: UIFont(name: fontMapping[font.fontName]!, size: font.pointSize)!, range: range)
        }
    }
    return result
}

1
Ý kiến ​​hay. Thật sự không thể tin được điều này lại xảy ra ở Apple. Kinh ngạc.
Fattie,

4

Giải pháp của tôi là một chút công việc xung quanh. Giải pháp thực sự dành cho apple là sửa Interface Builder.

Với nó, bạn có thể đánh dấu tất cả văn bản in đậm và nghiêng trong trình tạo giao diện bằng cách sử dụng phông chữ hệ thống, sau đó trong thời gian chạy hiển thị phông chữ tùy chỉnh của bạn. Có thể không phải là tối ưu trong mọi trường hợp.

 NSMutableAttributedString* ApplyCustomFont(NSAttributedString *attributedText,
                     UIFont* boldFont,
                     UIFont* italicFont,
                     UIFont* boldItalicFont,
                     UIFont* regularFont)
{

    NSMutableAttributedString *attrib = [[NSMutableAttributedString alloc] initWithAttributedString:attributedText];
    [attrib beginEditing];
    [attrib enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, attrib.length) options:0
                    usingBlock:^(id value, NSRange range, BOOL *stop)
    {
        if (value)
        {
            UIFont *oldFont = (UIFont *)value;
            NSLog(@"%@",oldFont.fontName);

            [attrib removeAttribute:NSFontAttributeName range:range];

            if([oldFont.fontName rangeOfString:@"BoldItalic"].location != NSNotFound && boldItalicFont != nil)
                [attrib addAttribute:NSFontAttributeName value:boldItalicFont range:range];
            else if([oldFont.fontName rangeOfString:@"Italic"].location != NSNotFound && italicFont != nil)
                [attrib addAttribute:NSFontAttributeName value:italicFont range:range];
            else if([oldFont.fontName rangeOfString:@"Bold"].location != NSNotFound && boldFont != nil)
                [attrib addAttribute:NSFontAttributeName value:boldFont range:range];
            else if(regularFont != nil)
                [attrib addAttribute:NSFontAttributeName value:regularFont range:range];
        }
    }];
    [attrib endEditing];

    return attrib;
}

Lấy cảm hứng từ bài đăng này


4

Tôi đã phải vật lộn với lỗi này: UILabel hiển thị chính xác trong IB với phông chữ tùy chỉnh nhưng không hiển thị chính xác trên thiết bị hoặc trình mô phỏng (phông chữ được bao gồm trong dự án và được sử dụng trong UILabels đơn giản).

Cuối cùng đã tìm thấy Trình tạo chuỗi thuộc tính trên (Mac) App Store. Tạo mã để đặt trong ứng dụng của bạn ở vị trí thích hợp. Tuyệt diệu. Tôi không phải là người sáng tạo, chỉ là một người dùng vui vẻ.


3

Gặp vấn đề tương tự: phông chữ thuộc tính được đặt cho TextView trong bảng phân cảnh không hoạt động trong thời gian chạy với SDK XCode 6.1 & iOS 8.

Đây là cách tôi giải quyết vấn đề này, có thể là một giải pháp cho bạn:

  1. mở trình kiểm tra thuộc tính của chế độ xem văn bản của bạn, thay đổi văn bản thành "Đồng bằng"

  2. nhấp vào dấu thập để xóa "wC hR" (màu đỏ bên dưới)

    nhập mô tả hình ảnh ở đây

  3. thay đổi văn bản thành "Thuộc tính", sau đó bạn có thể đặt phông chữ và kích thước cho văn bản của mình.

  4. chạy để kiểm tra xem nó có hoạt động không

Có vẻ như theo mặc định không có thuộc wC hRtính nào được đặt, UILabelcũng không UITextView.
Allen Hsu,

bằng xcode 6, bạn đã đặt một loại chiều cao-chiều rộng khác, như "Chiều rộng thông thường | Chiều cao bất kỳ", "Chiều rộng nhỏ gọn | Chiều cao thông thường"? bởi vì tôi có một dự án được phát triển bằng Xcode 5 và chế độ xem văn bản được phân bổ của nó đang hoạt động ngay cả với iOS 8 SDK, tôi đã kiểm tra cài đặt ở đó và nhận thấy sự khác biệt duy nhất là Xcode 6 cho phép người dùng đặt phông chữ cho các kích thước khác nhau của thiết bị nếu bạn đặt văn bản trong "Trơn". Cấu hình mới này có thể là lý do tại sao đặt văn bản trong "do" nhưng phông chữ không hoạt động.
Zhihao Yang

1
bạn đang sử dụng phông chữ tùy chỉnh? Ý tôi là những cái tự nhúng, không phải phông chữ hệ thống.
Allen Hsu,

Aha, tôi nghĩ phông chữ "Tùy chỉnh" mà bạn đề cập là phông chữ được cung cấp bởi Xcode với điều kiện nó có phông chữ "Hệ thống".
Zhihao Yang,

Nó không làm việc cho tôi. Nó hoạt động cho chuỗi bình thường nhưng không hoạt động cho chuỗi phân bổ.
Pratik Somaiya


2

Hãy thử nó sẽ hoạt động

Trong trường hợp của tôi khi tôi cố gắng đặt "Công nghệ Silversky" làm Văn bản thuộc tính cho nhãn từ trình tạo giao diện, nó không hiển thị khi tôi chạy trong trình mô phỏng nhưng hiển thị trong trình tạo giao diện. Vì vậy, tôi đã sử dụng một thủ thuật là tạo phông chữ Silversky với 1 pixel lớn hơn sau đó là văn bản Công nghệ.

Văn bản thuộc tính có vấn đề với cùng kích thước phông chữ vì vậy thay đổi kích thước của 1 từ, điều này làm việc với tôi.

Có thể đây là lỗi xcode nhưng thủ thuật này phù hợp với tôi.


1

Vấn đề giống nhau.

Đã giải quyết: Chỉ cần chọn Có thể chọn trong TextView. Nếu không có điều này, tôi có phông chữ Hệ thống tiêu chuẩn.


1

Nhấp đúp và cài đặt phông chữ vào hệ thống. Nó sẽ hoạt động (Xcode 8.2)


1
Tôi ước nó sẽ. Nó không hoạt động với tôi với FontAwesome.
Peter DeWeese

1

Giải pháp @Hamidptb hoạt động, hãy đảm bảo có được tên chính xác của phông chữ (khi bạn đã thêm nó vào Font Book)

  • Mở ứng dụng Font Book, điều hướng đến phông chữ của bạn rồi nhấn Command + I. Tên PostScript là tên phông chữ bạn muốn sử dụng ở đây:

    UILabel.appearance (). Font = UIFont (tên: " PostScriptName ", kích thước: 17)


0

Tôi đang cố lấy các ô tableView với văn bản có nhiều đoạn văn. Các chuỗi được phân bổ dường như là một cách để có thêm khoảng cách giữa các đoạn văn (một cái gì đó đẹp hơn một chút so với việc thực hiện hai dòng cấp dữ liệu trong chuỗi). Xem qua bài viết này và các bài viết khác khi tôi phát hiện ra rằng cài đặt IB không áp dụng tại thời điểm chạy khi bạn muốn đặt văn bản khác vào ô.

Điều chính tôi nghĩ ra là thêm một phần mở rộng vào String (sử dụng Swift) để tạo một chuỗi được phân bổ với các đặc điểm nhất định. Ví dụ ở đây sử dụng phông chữ Marker Felt, vì nó có thể dễ dàng phân biệt với Helvetica. Ví dụ cũng cho thấy một chút khoảng cách giữa các đoạn văn để làm cho chúng khác biệt với nhau hơn.

extension String {
func toMarkerFelt() -> NSAttributedString {
    var style = NSMutableParagraphStyle()
    style.paragraphSpacing = 5.0
    let markerFontAttributes : [NSObject : AnyObject]? = [
        NSFontAttributeName : UIFont(name: "Marker Felt", size: 14.0)!,
        NSParagraphStyleAttributeName: style,
        NSForegroundColorAttributeName : UIColor.blackColor()
    ]
    let s = NSAttributedString(string: self, attributes: markerFontAttributes)
    return s
    }
}

Sau đó, trong tableViewCell tùy chỉnh của tôi, bạn gửi cho nó văn bản bạn muốn và nó chuyển đổi nó thành một chuỗi phân bổ trên UILabel.

//  MarkerFeltCell.swift
class MarkerFeltCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
func configureCellWithString(inputString : String) {
    myLabel.attributedText = inputString.toMarkerFelt()
}}

Trong bộ điều khiển chế độ xem với tableView, bạn nên đăng ký ô của mình trong viewDidLoad () - Tôi đã sử dụng một nib, vì vậy một cái gì đó như:

let cellName = "MarkerFeltCell"
tableView.registerNib(UINib(nibName: cellName, bundle: nil), forCellReuseIdentifier: cellName)

Để giúp ô tìm ra chiều cao của nó, hãy tạo một ô nguyên mẫu dùng để lấy thông tin kích thước và không bao giờ được thêm vào tableView. Vì vậy, trong các biến của bộ điều khiển chế độ xem của bạn:

var prototypeSummaryCell : MarkerFeltCell? = nil

Sau đó, trong (có thể ghi đè - tùy thuộc vào bộ điều khiển chế độ xem của bạn) heightForRowAtIndexPath:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // ...
    if xib == "MarkerFeltCell" {
            if prototypeCell == nil {
                prototypeCell = tableView.dequeueReusableCellWithIdentifier(xib) as? MarkerFeltCell
            }
            let width : CGFloat = tableView.bounds.width
            let height : CGFloat = prototypeCell!.bounds.height
            prototypeCell?.bounds = CGRect(x: 0, y: 0, width: width, height: height)
            configureCell(prototypeCell!, atIndexPath: indexPath)
            prototypeSummaryCell?.layoutIfNeeded()
            let size = prototypeSummaryCell!.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
            let nextHeight : CGFloat = ceil(size.height + 1.0)
            return nextHeight
    } else {  // ...

Trong đoạn mã trên, prototypeCell sẽ được điền vào lần đầu tiên nó cần. Sau đó, prototypeCell được sử dụng để tìm ra chiều cao cho ô sau khi trải qua quá trình tự động kích thước. Bạn sẽ cần làm tròn chiều cao bằng hàm ceil (). Tôi cũng đã thêm vào một số yếu tố fudge bổ sung.

Bit mã cuối cùng là cách bạn định cấu hình văn bản cho ô. Đối với ví dụ này, chỉ cần:

func configureCell(cell :UITableViewCell, atIndexPath indexPath: NSIndexPath) {
    if let realCell = cell as? MarkerFeltCell  {
        realCell.configureCellWithString("Multi-line string.\nLine 2.\nLine 3.")    // Use \n to separate lines
    }
}

Ngoài ra, đây là một shot của ngòi bút. Đã ghim nhãn vào các cạnh của ô (với lề mong muốn), nhưng sử dụng ràng buộc "Lớn hơn hoặc Bằng", với mức ưu tiên nhỏ hơn "Bắt buộc" cho ràng buộc dưới cùng.

Ràng buộc ô

Đặt phông chữ của nhãn thành Thuộc tính. Phông chữ IB thực tế không thành vấn đề.

LabelFont

Kết quả trong trường hợp này:

CellResults


0

Trong trường hợp chuỗi phân bổ, bạn có thể thêm phông chữ tùy chỉnh trong danh sách phông chữ như - Nhấp vào biểu tượng phông chữ, hộp thoại này sẽ hiển thị hộp thoại sau. Trong hộp thoại sau, bạn có thể thêm danh mục của riêng mình hoặc danh mục hiện có cho phông chữ tùy chỉnh. hộp thoại phông chữ phân bổ

Sau khi nhấp vào Quản lý Phông chữ, nó sẽ mở hộp thoại sau chọn danh mục bạn đã tạo hoặc hiện có. Bấm vào dấu + để thêm phông chữ vào danh mục. Quản lý hộp thoại phông chữ


0

đó là một niềm vui đơn giản và nhanh chóng và đó là hiệu quả trong trường hợp của tôi. giải pháp đó là thêm một dòng mã trong chức năng didFinishLaunchingWithOptions trong tệp AppDelegate.swift:

cho textViews :

UITextView.appearance().font = UIFont(name: "IranSans", size: 17)

cho nhãn :

UILabel.appearance().font = UIFont(name: "IranSans", size: 17)

và phần còn lại của UiView như hai điều này ☝️


0

Đối với bất kỳ ai áp dụng phông chữ tùy chỉnh cho chuỗi phân bổ trong mã: Hãy thử đặt nó vào viewDidLayoutSubviews. Sai lầm của tôi đã làm ở viewDidLoadđó, nó sẽ không được áp dụng ở đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.