addSubview 更改 scroll.subviews 中一个对象的索引

Posted

技术标签:

【中文标题】addSubview 更改 scroll.subviews 中一个对象的索引【英文标题】:addSubview change the index of one object in scroll.subviews 【发布时间】:2013-01-09 16:08:40 【问题描述】:

我在循环 FOR 内的 UIScrollView 中添加对象,但在第二次交互之后,subviews 的索引发生了变化。

当我创建ScrollView:

scroll.subviews :(
"<UIImageView: 0x147aeee0; frame = (1017 186; 7 5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x147aef50>>",
"<UIImageView: 0x147aefa0; frame = (1019 184; 5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x147af010>>"

)

在我使用[scroll addSubview:btn]; 完成循环之后

第一

scroll.subviews :(
"<UIImageView: 0x147aeee0; frame = (1017 186; 7 5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x147aef50>>",
"<UIImageView: 0x147aefa0; frame = (1019 184; 5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x147af010>>",
"<ContentButton: 0x13fdc610; baseClass = UIButton; frame = (15 10; 221 173); opaque = NO; tag = 1; layer = <CALayer: 0x1034cc00>>"

)

第二个(将最后一个对象更改为索引 0

scroll.subviews :(
"<ContentButton: 0x13fdc610; baseClass = UIButton; frame = (15 10; 221 173); opaque = NO; tag = 1; layer = <CALayer: 0x1034cc00>>",
"<UIImageView: 0x147aefa0; frame = (1019 184; 5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x147af010>>",
"<UIImageView: 0x147aeee0; frame = (1017 186; 7 5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x147aef50>>",
"<ContentButton: 0x105ddf70; baseClass = UIButton; frame = (246 10; 221 173); opaque = NO; tag = 149; layer = <CALayer: 0x105523e0>>"

)

以此类推,对象会正常添加(在最后一个索引中)

scroll.subviews :(
"<ContentButton: 0x13fdc610; baseClass = UIButton; frame = (15 10; 221 173); opaque = NO; tag = 1; layer = <CALayer: 0x1034cc00>>",
"<UIImageView: 0x147aefa0; frame = (1019 184; 5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x147af010>>",
"<UIImageView: 0x147aeee0; frame = (1017 186; 7 5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x147aef50>>",
"<ContentButton: 0x105ddf70; baseClass = UIButton; frame = (246 10; 221 173); opaque = NO; tag = 149; layer = <CALayer: 0x105523e0>>",
"<ContentButton: 0x13f1dc80; baseClass = UIButton; frame = (477 10; 221 173); opaque = NO; tag = 3; layer = <CALayer: 0x13f1dd20>>"

)

问题出在第二次交互,为什么最后一个对象(ContentButton)在索引2,变成索引0?

for (obj * objScroll in arrayChaObj)
                    
        // UIButton
        ContentButton * btn = [[ContentButton alloc] initWithFrame:CGRectMake(btContentPosXChaObj,
                                                                    10,
                                                                    imgButtonScroll.size.width,
                                                                    imgButtonScroll.size.height)];

        btContentPosXChaObj += 10 + imgButtonScroll.size.width;
        [scroll addSubview:btn];

        NSLog(@"scroll.subviews :%@",scroll.subviews);
        [scroll setContentSize:CGSizeMake(btContentPosXChaObj, imgButtonScroll.size.height+10)];
    

【问题讨论】:

添加按钮或更改内容大小时会发生这种情况吗? 感谢您的问题,我只是想知道,是因为内容大小,如果我评论“setContentSize”是好的,并且索引没有改变......但我不明白为什么跨度> 【参考方案1】:

这只是一个疯狂的猜测。

当您第一次拨打setContentSize: 时会发生什么?好吧,这两个图像视图最终位于内容区域之外。它们永远不会显示。

我猜滚动视图会优化子视图的顺序并将不可见的子视图放在最后,这可能会改善其剪辑(重绘)功能。

目前我没有时间检查和实验,但这对我来说是一个合理的解释。

【讨论】:

如果这是真的,可惜它没有记录在案。 可能是真的,我把“setContentSize”放在“addSubview”之前,很好。 (我会等待有人确认这是一个确切的答案)谢谢 @silvaric 为什么一开始就有超出内容范围的视图? 我不知道,第一个 NSLog 是在创建滚动(分配)之后,我只添加了“ContentButton”

以上是关于addSubview 更改 scroll.subviews 中一个对象的索引的主要内容,如果未能解决你的问题,请参考以下文章

正确使用 addSubView?

如何更改 Uipickerview 位置?

self.view.addSubview 和 view.addSubview 的区别

更改元素的顺序

不能“addSubView”

如何以编程方式更改布局边距