条形图未缩放到BarChartView的大小

时间:2016-06-18 23:41:51

标签: ios swift uiview uiviewcontroller ios-charts

我正在使用Daniel Gindi的ios-charts库来尝试创建一个条形图。

我以编程方式创建一个红色背景的BarChartView,并用硬编码数据填充它。视图的大小正确,但条形图不能正确缩放,并在到达视图顶部时被切断。

我的观点如下

enter image description here

使用storyboard方法instantiateViewControllerWithIdentifier在scrollview中实例化此视图控制器。但是,当我将此视图控制器设置为初始视图控制器时,图表会正确缩放,如下所示:

enter image description here

为什么我的图表缩放不正确?

我还要注意,如果我将错误缩放的图形的leftAxis.axisMaxValue属性设置为大的,如100,则图形如下所示:

enter image description here

我还将提供用于创建图形的代码,减去用于设置属性和图形数据的30多行。

override func viewDidLoad(){
    var chart : UIView?
    let gBFrame = self.graphBackground.frame
    let frame = CGRect(origin: gBFrame.origin, size: CGSize(width: gBFrame.width, height: gBFrame.height-25))
    chart = BarChartView(frame: frame)
    self.view.addSubview(chart!)
    constrainChart()
}

func constrainChart(){

    if type == "Bar Chart"{            
        chart!.translatesAutoresizingMaskIntoConstraints = false
        let leftConstraint = NSLayoutConstraint(item: self.chart!, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.graphBackground, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 0)
        let rightConstraint = NSLayoutConstraint(item: self.chart!, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.graphBackground, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0)
        let topConstraint = NSLayoutConstraint(item: self.chart!, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.graphBackground, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
        let bottomConstraint = NSLayoutConstraint(item: self.chart!, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.graphBackground, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: -25)
        self.view.addConstraints([leftConstraint,rightConstraint,topConstraint,bottomConstraint])
    } else if type == "Horizontal Bar Chart"{
    } else if type == "Pie Chart"{
    } else {

    }
    chart?.layoutIfNeeded()
}

如果有帮助,我可以提供任何其他信息。

关于可能出现什么问题的任何想法?或者接下来要尝试什么?

编辑:

当我在scrollview中实例化视图控制器时,我使用NSLayoutConstraints定位它,使其左边界从滚动视图的左边界开始为2*self.view.frame.width

我发现如果我将该约束设置为0,以使具有图表的视图控制器出现在滚动视图的最左侧框架中,则图表会正确显示。但是,如果我完全改变那个约束(比如一个单位),图表会再次错误地缩放。

在我使用上述storyboard方法实例化视图控制器之后,我使用其代码如下所示的方法定位它:

func setUpQuestionFrame(newViewController: UIViewController){

    var frame = newViewController.view.frame
    frame.origin.x = self.view.frame.size.width*2
    newViewController.view.frame = frame

    self.addChildViewController(newViewController)
    self.scrollView.addSubview(newViewController.view)
    newViewController.didMoveToParentViewController(self)

    newViewController.view.translatesAutoresizingMaskIntoConstraints = false

    let widthConstraintVCBAR = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: newViewController.view, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0)
    view.addConstraint(widthConstraintVCBAR)

    let heightConstraintVCBAR = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: newViewController.view, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0)
    view.addConstraint(heightConstraintVCBAR)

    let horizontalConstraintVCBAR = NSLayoutConstraint(item: newViewController.view, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 5)//self.view.frame.width*2)
    view.addConstraint(horizontalConstraintVCBAR)

    let verticalConstraintVCBAR = NSLayoutConstraint(item:  newViewController.view, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
    view.addConstraint(verticalConstraintVCBAR)
}

1 个答案:

答案 0 :(得分:0)

通过添加chart!.notifyDataSetChanged()解决了这个问题,它告诉图表在收到新数据后重新配置。

这与this问题中使用的解决方案相同。