2016-08-24 64 views
1

我有一个UIScrollView我已经添加了子视图的UIStackView。子视图不可滚动,但如果我添加按钮而不是UIViews,堆栈视图可滚动。此代码出现在分割视图控制器的详细视图中。任何想法为什么子视图不滚动? 顺便说一句,detailItem将携带索引,但现在我对索引[4]进行硬编码以获得有保证的长卷轴列表。UIStackView的子视图不滚动

import UIKit 

class DetailViewController: UIViewController { 

    var scrollView: UIScrollView! 
    var stackView: UIStackView! 

    var detailItem: AnyObject? { 
     didSet { 
     // Update the view. 
    // self.configureView() 
    // print("didSet: configureView") 
     } 
    } 

override func viewDidLoad() { 
    super.viewDidLoad() 

    scrollView = UIScrollView() 
    scrollView.translatesAutoresizingMaskIntoConstraints = false 
    view.addSubview(scrollView) 

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


    stackView = UIStackView() 
    stackView.translatesAutoresizingMaskIntoConstraints = false 
    stackView.axis = .Vertical 

    scrollView.addSubview(stackView) 

    scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[stackView]|", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView])) 
    scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[stackView]", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView])) 
/* 
    for _ in 1 ..< 100 { 
     let vw = UIButton(type: UIButtonType.System) 
     vw.setTitle("Button", forState: .Normal) 
     stackView.addArrangedSubview(vw) 
    } 
*/ 

    let selectedGroup: Group = GroupArray[4] 

    let descriptorsArray = selectedGroup.descriptorsArray 

    for descriptor in descriptorsArray { 
     // Create a subview for each descriptor 

     let subView = UIView() 
     subView.frame = CGRectMake(0 , 0, self.view.frame.width-10, 50) 
     subView.backgroundColor = UIColor.yellowColor() 

     subView.heightAnchor.constraintEqualToConstant(50.0).active = true 
     // Create a label for Descriptor subview 
     let label = UILabel(frame: CGRectMake(20, 0, 200, 46)) 
     label.text = descriptor.name 
     label.font = UIFont.boldSystemFontOfSize(22.0) 
     label.textAlignment = .Left 
     label.textColor = UIColor.brownColor() 

     subView.addSubview(label) 
     // Create a button for Checkbox 

     stackView.addArrangedSubview(subView) 

    } 
} 

}

回答

1

你缺少约束:

scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[stackView]|", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView])) 
scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[stackView]", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView])) 

你忘了脚堆栈视图滚动视图的底部。没有这个,滚动视图没有contentSize。没有contentSize,没有滚动。

+0

感谢,马特。你提醒过我之前用过的内容尝试了一些东西,但是它不起作用,因为之前我没有适当的限制。我添加了这一行,它滚动:'scrollView.contentSize = CGSizeMake(400,1000)' – Jolly

0

@Jolly您可以尝试ScrollableStackViewhttps://github.com/gurhub/ScrollableStackView

这是Objective-C和斯威夫特兼容库。它通过CocoaPods提供。

示例代码

import ScrollableStackView 

var scrollable = ScrollableStackView(frame: view.frame) 
view.addSubview(scrollable) 

// add your views with 
let rectangle = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 55)) 
rectangle.backgroundColor = UIColor.blue 
scrollable.stackView.addArrangedSubview(rectangle) 
// ...