2016-04-18 15 views
0

わかりやすくなるようにコードを削除しました。純粋な自動レイアウト制約でUIScrollerViewを作成できません

コントローラがあり、純粋な自動レイアウトを使用して簡単なスクロールバーを追加したいとします。次のように

あなたは(以下に)私の機能ツールを呼び出すことができます。

// Create scroll view 
let strip = addStripCategoryTo(view) 

// Attach it to the view, vertically and horizontally 
strip.topAnchor.constraintEqualToAnchor(view.topAnchor).active = true 
strip.leftAnchor.constraintEqualToAnchor(view.leftAnchor).active = true 


// The function 
func addStripCategoryTo(parent: UIView) -> UIView { 

    let h:CGFloat = 128 
    let w = 2*h/3 
    let n = 5 
    let width = w * CGFloat(n) 
    let height = h 

    // Scroll view 
    let scrollview = UIScrollView() 
    parent.addSubview(scrollview) 

    scrollview.scrollEnabled = true 
    scrollview.translatesAutoresizingMaskIntoConstraints = false 
    scrollview.widthAnchor .constraintEqualToAnchor(parent.widthAnchor).active = true 
    scrollview.heightAnchor.constraintEqualToConstant(h).active = true 

    scrollview.layer.borderWidth = 2 
    scrollview.layer.borderColor = UIColor.greenColor().CGColor 
    scrollview.backgroundColor = UIColor.brownColor() 

    // Scroll view content 
    let contentView = UIView() //frame:CGRect(origin: CGPointZero, size:CGSize(width: width, height: height))) 
    scrollview.addSubview(contentView) 
    contentView.backgroundColor = UIColor.redColor() 
    contentView.layer.borderWidth = 10 
    contentView.layer.borderColor = UIColor.blueColor().CGColor 
    contentView.translatesAutoresizingMaskIntoConstraints = false 
    contentView.centerYAnchor.constraintEqualToAnchor(scrollview.centerYAnchor).active = true 
    contentView.widthAnchor .constraintEqualToConstant(width).active = true 
    contentView.heightAnchor.constraintEqualToConstant(height).active = true 

    return scrollview 
} 

残念ながら、私は次のようにスクリーンショットを参照して、水平方向にスクロールすることはできません。

enter image description here

私は何をしないのです?

答えて

0

完全なコードは私の問題の解決策です。私は以下のような問題を解決するためのツールの機能を提供:

func setScrollViewConstraints(scrollView: UIScrollView, contentView:UIView, multiplier m:(width:CGFloat, height:CGFloat)=(1, 1)) { 

    guard let scrollViewParent = scrollView.superview else { 
     assert(false, "setScrollViewConstraints() requires the scrollview to have a superview") 
     return 
    } 

    guard let contentViewParent = contentView.superview else { 
     assert(false, "setScrollViewConstraints() requires the contentView to have a superview") 
     return 
    } 

    guard contentViewParent == scrollView else { 
     assert(false, "setScrollViewConstraints() requires the contentView to have a superview being the scrollView") 
     return 
    } 

    scrollView.translatesAutoresizingMaskIntoConstraints = false 
    scrollView.widthAnchor .constraintEqualToAnchor(scrollViewParent.widthAnchor, multiplier: m.width).active = true 
    scrollView.heightAnchor .constraintEqualToAnchor(scrollViewParent.heightAnchor, multiplier: m.height).active = true 


    contentView.translatesAutoresizingMaskIntoConstraints = false 
    contentView.leftAnchor .constraintEqualToAnchor(contentViewParent.leftAnchor  ).active = true 
    contentView.rightAnchor .constraintEqualToAnchor(contentViewParent.rightAnchor ).active = true 
    contentView.topAnchor .constraintEqualToAnchor(contentViewParent.topAnchor  ).active = true 
    contentView.bottomAnchor.constraintEqualToAnchor(contentViewParent.bottomAnchor ).active = true 

    /* 

// Pre-iOS 9 version 

let views = [ 
"scrollView":scrollview, 
"contentView":contentView 
] 

parent.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollView]|", options:[], metrics: [:], views:views)) 
parent.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options:[], metrics: [:], views:views)) 

scrollview.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[contentView]|", options:[], metrics: [:], views:views)) 
scrollview.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[contentView]|", options:[], metrics: [:], views:views)) 
*/ 

} 

は、スクロールビューの100%幅のスーパービューとその高さの1/4を持つために、このようにそれを使用します。

func addStripCategoryTo(parent: UIView) -> UIView { 

    // Scroll view 
    let scrollview = UIScrollView() 
    parent.addSubview(scrollview) 

    scrollview.backgroundColor = UIColor.brownColor() 
    scrollview.layer.borderWidth = 2 
    scrollview.layer.borderColor = UIColor.greenColor().CGColor 

    // Scroll view content 
    let contentView = UIImageView() 
    contentView.image = UIImage(named: "cover-0.jpeg") 
    scrollview.addSubview(contentView) 

    contentView.backgroundColor = UIColor.redColor() 
    contentView.layer.borderWidth = 10 
    contentView.layer.borderColor = UIColor.blueColor().CGColor 

    // Apply constraints 
    setScrollViewConstraints(scrollview, contentView:contentView, multiplier: (1, 0.25)) 

    return scrollview 
} 
0

あなたの制約は、このようにする必要があり

Scrollview - トップ、ボトム、

ContentView末尾、主要 - トップ、容器内の底部、先頭、末尾、固定幅、垂直中心(中心y)を

とあなたのコンテンツビューの幅が、その後も、あなたはそれが役立つかどうかを確認し、これはこれを試してみると、これに答えるために行く:)

+0

それはdoesnの私のコードとスクリーンショットから1行抜けた行を追加しました。 –

+0

ユーザインタラクションを有効にしようとするこの行を追加する、 'scrollview.userInteractionEnabled = true'わからないが解決できるかどうか試してみる – Lion

+0

同じこと、スクロールしない。 –

0

を助ける水平 希望をスクロールすることができ、画面の幅よりも大きくなければなりませんs。 contentView.leadingAnchor.constraintEqualToAnchor(scrollview.leadingAnchor).active = true contentView.trailingAnchor.constraintEqualToAnchor(scrollview.trailingAnchor).active = true

問題は、これら2つの制約なしに、scrollViewにはないということです:水平方向にスクロールするために行う必要があり、これらの2行を追加

:質問は良く答える

EDIT 、古い答えはを削除しましたそのコンテンツを知ってください。そのため、あなたがコンテンツを与えたとしても、スクロールしないでください。そのcontentViewの開始位置と終了位置をscrollViewに知らせておく必要があります。これらの2つの制約は、scrollViewがcontentsView幅の大きさを知るのに役立ちます。もしそうでなければ、scrollViewのcontentSizeはデバイスの幅と同じに留まり、contentViewはデバイスの画面よりも幅が広いのでオフスクリーンで表示されます。

これは役に立ちました。機能ここで

func addStripCategoryTo(parent: UIView)-> UIView { 

    let h:CGFloat = 128 
    let w = 2*h/3 
    let n = 5 
    let width = w * CGFloat(n) 
    let height = h 

    // Scroll view 
    let scrollview = UIScrollView() 
    parent.addSubview(scrollview) 

    scrollview.scrollEnabled = true 
    scrollview.translatesAutoresizingMaskIntoConstraints = false 
    scrollview.leadingAnchor.constraintEqualToAnchor(parent.leadingAnchor).active = true 
    scrollview.trailingAnchor.constraintEqualToAnchor(parent.trailingAnchor).active = true 
    scrollview.widthAnchor .constraintEqualToAnchor(parent.widthAnchor).active = true 
    scrollview.heightAnchor.constraintEqualToConstant(h).active = true 

    scrollview.layer.borderWidth = 2 
    scrollview.layer.borderColor = UIColor.greenColor().CGColor 
    scrollview.backgroundColor = UIColor.brownColor() 

    // Scroll view content 
    let contentView = UIView() //frame:CGRect(origin: CGPointZero, size:CGSize(width: width, height: height))) 
    scrollview.addSubview(contentView) 
    contentView.backgroundColor = UIColor.redColor() 
    contentView.layer.borderWidth = 10 
    contentView.layer.borderColor = UIColor.blueColor().CGColor 
    contentView.translatesAutoresizingMaskIntoConstraints = false 
    contentView.centerYAnchor.constraintEqualToAnchor(scrollview.centerYAnchor).active = true 
    contentView.leadingAnchor.constraintEqualToAnchor(scrollview.leadingAnchor).active = true 
    contentView.trailingAnchor.constraintEqualToAnchor(scrollview.trailingAnchor).active = true 
    contentView.widthAnchor.constraintEqualToConstant(width).active = true 
    contentView.heightAnchor.constraintEqualToConstant(height).active = true 

    return scrollview 
} 
+0

これは質問に答えません。 –

+0

水平にスクロールする方法と、自動レイアウトでscrollViewを構築する方法と、水平方向にスクロールする方法についてのヒントを紹介しました。私は何を取りこぼしたか? – iOSnewb

+0

気にしない、今見ている。 – iOSnewb

関連する問題