2016-05-27 11 views
0

私は、コンテンツビューで作業中のUIScrollViewを水平にスクロールできます。私は私が見つけたすべてのオンラインリソースとスクロールに関連するすべての作品に従ってきました...私の問題は、contentviewの中に入れられたコンテンツは、UIScrollViewsの底部に塗りつぶされないということです。スクロールバーが5〜10ピクセル下を占めるようなので、コンテンツがそこに伸びることはありません。UIScrollView内でcontentviewを取得して、autolayoutを親に塗りつぶす方法

添付のサンプル画像では、テキスト全体がバーに沿って整列していないことがわかります。すべてのアイテムが同じ方法で追加されますが、小さなスクロールエリア内にはUIScrollViewが親として存在します。残念ながら、自動レイアウト制約を使用する代わりにフレームとコンテンツ領域を設定すると、これは問題ではありませんでした。

Example of issue

すべてがScrollviewおよびコンテンツビューの

制約を(左右に固定された高さ50の制約と0の余裕を持って最大限親除く)コードであります

// 
    // scroll constraint 
    // 
    barScrollView.translatesAutoresizingMaskIntoConstraints = false 

    // left constraint 
    let leftSideConstraint = NSLayoutConstraint(item: barScrollView, attribute: .Left, relatedBy: .Equal, toItem: menuBtn, attribute: .Right, multiplier: 1.0, constant: 0) 
    self.addConstraint(leftSideConstraint) 

    // top constraint 
    let topSideConstraint = NSLayoutConstraint(item: barScrollView, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1.0, constant: 0) 
    self.addConstraint(topSideConstraint) 

    // bottom constraint 
    let botSideConstraint = NSLayoutConstraint(item: barScrollView, attribute: .Bottom, relatedBy: .Equal, toItem: self, attribute: .Bottom, multiplier: 1.0, constant: 0) 
    self.addConstraint(botSideConstraint) 

    // right side constraint 
    let rightSideConstraint = NSLayoutConstraint(item: barScrollView, attribute: .Right, relatedBy: .Equal, toItem: collapseBtn, attribute: .Left, multiplier: 1.0, constant: 0) 
    self.addConstraint(rightSideConstraint) 


    // 
    // scroll content constraint 
    // 
    barScrollContentView.translatesAutoresizingMaskIntoConstraints = false 

    // left constraint 
    let contentLeftSideConstraint = NSLayoutConstraint(item: barScrollContentView, attribute: .Left, relatedBy: .Equal, toItem: barScrollView, attribute: .Left, multiplier: 1.0, constant: 0) 
    barScrollView.addConstraint(contentLeftSideConstraint) 

    // top constraint 
    let contentTopSideConstraint = NSLayoutConstraint(item: barScrollContentView, attribute: .Top, relatedBy: .Equal, toItem: barScrollView, attribute: .Top, multiplier: 1.0, constant: 0) 
    barScrollView.addConstraint(contentTopSideConstraint) 

    // bottom constraint 
    let contentBotSideConstraint = NSLayoutConstraint(item: barScrollContentView, attribute: .Bottom, relatedBy: .Equal, toItem: barScrollView, attribute: .Bottom, multiplier: 1.0, constant: 0) 
    barScrollView.addConstraint(contentBotSideConstraint) 

    // right side constraint 
    let contentRightSideConstraint = NSLayoutConstraint(item: barScrollContentView, attribute: .Right, relatedBy: .Equal, toItem: barScrollView, attribute: .Right, multiplier: 1.0, constant: 0) 
    barScrollView.addConstraint(contentRightSideConstraint) 

そして内部のすべての項目は、次のように追加されます。

/** 
Add constraints to an item used in the bar 

- parameters: 
    - newElement: The new element that is added 
    - leftElement: The element to the left of the new element 
    - parent: The parent view the constraint is added to 
    - width: The size of the new element 
    - isFirstItem: Boolean indicating if this item is the furtest item to the left side 
in the current container 
*/ 
func addConstraintToItem(newElement: UIView, leftElement: UIView, parent: UIView, width: CGFloat, isFirstItem: Bool) { 
    newElement.translatesAutoresizingMaskIntoConstraints = false 

    // Width constraint 
    let widthConstraint = NSLayoutConstraint(item: newElement, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: width) 
    parent.addConstraint(widthConstraint) 

    // Height constraint 
    //let heightConstraint = NSLayoutConstraint(item: newElement, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: self.frame.height) 
    //parent.addConstraint(heightConstraint) 

    // left constraint 
    var leftSideConstraint: NSLayoutConstraint 

    if isFirstItem { 
     leftSideConstraint = NSLayoutConstraint(item: newElement, attribute: .Left, relatedBy: .Equal, toItem: leftElement, attribute: .Left, multiplier: 1.0, constant: 0) 

    } else { 
     leftSideConstraint = NSLayoutConstraint(item: newElement, attribute: .Left, relatedBy: .Equal, toItem: leftElement, attribute: .Right, multiplier: 1.0, constant: 0) 
    } 
    parent.addConstraint(leftSideConstraint) 

    // top constraint 
    let topSideConstraint = NSLayoutConstraint(item: newElement, attribute: .Top, relatedBy: .Equal, toItem: parent, attribute: .Top, multiplier: 1.0, constant: 0) 
    parent.addConstraint(topSideConstraint) 

    // bot constraint 
    let botSideConstraint = NSLayoutConstraint(item: newElement, attribute: .Bottom, relatedBy: .Equal, toItem: parent, attribute: .Bottom, multiplier: 1.0, constant: 0) 
    parent.addConstraint(botSideConstraint) 
} 
+0

スクロールインジケーターを隠して、ラベルが圧縮されているかどうかを確認できますか? self.tableView.showsHorizo​​ntalScrollIndicator = falseです。また、barScrollContentView、elementView、および下のラベルのフレームを印刷できますか?それらのどれが予想される高さを得ていないかを調べる。 – 7vikram7

答えて

1

barScrollContentViewに2つの制約を追加してみてください:Center Y (Vertically in container) and fixed width。これは私が思うあなたの問題を解決する可能性があります。

+0

私は水平スクロールビューを持っているので固定幅は可能ではありません。スクロールフリーズを固定した高さで、私は再びセンターを試みます(前にそれを試しましたが、その時に他の問題があった)。 – Warpzit

+0

固定幅を与えるべきです。その制約の定数を増やして必要に応じて増やすことができます。新しいビューの増加幅の制約の定数を追加ビューのサイズとして追加するとき – Lion

+0

はい、それは実際には動的なアプローチではありません...私はサイズを調整するために自動レイアウトを使用したいと思っていました。とにかく中央はそれをしました:D、何も必要ありません、それは単に不足している平和でした。どうもありがとう。 – Warpzit

関連する問題