2017-08-06 3 views
2

Ich versuche, eine dünne, farbige Grenze zu einem @IBDesignable UICollectionViewCell Prototyp hinzuzufügen. Im Storyboard habe ich die benutzerdefinierten Eigenschaften layer.cornerRadius, layer.masksToBounds und layer.borderWidth festgelegt, und der Rahmen wird wie erwartet angezeigt.UICollectionViewCell Grenze verschwindet, wenn layer.borderColor gesetzt ist

enter image description here

Allerdings, wenn ich gesetzt auch einen benutzerdefinierten layer.borderColor, die gesamte Grenze, Radius, und die Maske aus dem Storyboard verschwinden. Im Simulator erscheint der Eckenradius (und vermutlich die Maske), der Rand jedoch nicht.

enter image description here

Ich habe auch versucht, sie programmatisch, sondern als this year-old, unanswered StackOverflow question zeigt Einstellung, das entweder nicht funktioniert.

Hier ist der Code für die Zelle, wie gewünscht:

@IBDesignable open class ReleaseSpineCell: UICollectionViewCell { 

    public var masterRelease: MasterRelease? { 
     didSet { 
      artistName = masterRelease?.artistName 
      title = masterRelease?.title 
      catalogNumber = "none" 
     } 
    } 

    @IBInspectable public var artistName: String? { 
     didSet { 
      artistLabel?.text = artistName 
     } 
    } 

    @IBInspectable public var title: String? { 
     didSet { 
      titleLabel?.text = title 
     } 
    } 

    @IBInspectable public var catalogNumber: String? { 
     didSet { 
      catalogLabel?.text = catalogNumber 
     } 
    } 

    @IBOutlet private weak var artistLabel: UILabel? 
    @IBOutlet private weak var titleLabel: UILabel? 
    @IBOutlet private weak var catalogLabel: UILabel? 

} 

Und der relevante Teil des UICollectionViewController ‚s dataSource:

class CollectionModel: FetchedResultsCollectionModel { 

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "spineCell", for: indexPath) as! ReleaseSpineCell 
     cell.masterRelease = fetchedResultsController?.fetchedObjects?[indexPath.row] as? MasterRelease 

     return cell 
    } 
} 

FetchedResultsCollectionModel ist eine Quelle Ansicht Daten benutzerdefinierte Sammlung und Delegaten, ist unterstützt durch eine NSFetchedResultsController und MasterRelease ist das verwaltete Objekt. Ich versuche, dieses Zeug so einfach wie möglich zu halten.

+1

können Sie Ihren Code für die benutzerdefinierte Zelle posten? –

+0

Sicher, aber es ist nur eine Handvoll 'IBOutlet's; kein interessanter Code. – NRitH

Antwort

1

Das Problem, das Sie gegenüberstellen, ist, dass Sie Wert für layer.borderColor verwenden, müssen Sie stattdessen verwenden. Aber wie auch immer diese funktionieren nicht, weil für layer.borderColor benötigen Sie einen cgColor so glaube ich Ihnen eine @IBInspectable var für border definieren müssen und tun dies in Code

@IBDesignable open class ReleaseSpineCell: UICollectionViewCell { 

    public var masterRelease: MasterRelease? { 
     didSet { 
      artistName = masterRelease?.artistName 
      title = masterRelease?.title 
      catalogNumber = "none" 
     } 
    } 

    @IBInspectable public var artistName: String? { 
     didSet { 
      artistLabel?.text = artistName 
     } 
    } 

    @IBInspectable public var title: String? { 
     didSet { 
      titleLabel?.text = title 
     } 
    } 

    @IBInspectable public var catalogNumber: String? { 
     didSet { 
      catalogLabel?.text = catalogNumber 
     } 
    } 

    //added this inspectable property 
    @IBInspectable public var borderColor: UIColor? { 
     didSet { 
      self.layer.borderColor = borderColor!.cgColor 
     } 
    } 

    @IBOutlet private weak var artistLabel: UILabel? 
    @IBOutlet private weak var titleLabel: UILabel? 
    @IBOutlet private weak var catalogLabel: UILabel? 

} 

Dann werden Sie in der Lage sein, dies in Storyboard zu tun

enter image description here

hoffe, das hilft

+0

Ah, guten Ruf auf den 'Boolean' Typ hatte ich für die' layer.borderColor'. Allerdings habe ich gerade den falschen Screenshot hochgeladen - ich habe ihn als "Farbe" eingestellt. Wenn "Farbe" als Typ in einem benutzerdefinierten Attribut angegeben ist, weiß IB, dass es wirklich ein 'CGColor' ist, also glaube ich nicht, dass das das Problem ist. Aber ich kann an deinem Beispiel sehen, dass du es zur Arbeit gebracht hast, also mache ich etwas anderes falsch. Welche Xcode-Version verwenden Sie? Ich bin auf 9 beta 4. – NRitH

+0

@NRitH hast du versucht, die borderColor als inspective Eigenschaft wie ich sagte in meiner Antwort ?, muss funktionieren, trotzdem Iam mit Xcode 8.3.2 –

+0

Ja, es funktioniert, wenn ich eine inspectable Eigenschaft hinzufügen wie du vorgeschlagen hast. Ich weiß, dass ich diese Arbeit an anderen Projekten hatte; Ich werde es auf einen Fehler in Xcode 9 Beta 4 zu kalkulieren. – NRitH

Verwandte Themen