2016-10-12 11 views
1

申し訳ありません、私はここでスイフト3で働いています。そして、私はuicollectionviewsに新しいです。私はプログラムで、ラベルのサブビューとしてUICollectionReusableViewのコレクションビューにラベルを追加しようとしています。他のビューと同じようにラベルを追加しましたが、ヘッダーのラベルにCENTERというラベルを付けることはできません。ここでSwift 3:プログラムでCollectionviewヘッダのラベルを正しく作成できますか?

は私のラベルコードは、ストーリーボードのヘッダに追加されたカスタムヘッダークラ​​ス、である:

let pointsLabel = UILabel() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     self.customInit() 
    } 


    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder)! 
     self.customInit() 
    } 

    func customInit() { 

     //center inside content 
     pointsLabel.frame = CGRect(x: 0, y: 0, width: self.bounds.width, height: 100) 
    pointsLabel.center = CGPoint(x: self.bounds.width * 0.5, y: self.bounds.height * 0.5) 
    pointsLabel.textColor = UIColor.darkGray 
    pointsLabel.textAlignment = .center 

     pointsLabel.text = "Testing 123" 
     pointsLabel.font = UIFont(name: "Montserrat", size: 30) 
     self.addSubview(pointsLabel) 

    } 

私Collectionviewは、いずれかの側に余裕を持っている。しかし

self.collectionView.contentInset = UIEdgeInsets(top: 0, left: 32.5, bottom: 0, right: 32.5) 

これはヘッダービューのサイズに影響を与えるだけで、ラベルはheader.bounds.width * 0.5の中央に配置されている必要があります。そして私は、テキストの配置を中心に、まだテキストが左に偏っている:

enter image description here

ことができます場合は、私のコレクションビューは、メッセージアプリの拡張機能の中にあるが、やはり私はそれがどのように変化するか分かりませんもの。ここで何が間違っていますか?

さえ持つ:

pointsLabel.frame = CGRect(x: 0, y: 0, width: self.bounds.width, height: 100) 
    //pointsLabel.center = CGPoint(x: self.bounds.width * 0.8, y: self.bounds.height * 0.5) 
     pointsLabel.center = self.center 
     pointsLabel.textColor = UIColor.darkGray 
     pointsLabel.backgroundColor = UIColor.blue 

以下に私の幅を変え、私が手:

enter image description here

なぜ?

+0

あなたは 'pointsLabel.center = self.center'を試しましたか? centerプロパティをまったく設定しないことでこの問題を解決することもできます。テキストの配置を.centerに設定しているので、基本的にはテキストの中心になっています。欠けているのは、ラベルの幅が正しくないことだけです。これは 'pointsLabel'の背景色を設定するか、Xcode UIデバッガを使って確認できます。 – werm098

+0

私の編集を確認してください - まだ左にオフセットします – skyguy

+0

これは、オフセットがcontentInset(32.5)の左右の埋め込みと同じように見えます。 'pointsLabel'フレームのx座標を32.5に設定し、centerプロパティを設定する行を削除すると、中央にラベルを付ける必要があります。 – werm098

答えて

0

スウィフトアンカーシステムを使用して、ラベルにヘッダーを塗りつぶすことができます。そのような独自のカスタムヘッダクラスを作成することができます。アンカーが機能する方法は、サイズに関係なく、ビューの上、左、右、下に展開するようにラベルに制約を設定します。左と右のアンカーに定数[32.5と-32.5]を追加すると、あなたが探しているインセットの間隔が追加されます。お役に立てれば。

カスタムヘッダークラ​​ス

class CustomHeader: UICollectionViewCell { 

    let pointsLabel: UILabel = { 
    let n = UILabel() 
     n.textColor = UIColor.darkGray 
     n.textAlignment = .center 
     n.text = "Testing 123" 
     n.font = UIFont(name: "Montserrat", size: 30) 
    return n 
    }() 

    override init(frame: CGRect) { 
    super.init(frame: frame) 
    addSubview(pointsLabel) 

    pointsLabel.translatesAutoresizingMaskIntoConstraints = false 
    pointsLabel.leftAnchor.constraint(equalTo: leftAnchor, constant: 32.5).isActive = true 
    pointsLabel.rightAnchor.constraint(equalTo: rightAnchor, constant: -32.5).isActive = true 
    pointsLabel.topAnchor.constraint(equalTo: topAnchor).isActive = true 
    pointsLabel.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true 
    } 
} 

あなたはヘッダは以下のようになりたい幅と高さを登録すると宣言することができ、このヘッダを使用していますのViewController。だからあなたが持っているすべてのクラスは、カスタムヘッダーを使用するためにあなたのファイルに以下の関数を追加し、それはあなたが探しているものを与える必要があります。 =]

class ControllerUsesHeader: UICollectionViewController { 
    let headerId = "headerId" 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    collectionView?.register(CustomHeader.self, forSupplementaryViewOfKind: 
     UICollectionElementKindSectionHeader, withReuseIdentifier: headerId) 
    } 


    override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: 
    String, at indexPath: IndexPath) -> UICollectionReusableView { 
     let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: 
      headerId, for: indexPath) as! CustomHeader 
     return header 
     } 

} 

extension ControllerUsesHeader: UICollectionViewDelegateFlowLayout { 
    func collectionView(_ collectionView: UICollectionView, layout 
    collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection 
    section: Int) -> CGSize { 
    return CGSize(width: view.frame.width, height: 100) 
} 
関連する問題