2016-08-24 3 views
1

У меня есть UIScrollView, к которому я добавил UIStackView подзаголовков. Подразделы не прокручиваются, но если я добавляю кнопки вместо UIViews, то вид стека - это прокручиваемый. Этот код отображается в подробном представлении контроллера разделенного вида. Любая идея относительно того, почему subviews не прокручиваются? BTW 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 Вы можете попробовать ScrollableStackView: https://github.com/gurhub/ScrollableStackView

Это Objective-C и Swift совместимая библиотека. Он доступен через 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) 
// ... 
Смежные вопросы