根据内容调整uiscrollview的大小

根据内容调整uiscrollview的大小

问题描述:

我在调整大小时遇到​​了一些问题,并且在将内容添加到我的标签时使scrollview垂直滚动。我的层次结构是这样的:根据内容调整uiscrollview的大小

my hierarchy

虽然我的看法是这样的:

my view

所以我想填写的内容标签,在我的代码在启动时,我得到的文本来自API调用。但出于测试目的,我只是对一些lorem ipsum文本进行了硬编码,以使其工作。所以我的内容被添加到标签和UILabels调整大小,我的意见,包含标签调整大小。我有问题调整我的scrollview内容,以便我可以滚动如果标签中的文本更长。另外这里是我当前的代码:

import UIKit 
import PureLayout 

class QuestionAndAnswerViewController: UIViewController { 

@IBOutlet var menuButton: UIBarButtonItem! 
@IBOutlet var questionView: UIView! 
@IBOutlet var questionLabel: UILabel! 
@IBOutlet var questionContentLabel: UILabel! 
@IBOutlet var answerView: UIView! 

@IBOutlet var odgovorLabel: UILabel! 
@IBOutlet var answerLabel: UILabel! 
@IBOutlet var signLabel: UILabel! 

@IBOutlet var lineView: UIView! 

@IBOutlet var scrollView: UIScrollView! 
@IBOutlet var contentView: UIView! 

var yPosition: CGFloat = 0.0 
var contentSize: CGFloat = 0.0 
var attrText = NSMutableAttributedString() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    scrollView.setNeedsLayout() 
    scrollView.layoutIfNeeded() 
    scrollView.translatesAutoresizingMaskIntoConstraints = false 


    let paragraphStyle = NSMutableParagraphStyle() 
    paragraphStyle.lineSpacing = 5 
    paragraphStyle.alignment = .justified 

    let paragraphStyle2 = NSMutableParagraphStyle() 
    paragraphStyle2.lineSpacing = 5 
    paragraphStyle2.alignment = .left 


    if self.revealViewController() != nil { 
     self.revealViewController().frontViewShadowRadius = 5.0 
     self.revealViewController().frontViewShadowOpacity = 0.25 
     menuButton.target = self.revealViewController() 
     menuButton.action = #selector(SWRevealViewController.rightRevealToggle(_:)) 
     self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()) 
    } 

    var text = "To je prvo vprašanje? Kako dolgi je lahko ta tekst da se poravna" 
    attrText = NSMutableAttributedString(string: text) 
    attrText.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle2, range: NSMakeRange(0, attrText.length)) 
    questionLabel.attributedText = attrText 


    text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut quis mi nisi. Etiam nec augue id dui blandit ornare. Nulla auctor, purus vel tincidunt ultricies, enim turpis molestie augue, nec mattis libero ante mattis mauris. Suspendisse posuere, velit posuere viverra feugiat, nulla justo bibendum nisi, nec ultricies lorem enim in nisl. Nunc sit amet quam mollis, faucibus felis eu, posuere dui. Sed vel mattis neque. Fusce elementum at nisl ut volutpat. Nam placerat consequat mi in lacinia. Morbi ut est tristique, efficitur est a, faucibus erat. Suspendisse et ligula ac lacus porttitor pretium ut vehicula felis." 
    attrText = NSMutableAttributedString(string: text) 

    attrText.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, attrText.length)) 
    questionContentLabel.attributedText = attrText 


    text = "Cras auctor ullamcorper ullamcorper. Vestibulum dignissim quis risus eget congue. Sed et diam libero. Phasellus non lectus sem. Cras auctor ullamcorper ullamcorper. Vestibulum dignissim quis risus eget congue. Sed et diam libero. Phasellus non lectus sem. Cras auctor ullamcorper ullamcorper. Vestibulum dignissim quis risus eget congue. Sed et diam libero. Phasellus non lectus sem. Cras auctor ullamcorper ullamcorper. Vestibulum dignissim quis risus eget congue. Sed et diam libero. Phasellus non lectus sem." 
    attrText = NSMutableAttributedString(string: text) 
    attrText.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, attrText.length)) 
    answerLabel.attributedText = attrText 

    setupConstraints() 

    contentView.frame = CGRect(x: contentView.frame.origin.x, y: contentView.frame.origin.y, width: contentView.frame.width, height: 2000) 
    scrollView.contentSize = CGSize(width: contentView.frame.width, height: 2000) 

    print(scrollView.contentSize) 
} 


func setupConstraints() { 


    //Question Contstraints 
    questionView.autoPinEdge(.top, to: .top, of: contentView, withOffset: 30) 
    questionView.autoPinEdge(.left, to: .left, of: contentView, withOffset: 0) 
    questionView.autoPinEdge(.right, to: .right, of: contentView, withOffset: 0) 

    questionView.autoPinEdge(.top, to: .top, of: questionLabel, withOffset: -10) 
    questionLabel.autoPinEdge(.right, to: .right, of: questionView, withOffset: -20) 
    questionLabel.autoPinEdge(.left, to: .left, of: questionView, withOffset: 20) 

    lineView.autoPinEdge(.top, to: .bottom, of: questionLabel, withOffset: 20) 
    lineView.autoPinEdge(.left, to: .left, of: questionView, withOffset: 20) 
    lineView.autoPinEdge(.right, to: .right, of: questionView, withOffset: -20) 
    lineView.autoSetDimensions(to: CGSize(width: lineView.frame.width, height: 2)) 

    questionContentLabel.autoPinEdge(.top, to: .bottom, of: lineView, withOffset: 20) 
    questionContentLabel.autoPinEdge(.right, to: .right, of: questionView, withOffset: -20) 
    questionContentLabel.autoPinEdge(.left, to: .left, of: questionView, withOffset: 20) 
    questionView.autoPinEdge(.bottom, to: .bottom, of: questionContentLabel, withOffset: 20) 


    //Anwser Constraints 
    answerView.autoPinEdge(.top, to: .bottom, of: questionView, withOffset: 10) 
    answerView.autoPinEdge(.left, to: .left, of: contentView, withOffset: 0) 
    answerView.autoPinEdge(.right, to: .right, of: contentView, withOffset: 0) 


    odgovorLabel.autoPinEdge(.top, to: .top, of: answerView, withOffset: 10) 
    odgovorLabel.autoPinEdge(.left, to: .left, of: answerView, withOffset: 20) 
    odgovorLabel.autoPinEdge(.right, to: .right, of: answerView, withOffset: -20) 

    answerLabel.autoPinEdge(.top, to: .bottom, of: odgovorLabel, withOffset: 20) 
    answerLabel.autoPinEdge(.left, to: .left, of: answerView, withOffset: 20) 
    answerLabel.autoPinEdge(.right, to: .right, of: answerView, withOffset: -20) 

    signLabel.autoPinEdge(.top, to: .bottom, of: answerLabel, withOffset: 20) 
    signLabel.autoPinEdge(.left, to: .left, of: answerView, withOffset: 20) 
    signLabel.autoPinEdge(.right, to: .right, of: answerView, withOffset: -20) 

    contentView.autoPinEdge(.bottom, to: .bottom, of: answerView) 

    //answerView.autoPinEdge(.bottom, to: .bottom, of: signLabel, withOffset: 20) 

} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func backButtonPressed(_ sender: Any) { 
    navigationController?.popViewController(animated: true) 
} 
} 

我还使用PureLayout,因为这是我能够基于文本的长度,使我的标签和视图调整大小的唯一途径。

我不知道你在故事板scrollViewcontentView设置什么限制,我必须说,我有点好奇,为什么使用直接设置帧为他们viewDidLayout

contentView.frame = CGRect(x: contentView.frame.origin.x, y: contentView.frame.origin.y, width: contentView.frame.width, height: 2000) 
scrollView.contentSize = CGSize(width: contentView.frame.width, height: 2000) 

您希望自动计算此值,对不对?

我做什么,当我需要一个滚动视图:

  1. 我添加scrollView的层次结构,并使用自动布局适当布置它,例如,如果它应该覆盖viewController整个view

    scrollView.translatesAutoresizingMaskIntoConstraints = false 
    
    scrollView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true 
    scrollView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true 
    scrollView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true 
    scrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 
    
  2. 然后,我需要一个contentView添加到scrollView并为其提供适当的布局限制,所以如果我想垂直滚动scrollView我n个I上面开始的实例中,我需要以下自动布局约束:这里

    contentView.translatesAutoresizingMaskIntoConstraints = false 
    
    contentView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true 
    contentView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true 
    contentView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true 
    contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true 
    

    注意,我制约leftAnchorcontentViewrightAnchorself.view而非scrollView,使其固定的宽度。但是,顶部和底部的锚点限制为scrollView,因此当contentView需要更多空间时,它们会展开和滚动。

  3. 现在我添加到contentView所有我想要的内容,和我躺在它使用自动版式仿佛contentView是具有无限高度视图 - scrollView将采取滚动展示它整个的照顾。所以在我的例子中,如果仅有的内容将是一个巨大的UILabel有许多行:

    label.translatesAutoresizingMaskIntoConstraints = false 
    
    label.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true 
    label.rightAnchor.constraint(equalTo: contentView.rightAnchor).isActive = true 
    label.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true 
    label.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true 
    

尝试去在你的代码,并检查您的约束(我使用自动布局写了我的紧张,但我猜你应该能够很容易地将它们翻译成PureLayout和故事板)。