scrollview仅显示最后添加的子视图
我得到奇怪的行为与UIScrollView
子视图,这个想法是以编程方式创建一个UIView
的实例与自定义nib文件,这是一种形式在我的情况下,用模型类的数据填充该表单,并将其添加为我的UIScrollView
。 问题是当我处理多个子视图时, UIScrollView
只保留最新的子视图,所以如果我创建了三个子视图,那么scrollview将只显示第三个(最新)子视图。 尽管页面控件被设置为子视图的核心数量(三个)。
这个项目太长了,所以我会尝试用相关的代码简单地解释我的问题:
- (void)viewDidLoad {
NSArray *sorted = [appArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];//this array contains the data from model, I debugged that to make sure I got the exact data, no more no less :)
//Loop all NSManaged objects, for example let's say I have 3 model objects, don't worry about how I get data etc, because I debugged all and maked sure all data objects number are exact, etc.
for (App_Table *_appTable in sorted) {
//This looped 3 times as expected, I debugged that also and maked sure on each iteration I got the data I expected to have
//App_Table is a subclass of NSManagedObject, it's my model class and get its data from coredata file
[self addMoreView];//Call this method will create a new subview and add it as subview to the UIScrollView, it will also update the page control, update the content size property, etc.
AppTableView *_appTableView = (AppTableView *) [[self.scrollView subviews] lastObject];//Remember addMoreView method create a new instance of AppTableView and add it as subview for the UIScrollView property, then I get that subview to fill it with data here
_appTableView.txtADDRESS.text = _appTable.address;//Fill in the form, no need to write all the form fields code because it's the same way.
// Scroll To First Page...
self.pageControl.currentPage = 0;
[self.scrollView scrollRectToVisible:CGRectMake(0, 0, viewWidth, viewHeight) animated:YES];
self.scrollView.contentSize = CGSizeMake(viewWidth*noOfItems, viewHeight);//Set the content size to the sum of subviews width, I also debugged that to check it's correct
self.scrollView.delegate = self;
[super viewDidLoad];
}
好的,所以当我有三个子视图时,滚动视图将加载三个子视图的宽度,如上面的行所计算的那样:
self.scrollView.contentSize = CGSizeMake(viewWidth*noOfItems, viewHeight);//Set the content size to the sum of subviews width, I also debugged that to check it's correct
我可以滚动到3次移动(这是子视图的数量), UIPageControl
也设置为三个点, 但只有一个子视图可见 ,只有最新的一个可以看到,其他两个子视图消失,滚动视图计算内容大小,但它们不可见。 有什么想法吗 ? 感谢名单。
编辑:
值得注意的是,我第一次编辑视图时,一切正常,当我处理3个子视图时,它们都是可见的,但是当我转到另一个视图并返回到此视图时,只有最后一个子视图可见。
另外,我正在为分裂视图的iPad项目工作。
编辑:这是为UIScrollView
绘制新的子视图的方法的代码
-(IBAction) addMoreView
{
NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"AppTableView" owner:self options:nil];
AppTableView *aView = [arr objectAtIndex:0];
[aView setFrame:CGRectMake(startX, 0, aView.bounds.size.width, aView.bounds.size.height)];
[self.scrollView addSubview:aView];
self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width+aView.frame.size.width
, self.scrollView.contentSize.height);
startX = startX + aView.frame.size.width;//Update the X position, first 0, then 600, 1200, and so on.
[self.scrollView scrollRectToVisible:aView.frame animated:YES];
NSLog(@"%f",self.scrollView.contentSize.width);
NSLog(@"%f",self.scrollView.contentSize.height);
}
假设我有3个子视图,上面的方法会被放到for
循环中被调用3次。 所以这里是上述方法的NSLogs
的结果:
NSLog(@"%f",self.scrollView.contentSize.width);
NSLog(@"%f",self.scrollView.contentSize.height);
First iteration:
600.000000
0.000000
Second iteration:
1200.000000
0.000000
Third iteration:
1800.000000
0.000000
编辑:
rob mayoff建议的命令让我明白为什么会发生这种情况:
| | | | <AppTableView: 0x1eef4700; frame = (0 18; 600 430); autoresize = LM+RM+TM+BM; tag = 990; layer = <CALayer: 0x1eef4790>>
| | | | <AppTableView: 0x1ee3f380; frame = (0 18; 600 430); autoresize = LM+RM+TM+BM; tag = 991; layer = <CALayer: 0x1ee3f410>>
| | | | <AppTableView: 0x1ee56910; frame = (0 18; 600 430); autoresize = LM+RM+TM+BM; tag = 992; layer = <CALayer: 0x1ee3f410>>
所有三个子视图都是在同一个框架中绘制的,所以它们在彼此之上,但是当我在运行时用断点调试时, x
会发生变化,第一次是0,然后是600,然后是1200,这使我认为它正在绘制正确。 如何解决这个问题,尤其是x值是否正确增加,那么问题是什么以及为什么他们仍然在同一个x坐标上绘图?
首先,您应该将[super viewDidLoad]
调用放置在- (void)viewDidLoad
方法的顶部,而不是放在底部。
鉴于目前尚不清楚您实际看到的以及您期望看到的内容,请将您的问题作为可下载项目的最低工作示例帮助我们为您提供帮助。 如果您只是尝试在不与托管对象交互的单独视图控制器中重现此操作,但使用一些静态提供的数据,其他人将能够自行重现并调试它。 或者你也可以在这个过程中自己弄明白。
我回来的时间有点晚,但最后我找出了解决问题的方法,所以认为分享它以节省别人的时间是件好事。
对我而言,scrollview是一个nib文件中的自定义视图。 所以通过激活左边和上边的Autosizing蒙版,这个bug得到修复。
-addMoreView
中的-addMoreView
代码是问题所在:
AppTableView *aView = [arr objectAtIndex:0];
[aView setFrame:CGRectMake(startX, 0, aView.bounds.size.width, aView.bounds.size.height)];
[self.scrollView addSubview:aView];
如果startX
永远不会改变,那么您将在同一个位置添加所有这些视图。