2016-08-01 7 views
0

私は上書きしているカスタムUICollectionViewCellを持っています。それはタイプUILabelnameLabelと呼ばれるプロパティを持っています。UICollectionViewでスクロールするとUILabelのサイズが変更されます

addConstraintsWithFormat("V:[v0]-10-[v1]-10-|", views: nameLabel, userLabel) 

addConstraintsWithFormatは以下からブライアンVoongのように定義されている:私はnumberOfLines

let nameLabel: UILabel = { 
let label = UILabel() 
label.numberOfLines = 3 
label.sizeToFit() 
return label 
}() 

3に名前のラベルは、次のVFL制約が適用されたframeせずに、それを初期化して設定する設定しますUICollectionView例:ある何が起こる

extension UIView { 
func addConstraintsWithFormat(format: String, views: UIView...) { 
var viewsDictionary = [String: UIView]() 
for (index, view) in views.enumerate() { 
    let key = "v\(index)" 
    viewsDictionary[key] = view 
    view.translatesAutoresizingMaskIntoConstraints = false 
} 

addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary)) 
} 
} 

、私はそのnameLabelテキストつのセルを持っていると言います制約が与えられていると、3行(3行の折り返しを行うには十分な行)でレンダリングされます。

何が起こるのですか、そのセルにスクロールして、nameLabelが3行あると表示し、そのセルをスクロールします。そのセルまでスクロールバックすると、まったく同じUILabelに1行が追加されました。

レンダリングするコンテンツに基づいてUILabelサイズのフレキシブルディスプレイを維持するにはどうすればよいですか?

+1

内のテキストを設定し、ソリューションは、 'sizeToFit'を呼び出す前にラベルのフレームを再宣言しています。 – 0yeoj

+0

残念ながらフレームを再宣言しても動作は変わりません。 – Thalatta

+0

'cellForItemAtIndexPath'デリゲートから、その' UILabel'の実装を示す行をいくつか投稿できますか? – 0yeoj

答えて

1

私はあなたが何からいくつかの変更でそれを修正、しかし、あなたの-cellForItemAtIndexPathの内側にそれを実装方法を確認しませんでした...あなたは上記の持っている方法は、エラーを犯し、それを実装し、

あなたのエラーを再現することができましたこれはあなたに...乾杯を助ける

//-- 
// UICollectionView Delegates 
func collectionView(collectionView: UICollectionView, 
        cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cvCell", forIndexPath: indexPath) 

    // just to remove multi existence of identical views 
    // 
    cell.subviews.forEach { (view) in 
     view.removeFromSuperview() 
    } 

    let nameLabel: UILabel = { 

     let label = UILabel() 

     // declare constant configurations here 
     // 
     label.numberOfLines = 3 
     label.textAlignment = NSTextAlignment.Center 
     label.text = "Index: \(indexPath.row)\n and this is quite a long text that will occuply 3 lines" 

     return label 
    }() 

    // this is just an example base frame 
    // 
    nameLabel.frame = CGRectMake(0, 0, cell.frame.size.width/*your width*/, CGFloat.max) 
    nameLabel.sizeToFit() 

    cell.addSubview(nameLabel) 

    // ... 
    // 
    // updates constraints here 

    return cell 
} 

希望:あなたは私の-cellForItemAtIndexPathのように見えるされ、ここで、提供してきました! :)

+0

ありがとうございます!私はこれも動作すると思います!私は何をしていたのかを変えて、やはり働いていた解決策を見つけました。それが私が使い終わったものです。 – Thalatta

0

私はエラーを解決したが、自動レイアウト制約のビジュアルフォーマット文字列を設定した。

私は水平制約を適用していませんでしたが、どちらも固定幅をUILabel与えませんでした。私の新しい制約は次のとおりです。

addConstraintsWithFormat("H:|-20-[v0(200)]", views:nameLabel) 
    addConstraintsWithFormat("V:[v0]-10-[v1]-10-|", views: nameLabel, userLabel) 

私は、私はまったくsizeToFit()を使用していませんでした

addConstraintsWithFormat("V:[v0]-10-[v1]-10-|", views: nameLabel, userLabel) 

を持っていた以前のように。私のUICollectionViewCellクラスに私のUILabelの設定だけがありました。

let nameLabel: UILabel = { 
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, 200, 200)) 
    label.numberOfLines = 3 
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping 
    let font = UIFont(name: "HelveticaNeue-Bold", size: 20.0) 
    label.font = font 
    return label 
}() 

、その後、私は...後でので、動作が期待されていたあなたの初期からベースベースフレーム/バインドを必要とし、「.sizeToFit」は、おそらくのクラス

nameLabel.text = name 
関連する問題