2016-02-10 2 views
6

Ich habe eine Tabelle mit benutzerdefinierten Zellen und ich versuche, es zu optimieren, indem alle Untersichten innerhalb der Zellen in grüner Farbe, wenn Color Blended Layer im Simulator überprüft wird.Ist es möglich, UILabel mit nicht-englischen Zeichen grün zu machen, wenn Color Blended Layer aktiviert ist?

Wenn der Hintergrund eines UILabel in der Zelle auf weiß festgelegt ist:

let title = UILabel() 
contentView.addSubview(title) 
title.background = UIColor.whiteColor() 
title.text = "Hi, how are you?" 

Diese UILabel Subview wird grüne Farbe im Simulator, was gut ist. Wenn ich jedoch den Text in Chinesisch ändere:

title.text = "你好" 

Die Untersicht UILabel wird rot. Diese SO post gibt eine Erklärung über die Situation. Gibt es dafür tatsächlich eine Lösung?

+1

Warum ist es wichtig, dass Sie die gleiche Farbe haben, wenn "Color Blended Layer" im Simulator aktiviert ist? – Adobels

+0

Um Scroll-Leistung zu verbessern, wie einige andere in anderer Frage geraten. Ich finde bessere Leistung, wenn ich nur englische Etiketten habe. –

+0

Ich denke du stellst nur eine falsche Frage. Was Sie brauchen, ist, wie Sie eine bessere Leistung für Ihre Tabellenansicht erhalten, aber nicht "nicht-englische Zeichen grün, wenn Farbmischungsebene aktiviert ist". Wenn Ihr UILabel mit nicht-englischen Zeichen grün ist, wenn der Farbmischungs-Layer aktiviert ist, bedeutet dies nicht, dass Ihre Tabellenansichtsleistung besser ist. –

Antwort

3

Verwenden Sie CATextLayer anstelle von UILabel. Und vergessen Sie nicht, die Eigenschaft opaque auf true zu setzen.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 

     // You should definitely put layer handling logic into 
     // UITableViewCell subclass. I'm omitting it for clarity 
    let layer = cell.contentView.layer 

    let textLayer = CATextLayer() 
    textLayer.string = "你好" 
    textLayer.bounds = CGRect(x: 0, y: 0, width: 100, height: 50) 
    textLayer.position = CGPoint(x: 50, y: 25) 
    textLayer.opaque = true 

    layer.addSublayer(textLayer) 

    return cell 
} 

UPD: Wenn ein schwarzer Hintergrund ist nicht das, was Sie suchen, ein Problem wird ein bisschen schwieriger, aber dennoch lösbar.

Alles, was Sie brauchen, ist zwei Zeilen Code in Zeichnungsmechanismus zu injizieren.Es gibt zwei Möglichkeiten, dies zu erreichen:

  • zu verwenden, um ein delegate ein CALayer oder

  • , um eine Unterklasse von CATextLayer zu machen.

In unserem Fall glaube ich, dass Letzteres vorzuziehen ist. Anstatt also CATextLayer im Beispiel unten verwenden diese Klasse:

class OpaqueTextLayerWithCustomizableBackgroundColor: CATextLayer { 
    override func drawInContext(ctx: CGContext) { 
     if let color = backgroundColor { 
      CGContextSetFillColorWithColor(ctx, color) 
      CGContextFillRect(ctx, bounds); 
     } 
     super.drawInContext(ctx) 
    } 
} 
+0

Ich habe getestet und es funktioniert. Wenn Sie jedoch 'opaque' auf 'true' setzen, wird der Hintergrund schwarz und ignoriert die Einstellung 'textLayer.backgroundColor' (immer schwarz, egal wie). Irgendeine Abhilfe für dieses? Ich kann den schwarzen Hintergrund nicht benutzen. –

+0

gut ... zumindest ist es ein Weg, um die ursprüngliche Frage zu lösen, die über Hintergrundfarbe nicht erwähnt hat. Wenn Sie weitere Informationen kennen, die Ihnen helfen könnten, lassen Sie es mich wissen. Ich werde dir den Kredit belohnen. Vielen Dank. –

+0

Das ist ein guter Punkt. Ich werde versuchen, einen Workaround dafür zu finden. – Zapko

-1

Vielleicht könnten Sie nach Monospace-Zeichen (westliche) versus proportionale (chinesische) abhängig von der Schriftart suchen.

Monospace-Zeichen sind 8-Bit, wobei die proportionalen 16-Bit-Zeichen sind. Ich weiß nicht, wie Swift nach Byte-Größen suchen kann, daher kann ich keinen Code bereitstellen.

Apples Swift-Programmieranleitung kann helfen. Überprüfen Sie den Abschnitt mit der Überschrift: Unicode-Darstellungen von Strings.

+0

Bitte geben Sie mehr Details –

0

Sie können dies den alten Stil tun, und es nur manuell recolorize:

for (CALayer *sublayer in label.layer.sublayers) { 

    //possibly add an if check here for a layer that actually renders text, it may be the case, that you don't want to color one of them 
    sublayer.backgroundColor = label.backgroundColor; 
} 

Sie haben wahrscheinlich es jedes Mal tun iOS die Farben tatsächlich erfrischt, kann es nie sein, es auf jeden layoutSubviews sein kann . Sie müssen experimentieren, was für Sie arbeitet. Wenn dies eine Zelle ist, ist es wahrscheinlich sicher in prepareForReuse zu tun. Wenn dies die Leistung zu sehr beeinträchtigt, versuchen Sie es mit init oder awakeFromNib und zählen Sie darauf, dass Apple dies nicht selbst ändert.

+0

Ich habe versucht, aber nicht funktioniert. Sind Sie sicher, dass es eine Lösung oder nur eine Idee ist? –

1

Ich muss sagen, das ist die interne Implementierung von Apple. Und wir dürfen/können (wahrscheinlich) nicht damit herumspielen. Die "Farben", die Sie sehen, sind nur die Darstellung der Struktur der Ebenen. Die Antwort auf Ihre Frage ist eine gute Erklärung.

Ich würde vorschlagen, dass keine vorzeitigen Optimierungen planen. Selbst wenn Sie eine Leistungssteigerung bemerken, ist die 'Color Blended Layer' hässlich und kann nicht für reale Geräte verwendet werden. Oder versuchen Sie einfach nicht darauf zu achten!

Edit:

Hier ist ein Screenshot von der Apple-Simulator, wenn Apple kann damit leben, Sie damit leben!

0

Überprüfen Sie Ihre textlayer.string ersten Buchstaben ist Englisch oder eine andere

NSMutableArray*arrAlphabets; 
    arrAlphabets=[NSMutableArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",nil]] 

dann in einer Tabellen- Zelle für Zeile bei indexPath Methode:

NSString *str=[textlayer.string substringToIndex:1]; 
if(str isEqualToString:arrAlphabets) //use for loop to run arralphabets 
{ 
    //do your code to maintail the layer color . 
} 

Hoffnung dieses Konzept Ihnen hilft :)

2

FYI, drei Schritte in XIB (persönliche Präferenz) oder in Code.

  1. gesetzt opaken = YES
  2. background = eine Volltonfarbe
  3. clipsToBound = YES

dann nicht Englisch UILabel wird einmal rendern passieren, wie grün.

+0

Vielen Dank! Das clipsToBounds = YES war das, was ich vermisste. –

+0

warum ist das nicht akzeptiert lol – Timmy

Verwandte Themen