質問編集履歴

1 CustomLabelClassの追記

label8

label8 score 14

2016/05/24 10:25  投稿

CollectionViewにUILabelを表示するとスクロールが重い
毎度お世話になります。
マッチングアプリによくある、ユーザーギャラリーにニックネームや地域、年齢などを表示させるビューを作成しています。
画像単体で表示させる分にはスクロールがスムーズなのですが、その上にUILabelを表示させると極端にスクロールが重くなります。
ラベルには文字を表示させてもさせなくてももっさり感は変わりません。
これを解消させる手段が思いつかず、Web上にある情報をいろいろ試しましたが思い通りの結果になりません。
おわかりになる方がいらっしゃいましたらご教授いただけると助かります。
よろしくお願いいたします。
ViewController.swift
```swift
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
   
   let cell = collectionView.dequeueReusableCellWithReuseIdentifier("UsersCell", forIndexPath: indexPath) as! UsersCollectionViewCell
   cell.setupCustomCellImage()
   cell.setupCustomCellLabel()
   cell.imageConstraint()
   cell.labelConstraint()
   cell.setupContents(indexPath.row, items: self.userItems[indexPath.row]) //self.userItemsはAPIからデータを取得
   return cell
}
```
UsersCollectionViewCell.swift
```swift
class UsersCollectionViewCell: UICollectionViewCell {
   let imageView  = UIImageView()
   let statusLabel = CustomLabelClass()
   required init(coder aDecoder: NSCoder) {
       super.init(coder: aDecoder)!
   }
   override init(frame: CGRect) {
       super.init(frame: frame)
       self.addSubview(imageView)
       self.addSubview(statusLabel)
   }
   func setupCustomCellImage() {
       self.backgroundColor = UIColor.whiteColor()
       self.imageView.contentMode = UIViewContentMode.ScaleToFill
       self.imageView.layer.cornerRadius = 6
       self.imageView.layer.masksToBounds = true
   }
   func imageConstraint() {
       // 画像の制約
   }
   func setupCustomCellLabel() {
       self.statusLabel.textAlignment = NSTextAlignment.Center
       self.statusLabel.backgroundColor = UIColor.rgb(0x000000, 0.8)
       self.statusLabel.backgroundColor = UIColor.blackColor()
       self.statusLabel.setCornersAndRadius([.BottomLeft, .BottomRight], radius: 6.0)
       self.statusLabel.font = UIFont.systemFontOfSize(CGFloat(10))
       self.statusLabel.textColor = UIColor.orangeColor()
   }
   func labelConstraint() {
       // ラベルの制約
   }
 
   // コンテンツの表示
   func setupContents(num: Int, items: Dictionary<String, AnyObject>) {
       statusLabel.text = "ニックネーム"
       if items["image_url"] as! String != "" {
           imageView.sd_setImageWithURL(NSURL(string: "http://hogehoge.com" + (items["image_url"] as! String)))
       } else {
           imageView.image = UIImage(named: "dummy.jpg")
       }
   }
   
}
```  
 
追記:  
ご指摘のあったCustomLabelClass.swiftの内容を載せてみました。  
内容は、個々でラベルのコーナーをラウンドさせるための処理になります。  
```swift  
class CustomLabelClass: UILabel {  
 
   var corners: UIRectCorner = [.TopLeft, .TopRight, .BottomLeft, .BottomRight]  
   var radius: CGFloat = 0  
 
   var padding: UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)  
     
   func setPadding(pt:CGFloat, pr:CGFloat, pb:CGFloat, pl:CGFloat) {  
       self.padding = UIEdgeInsets(top: pt, left: pl, bottom: pb, right: pr)  
   }  
   
   override func drawTextInRect(rect: CGRect) {  
       let newRect = UIEdgeInsetsInsetRect(rect, padding)  
       super.drawTextInRect(newRect)  
   }  
     
   override func intrinsicContentSize() -> CGSize {  
       var intrinsicContentSize = super.intrinsicContentSize()  
       intrinsicContentSize.height += padding.top + padding.bottom  
       intrinsicContentSize.width += padding.left + padding.right  
       return intrinsicContentSize  
   }  
     
   func setCornersAndRadius(corners:UIRectCorner, radius: CGFloat) {  
       self.corners = corners  
       self.radius = radius  
   }  
     
   override func layoutSubviews() {  
       super.layoutSubviews()  
       let maskPath = UIBezierPath(roundedRect: self.bounds,  
                                   byRoundingCorners: self.corners,  
                                   cornerRadii: CGSize(width: self.radius, height: self.radius))  
         
       let maskLayer = CAShapeLayer()  
       maskLayer.frame = self.bounds  
       maskLayer.path = maskPath.CGPath  
         
       self.layer.mask = maskLayer  
   }  
}  
```
  • Swift 2

    1349 questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る