我在将两个子视图放置在其父视图中时遇到了麻烦。它们旨在组成基本的动画条形图,并且动画部分似乎运行良好。同样,相应的条似乎准确地反映了数据。

但是,我试图将两个视图的原点基于父视图的下边缘(屏幕截图中的灰色区域),结果似乎是随机的。我希望它不是真正随机的,但我无法将其固定下来。

这是代码:

-(void) makeBarChart
{
RiserBar *thisRiser;

for(int i=0; i<2; i++)
{
    thisRiser = [[RiserBar alloc] initWithFrame:CGRectZero];
    thisRiser.tag = i+1;
    [self.chartView addSubview:thisRiser];
//    [self placeAndAnimateThisBar];
}

int barWidth = self.chartView.bounds.size.width /((2 * 2) -1);
int focusBarEndHeight = (self.chartView.bounds.size.height-20) * (focusActivityPercent / 100);
int benchmarkBarEndHeight = (self.chartView.bounds.size.height-20) * (benchmarkActivityPercent / 100);

for (thisRiser in self.chartView.subviews)
{
    switch (thisRiser.tag)
    {
        case 1:
        { [UIView animateWithDuration:1
                                  delay:.2
                                options: UIViewAnimationCurveEaseOut
                             animations:^
             {
                 thisRiser.frame = CGRectMake(20, self.chartView.frame.origin.y, barWidth, 0);
                 thisRiser.backgroundColor = [UIColor blackColor];
                 thisRiser.frame = CGRectMake(20, self.chartView.frame.origin.y, barWidth, -focusBarEndHeight);
                 thisRiser.backgroundColor = [UIColor redColor];
             }
                             completion:^(BOOL finished)
             {
                 NSLog(@"Done!");
             }];
        }
            break;
        case 2:
        {
            [UIView animateWithDuration:1
                                  delay:.2
                                options: UIViewAnimationCurveEaseOut
                             animations:^
             {
                 thisRiser.frame = CGRectMake(barWidth + 40, self.chartView.frame.origin.y, barWidth, 0);//load frame from data
                 thisRiser.backgroundColor = [UIColor blackColor];
                 thisRiser.frame = CGRectMake(barWidth + 40, self.chartView.frame.origin.y, barWidth, -benchmarkBarEndHeight);
                 thisRiser.backgroundColor = [UIColor blueColor];
             }
                             completion:^(BOOL finished)
             {
                 NSLog(@"Done!");
             }];
        }
            break;
        case 3:
            //do something to the view
            break;
            //and so on...
        default:
            break;
    }
}

}


以及生成的屏幕截图:



我应该提到,意图是使红色和蓝色条都起源于灰色父视图的底部并上升。对我来说,尚不完全清楚为什么我必须反转.height属性的极性才能实现此目的。给定此代码,为什么原点位于父视图中间附近?

有人可以指出我的错误吗?

谢谢!

根据@Rob在答案2中的柔和指导进行编辑:

这是对代码相关部分的更改,还受this slideshow中的信息的影响,我强烈建议像我这样喜欢图片而不是详细说明的人使用该信息:

switch (thisRiser.tag)
{
    case 1:
    { [UIView animateWithDuration:1
                              delay:.2
                            options: UIViewAnimationCurveEaseOut
                         animations:^
         {
             thisRiser.frame = CGRectMake(20, self.chartView.frame.size.height, barWidth, 0);
             thisRiser.backgroundColor = [UIColor blackColor];
             thisRiser.frame = CGRectMake(20, self.chartView.frame.size.height, barWidth, -focusBarEndHeight);
             thisRiser.backgroundColor = [UIColor redColor];
         }
                         completion:^(BOOL finished)
         {
             NSLog(@"Done!");
         }];
    }
        break;
    case 2:
    {
        [UIView animateWithDuration:1
                              delay:.2
                            options: UIViewAnimationCurveEaseOut
                         animations:^
         {
             thisRiser.frame = CGRectMake(barWidth + 40, self.chartView.frame.size.height, barWidth, 0);//load frame from data
             thisRiser.backgroundColor = [UIColor blackColor];
             thisRiser.frame = CGRectMake(barWidth + 40, self.chartView.frame.size.height, barWidth, -benchmarkBarEndHeight);
             thisRiser.backgroundColor = [UIColor blueColor];
         }
                         completion:^(BOOL finished)
         {
             NSLog(@"Done!");
         }];
    }
        break;
    case 3:
        //do something to the view
        break;
        //and so on...
    default:
        break;
}


这是现在的样子(图中条形高度的不同是由于数据不同):



再次感谢,罗伯!

最佳答案

您有几行类似于以下内容:

thisRiser.frame = CGRectMake(20, self.chartView.frame.origin.y, barWidth, -focusBarEndHeight);


在为其子视图设置框架的上下文中使用frame.origin.ychartView没有任何意义。一个与另一个无关。提升管的frame相对于chartView,与originchartView无关。

如果您希望thisRiserchartView的高度位于focusBarEndHeight的底部,则可能需要执行以下操作:

thisRiser.frame = CGRectMake(20, self.chartView.frame.size.height - focusBarEndHeight, barWidth, focusBarEndHeight);

关于ios - 相对于父UIView的 subview 的起源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23054453/

10-11 12:15