子视图的objective-c管理顺序

Posted

技术标签:

【中文标题】子视图的objective-c管理顺序【英文标题】:objective-c managing order for subviews 【发布时间】:2011-05-31 20:51:08 【问题描述】:

我有一个带有多个 UIImage(子视图)的 UIView,其中包含用户从照片库中选择的照片。我想支持用户可以重新排列子视图顺序的功能。用户得到一个模态视图控制器,他可以在其中按顺序拖放视图并将其放置到位。但是当我想更新子视图的顺序时,什么也没有发生。唯一成功的是将我拖动到顶部的对象使用bringSubviewToFront:,但这不是我想要的。

我要使用的方法是exchangeSubviewAtIndex:i withSubviewAtIndex:index。但我无法让它工作。你们对我应该如何解决这个问题有什么建议吗?

提前致谢! 迈克尔

【问题讨论】:

你目前是如何实现exchangeSubview...方法的? 我认为在这里查看一些代码会有所帮助。您如何将子视图放在其父视图中?也就是说,UIImageView 的布局是否在 UIView 中都可见?它们是否以某种方式重叠?您是在尝试展示一堆照片之类的东西吗? 我不知道 echangeSubviewAtIndex:... 是显式调用 [view setNeedsDisplay] 还是 [view setNeedsLayout]。您可以尝试一下,还要确保您的索引有效并且在 (0- [[view subviews]count]-1) 的范围内。 这是一个应用程序,您可以在其中有一堆图像(重叠),您可以观看一系列图像。我使用ELCImagePicker,一个相机胶卷的扩展,它允许我们在相机胶卷中选择多个图像。我在字典中得到返回的图像,如下所示: for(NSDictionary *dict in info) UIImageView *thisImageView = [[UIImageView alloc] initWithImage:[dict objectForKey:UIImagePickerControllerOriginalImage]]; [array insertObject:thisImageView atIndex:[thearray count]]; [thisImageView 发布]; 然后我推送一个视图控制器,它显示了正确的图像——它显示了我的 UIView 子类 SpinnerView 在 SpinnerView 中,我布置了子视图: spinnerImages = [[NSMutableArray alloc] initWithArray:thearray]; for (UIView *object in spinnerImages) [object setContentMode:UIViewContentModeScaleAspectFit]; object.frame = self.frame; [自我添加子视图:对象]; 【参考方案1】:

您提到“将图像放到新位置”,这意味着您正在 (X,Y) 坐标系中移动 UIImageView。 subviews 数组中的索引仅在 Z 方向上对视图进行排序(如果它们重叠,则影响“在顶部”)。交换视图顺序将交换 (X,Y) 坐标。

【讨论】:

【参考方案2】:

这是一个应用程序,您可以在其中有一堆图像(重叠),您可以观看一系列图像。

我使用ELCImagePicker,一个相机胶卷的扩展,它允许我们在相机胶卷中选择多个图像。

我在字典中得到返回的图像,如下所示:

for(NSDictionary *dict in info) 
        UIImageView *thisImageView = [[UIImageView alloc] initWithImage:[dict objectForKey:UIImagePickerControllerOriginalImage]];
        [array insertObject:thisImageView atIndex:[thearray count]];
        [thisImageView release];

然后我推送一个视图控制器,它可以显示正确的图像——它显示了我的 UIView 子类 SpinnerView

在 SpinnerView 中,我布置了子视图:

spinnerImages = [[NSMutableArray alloc] initWithArray:thearray];
for (UIView *object in spinnerImages) 
    [object setContentMode:UIViewContentModeScaleAspectFit];
    object.frame = self.frame;
    [self addSubview:object];

当用户想要管理订单时,他们单击“编辑按钮”并获得一个modalViewController,它是AQGridView 库的一个实例,其工作方式类似于tableViewController,但有一些扩展。它就像一个跳板应用程序。当用户将图像“拖放”到新位置时,我会调用

[spinnerView exchangeSubviewAtIndex:_dragOriginIndex withSubviewAtIndex:index];

,就在表格更新数组之后:

// update the data store
    id obj = [[images objectAtIndex: _dragOriginIndex] retain];
    [images removeObjectAtIndex: _dragOriginIndex];
    [images insertObject: obj atIndex: index];

希望这有助于解决我的难题,让我摆脱头痛:)

【讨论】:

以上是关于子视图的objective-c管理顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective-C 中设置显示顺序

IOS/Objective-C:子视图的子视图不显示

从 SuperView 中删除子视图的问题 - Objective-C

Objective-C - 获取主窗口内容视图的所有子视图

我的 UIView 有一个 UIButton 作为它的子视图之一,但不响应 Objective-c 中的事件

关于 subview 在 Objective-C 中保留 superview 的问题