我在将两个子视图放置在其父视图中时遇到了麻烦。它们旨在组成基本的动画条形图,并且动画部分似乎运行良好。同样,相应的条似乎准确地反映了数据。
但是,我试图将两个视图的原点基于父视图的下边缘(屏幕截图中的灰色区域),结果似乎是随机的。我希望它不是真正随机的,但我无法将其固定下来。
这是代码:
-(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.y
的chartView
没有任何意义。一个与另一个无关。提升管的frame
相对于chartView
,与origin
的chartView
无关。如果您希望
thisRiser
以chartView
的高度位于focusBarEndHeight
的底部,则可能需要执行以下操作:thisRiser.frame = CGRectMake(20, self.chartView.frame.size.height - focusBarEndHeight, barWidth, focusBarEndHeight);
关于ios - 相对于父UIView的 subview 的起源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23054453/