私は、コンテンツビューで作業中のUIScrollViewを水平にスクロールできます。私は私が見つけたすべてのオンラインリソースとスクロールに関連するすべての作品に従ってきました...私の問題は、contentviewの中に入れられたコンテンツは、UIScrollViewsの底部に塗りつぶされないということです。スクロールバーが5〜10ピクセル下を占めるようなので、コンテンツがそこに伸びることはありません。UIScrollView内でcontentviewを取得して、autolayoutを親に塗りつぶす方法
添付のサンプル画像では、テキスト全体がバーに沿って整列していないことがわかります。すべてのアイテムが同じ方法で追加されますが、小さなスクロールエリア内にはUIScrollViewが親として存在します。残念ながら、自動レイアウト制約を使用する代わりにフレームとコンテンツ領域を設定すると、これは問題ではありませんでした。
:すべてが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)
}
を
スクロールインジケーターを隠して、ラベルが圧縮されているかどうかを確認できますか? self.tableView.showsHorizontalScrollIndicator = falseです。また、barScrollContentView、elementView、および下のラベルのフレームを印刷できますか?それらのどれが予想される高さを得ていないかを調べる。 – 7vikram7