Film şeridinde özel yazı tiplerine sahip ilişkilendirilmiş dize doğru yüklenmiyor


100

Projemizde özel yazı tipleri kullanıyoruz. Xcode 5'te iyi çalışır. Xcode 6'da düz metin olarak, kodda atıfta bulunulan dizede çalışır. Ancak film şeridinde ayarlanan bu ilişkilendirilmiş dizelerin tümü, film şeridinde iyi görünmelerine rağmen, simülatör veya cihazda çalışırken Helvetica'ya geri döner.

Bunun bir Xcode 6 veya iOS 8 SDK hatası olup olmadığından veya Xcode 6 / iOS 8'de özel yazı tiplerini kullanma yönteminin değiştiğinden emin değilim?


Burada da aynı problem. Ne olduğunu bilmek isterim.
obeattie

1
Şimdilik, GLMarkdownLabel adlı özel bir UILabel oluşturduk ve IBInspectable ile bazı özellikleri dışa aktardık, ardından film şeridinde işaretleme dizelerini belirledik ve uçtan uyandığında işaretleme dizelerini atıfta bulunulan dizelere geri çevirdik.
Allen Hsu

Artık uzun vadeli bir çözüm, umarız Apple bu hatayı Xcode'un bir sonraki sürümünde düzeltecektir.
Allen Hsu

Yikes, çok acımasız. Yine de bunun münferit bir sorun olmadığını bize bildirdiğiniz için teşekkür ederiz. Radar var mı?
obeattie

1
Çözümümüz nihayetinde ilişkilendirilen etiketlerimiz için IBCustomFonts kullanmaya geri dönmekti .
yonix

Yanıtlar:


30

Benim için düzeltme bir IBDesignablesınıf kullanmaktı :

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
    }
}

Arayüz Oluşturucu'da size bunu vermek:

Arayüz Oluşturucu özel yazı tipi ile ilişkilendirilmiş dizge

Nitelikli dizginizi her zamanki gibi kurabilirsiniz, ancak mevcut yeni özelliklerde yazı tipi boyutunuzu ve yazı tipi ailesini bir kez daha ayarlamanız gerekecektir.

Arayüz Oluşturucu varsayılan olarak özel yazı tipiyle çalıştığından, bu, gördüğünüz şeyle sonuçlanır, bunu elde edersiniz , bunu uygulamaları oluştururken tercih ederim.

Not

Bunu yalnızca düz sürüm yerine kullanmamın nedeni, düz stil kullanılırken kullanılamayan satır aralığı gibi atıfta bulunulan etikette özellikler ayarlıyorum.


1
Çözümünüz bir etiket için yalnızca bir yazı tipi ailesini ve boyutunu destekliyor, o zaman neden bunun yerine sadece düz metin kullanmıyorsunuz?
Allen Hsu

Benzer şekilde, @IBInspectableyazı tipi ve boyut yerine geçici olarak öznitelikleri kullanıyoruz . Bir markdownTextözelliğimiz var, çünkü çoğu zaman kalın veya altı çizili metin için atıfta bulunulan dizeyi kullanırız. Ardından, işaretleme metnini, düz metin için ayarlanmış yazı tipi ve boyut bilgisi ile ilişkilendirilmiş dizeye ayrıştırın.
Allen Hsu

@AllenHsu, haklısın. Bundan bahsetmedim ama etiketim için atfedilen satır aralığını kullanıyorum. Elbette, yoksa sadece sade stili kullanırdın :)
Antoine

iyi bir nokta, lineSpacing'i de dışa aktardık: p Aslında Xcode'da bir hata olduğu için cevabınızı kabul edeceğimi düşünüyorum ve şimdilik daha iyi bir çözüm yok. Xcode'un bir sonraki sürümünü bekleyelim.
Allen Hsu

2
Metnin bir bölümünü kalınlaştırmak istersem bu işe yaramaz
xtrinch

28

İşe yarayan en basit cevap, yazı tiplerini FontBook'a sürüklemektir. Yazı tipleri projenizdeyse ancak bilgisayarınızın FontBook'unda yoksa, IB bazen onu bulmakta güçlük çeker. Tuhaf, ama birkaç kez benim için çalıştı.


17
Bu, Xcode'un özel yazı tipini seçmesine izin verirken, aslında çalışmıyor. Çalışma zamanında yazı tipi beklediğiniz gibi kullanılmayacaktır.
Daniel

Maalesef bir çözüm bulamadım. Yapabileceğim en iyi şey Apple ile bir hata kaydetmekti.
Daniel

Evet, düzeltme budur. Film şeridimi başka bir geliştirici tarafından tasarladım, svn güncellemesi tamam, ancak yazı tipini UI'de hiç almadım. Yazı tipi kaynaklardaydı ancak cihaz / simülatör kullanıcı arayüzünde gösterilmemiştir. Öznitelikli dizeyi kullandığından, onu Font Book'ta bulundurmalıyım. Bu sorunu çözer.
karim

Evet. bu aynı sorunu çözmeme yardımcı oluyor. Yazı tipi kitabına özel yazı tipi eklediğimde işler cazibe gibi işliyor.
Sushant Jagtap

1
Bu çözüm bazı durumlarda işe yararken, ben de aynı font ailesiyle aynı projede @Daniel ile aynı sorunla karşılaştım. XCode'un bu sorunu çözmesi gerekiyor.
dey.shin

16

Yazı tipi kitabına özel yazı tipleri ekleyebilirsiniz.

Adım 1 : Yazı tiplerini yönet'e tıklayın. Yazı tipi kitabını açar.

görüntü açıklamasını buraya girin

Adım 2 : Artıya tıklayın ve yazı tiplerinizi ekleyin.

görüntü açıklamasını buraya girin

Bir dahaki sefere atıfta bulunulan metne sahip yazı tipine tıkladığınızda, yeni eklenen yazı tipi de listede görünecektir. Ancak özel yazı tipinizin info.plist'e eklendiğinden ve kaynakları gruplandırdığınızdan emin olun.


Bu, film şeridinde çalışıyor, ancak çalıştırdıktan sonra biçimlendirmeyi göstermiyor
Van

1
@Van biçimlendirmesi? Lütfen bana daha fazlasını anlatır mısınız? Ne zaman çalışmıyor?
mahbaleshwar hegde

Rgualr ve kalın yazı tipinin karışımı olan metni ayarlamam gerekiyor. Yukarıdaki çözümü kullandım, bu yüzden film şeridinde çalıştı, ancak uygulamayı çalıştırdığımda etiket uygulanan yazı tipini göstermiyor, bunun yerine sistem yazı tipini gösteriyor
Van

Özel yazı tiplerinizi
info.plist'e mi eklediniz

2
Evet. Düz metin olması durumunda uygulamanın her yerinde özel yazı tipini ayarlayabiliyorum, atıfta bulunulan metin için ayarlamam gerekiyor
Van

5

Bu iş parçacığı sayesinde şu çözüme geldim:

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
İyi fikir. Bunun Apple'da kırılması gerçekten inanılmaz. Şaşırtıcı.
Şişko

4

Benim çözümüm biraz geçici bir çalışma. Gerçek çözüm, Apple'ın Interface Builder'ı düzeltmesidir.

Bununla birlikte, arayüz oluşturucudaki tüm kalın ve italik metni bir sistem yazı tipini kullanarak işaretleyebilir, ardından çalışma zamanında özel yazı tipinizi oluşturabilirsiniz. Her durumda optimal olmayabilir.

 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;
}

Bu gönderiden esinlenildi


4

Bu hatayla uğraştım: UILabel özel yazı tipiyle IB'de doğru şekilde görüntüleniyor, ancak cihazda veya simülatörde doğru görüntülenmiyor (yazı tipi projeye dahil edilmiştir ve düz UIL etiketlerinde kullanılıyor).

Sonunda (Mac) App Store'da Attributed String Creator'ı buldu. Uygulamanıza uygun yere yerleştirilecek kodu üretir. Fantastik. Ben yaratıcı değilim, sadece mutlu bir kullanıcı.


3

Aynı sorunu karşıladı: Film şeridindeki TextView için öznitelik yazı tipi ayarı XCode 6.1 ve iOS 8 SDK ile çalışma zamanında çalışmadı.

Bu sorunu bu şekilde çözdüm, sizin için geçici bir çözüm olabilir:

  1. metin görünümünüzün öznitelik denetçisini açın, metni "Düz" olarak değiştirin

  2. "wC hR" yi (aşağıda kırmızı) silmek için çarpıya tıklayın

    görüntü açıklamasını buraya girin

  3. metni "İlişkilendirilmiş" olarak değiştirin ve ardından metninizin yazı tipini ve boyutunu ayarlayabilirsiniz.

  4. çalışıp çalışmadığını kontrol etmek için koş

Öyle görünüyor ki, varsayılan olarak wC hRne özellik ne UILabelde ayarlanmış UITextView.
Allen Hsu

xcode 6'ya göre, "Normal Genişlik | Herhangi Bir Yükseklik", "Kompakt Genişlik | Normal Yükseklik" gibi başka bir yükseklik genişliği ayarladınız mı? Xcode 5'te geliştirilen bir projem olduğu ve atfedilen metin görünümü iOS 8 SDK ile bile çalıştığı için, oradaki ayarları kontrol ettim ve tek farkın Xcode 6'nın, metni ayarlarsanız kullanıcıların farklı cihaz boyutları için yazı tipini ayarlamasına izin verdiğini buldum. "Sade". Bu yeni yapılandırma, metnin "ilişkilendirilmiş" olarak ayarlanmasının ancak yazı tipinin çalışmamasının nedeni olabilir.
Zhihao Yang

1
özel yazı tipleri mi kullanıyorsunuz? Sistem yazı tiplerini değil, kendinden gömülü olanları kastediyorum.
Allen Hsu

Aha, bahsettiğiniz "Özel" yazı tiplerinin "Sistem" yazı tipine sahip olması koşuluyla Xcode tarafından sunulanlar olduğunu düşündüm.
Zhihao Yang

Benim için çalışmıyor. Normal dizge için çalışır ancak öznitelikli dizge için çalışmaz.
Pratik Somaiya


2

Bunu dene, işe yarayacak

Benim durumumda, "Silversky Technology" yi arayüz oluşturucudan etiket için atfedilen metin olarak ayarlamaya çalıştığımda, simülatörde çalıştırdığımda gösterilmiyor, ancak arayüz oluşturucuda gösteriliyor. Bu yüzden Silversky fontunu Teknoloji metninden 1 piksel daha büyük yaptım.

Öznitelik metninde aynı yazı tipi boyutu sorunu var, bu nedenle bu şey benim için çalışacak şekilde 1 kelimenin boyutunu değiştirin .

Bu xcode hatası olabilir ama bu numara benim için çalışıyor.


1

Aynı problem.

Çözüldü: TextView'de Seçilebilir'i işaretlemeniz yeterli. Bu olmadan standart Sistem yazı tipine sahibim.



1

@Hamidptb çözümü çalışır, yazı tipinin doğru adını aldığınızdan emin olun (Yazı Tipi Kitabına ekledikten sonra)

  • Font Book uygulamasını açın, yazı tipinize gidin ve Command + I tuşlarına basın. PostScript adı burada kullanmak istediğiniz yazı tipi adı:

    UILabel.appearance (). Font = UIFont (ad: " PostScriptName ", boyut: 17)


0

Birden çok paragraf içeren metin içeren tableView hücreleri almaya çalışıyordum. İlişkilendirilen dizeler, paragraflar arasında fazladan boşluk elde etmenin bir yolu gibi görünüyordu (dizede iki satır besleme yapmaktan biraz daha hoş görünen bir şey). Hücreye farklı bir metin koymak istediğinizde IB ayarlarının çalışma zamanında uygulanmadığını keşfettiğimde bu ve diğer gönderilere rastladım.

Bulduğum en önemli şey, belirli özelliklere sahip atfedilmiş bir dize oluşturmak için String'e bir uzantı eklemekti (Swift kullanarak). Buradaki örnek, Helvetica'dan kolayca ayırt edilebildiği için Marker Felt yazı tipini kullanır. Örnek ayrıca paragrafları birbirinden daha farklı kılmak için biraz fazladan boşluk gösterir.

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
    }
}

Daha sonra, benim özel tableViewCell'imde, ona istediğiniz metni gönderiyorsunuz ve onu UILabel'de ilişkilendirilmiş bir dizeye dönüştürüyor.

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

TableView ile görünüm denetleyicisinde, hücrenizi viewDidLoad () 'a kaydetmelisiniz - Ben bir uç kullandım, yani şöyle bir şey:

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

Hücrenin ne kadar uzun olması gerektiğini anlamasını sağlamak için, boyut bilgisi almak için kullanılan ve hiçbir zaman tableView'e eklenmeyen bir prototip hücre yapın. Dolayısıyla, görünüm denetleyicinizin değişkenlerinde:

var prototypeSummaryCell : MarkerFeltCell? = nil

Sonra in (muhtemelen geçersiz kıl - görünüm denetleyicinize bağlı olarak) 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 {  // ...

Yukarıdaki kodda, prototypeCell ilk ihtiyaç duyulduğunda doldurulacaktır. PrototypeCell daha sonra otomatikleştirme işleminden geçtikten sonra hücrenin yüksekliğini bulmak için kullanılır. Ceil () işlevi ile yüksekliği yuvarlamanız gerekecektir. Ayrıca bazı ekstra şekerleme faktörü ekledim.

Son kod biti, hücre için metni nasıl yapılandırdığınızdır. Bu örnek için basitçe:

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
    }
}

Ayrıca, işte ucun bir fotoğrafı. Etiketi hücrenin kenarlarına sabitledi (kenar boşluğu istenecek şekilde), ancak alt sınırlama için "Gerekli" den daha düşük bir önceliğe sahip bir "Büyük veya Eşit" kısıtlaması kullanıldı.

Hücre kısıtlamaları

Etiketin yazı tipini Attributed olarak ayarlayın. Gerçek IB yazı tipi önemli değildi.

LabelFont

Bu durumda sonuç:

Hücre Sonuçları


0

Nitelikli dizge durumunda, yazı tipi listesine özel yazı tipi ekleyebilirsiniz - Yazı tipi simgesine tıklayın, aşağıdaki iletişim kutusu görüntülenir. Aşağıdaki iletişim kutusunda kendi kategorinizi veya özel yazı tipi için mevcut olanı ekleyebilirsiniz. atıfta bulunulan yazı tipi iletişim kutusu

Yazı Tiplerini Yönet'e tıkladıktan sonra, oluşturduğunuz veya var olan kategoride aşağıdaki iletişim kutusunu açar. Kategoriye yazı tipi eklemek için + işaretine tıklayın. Yazı tipi iletişim kutusunu yönet


0

bu basit ve hızlı bir çözümdür ve bu benim durumumda işe yarar. bu çözüm, AppDelegate.swift dosyasındaki didFinishLaunchingWithOptions fonksiyonuna bir kod satırı eklemektir:

textViews için :

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

etiketler için :

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

ve UiView'in geri kalanı için bunun gibi iki ☝️


0

Kodda ilişkilendirilmiş dizeye özel yazı tipleri uygulayan herkes için: Bunu ayarlamayı deneyin viewDidLayoutSubviews. Benim hatam bunu yapmaktı, viewDidLoadorada uygulanmayacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.