2017-08-06 126 views
2

我正在嘗試向@IBDesignable UICollectionViewCell原型添加一個薄的彩色邊框。在故事板中,我設置了layer.cornerRadius,layer.masksToBoundslayer.borderWidth用戶定義的屬性,並且邊框按預期顯示。當設置layer.borderColor時,UICollectionViewCell邊框消失

enter image description here

但是,如果我還設置自定義layer.borderColor,整個邊框,半徑和口罩從故事板消失。在模擬器中,拐角半徑(和掩模,大概)會出現,但邊界不會。

enter image description here

我也嘗試以編程方式設置它們,但作爲this year-old, unanswered StackOverflow question顯示,不工作,要麼。

下面是該小區的代碼,如要求:

@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? 

} 

和相關部分的UICollectionViewControllerdataSource

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是一個自定義集合視圖的數據源和委託這由NSFetchedResultsController支持,而MasterRelease是受管理的對象。我儘量保持這個東西儘可能簡單。

+1

您可以發佈您的代碼爲您的自定義單元格? –

+0

當然,但它只是一小撮'IBOutlet';沒有有趣的代碼。 – NRitH

回答

1

您面臨的問題是您正在使用Boolean值爲layer.borderColor您必須改用Color。但無論如何,這不工作,因爲layer.borderColor你需要一個cgColor所以我認爲你需要定義一個@IBInspectable VAR爲BORDERCOLOR和代碼做到這一點

@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? 

} 

然後你就可以做到這一點的故事板

enter image description here

希望這有助於

+0

啊,我對'layer.borderColor'有'Boolean'類型的好的調用。不過,我剛剛上傳了錯誤的屏幕截圖 - 我*確實已將它設置爲「Color」。當'Color'被指定爲用戶定義屬性中的類型時,IB知道它確實是'CGColor',所以我不認爲這是問題所在。但是我可以從你的例子中看出你已經開始工作了,所以我做了其他的事情。你使用的是什麼Xcode版本?我在9測試版4. – NRitH

+0

@NRitH您是否嘗試添加borderColor作爲可檢查的屬性,正如我在我的答案中所述?,必須工作,無論如何Iam使用Xcode 8.3.2 –

+0

是的,它工作,如果我添加可檢查的屬性像你建議的那樣。我知道我在其他項目上做過這方面的工作;我將把它記入Xcode 9 beta 4中的一個bug。 – NRitH