UIScrollView 子视图在与 UITapGestureRecognizer 结合使用时释放(移除)内存

Posted

技术标签:

【中文标题】UIScrollView 子视图在与 UITapGestureRecognizer 结合使用时释放(移除)内存【英文标题】:UIScrollView subview is memory released (removed) when it's used in conjunction with UITapGestureRecognizer 【发布时间】:2013-11-01 20:35:31 【问题描述】:

例子很简单,将一堆UIImageViews作为子视图添加到UIScrollView

for(NSDictionary *dict in info) 
    UIImageView *imageview = [[UIImageView alloc] initWithImage:image];
    imageview.frame = CGRectMake(x, 0, 91, 91);

    [self.scrollView addSubview:imageview];
        x+=95;
        [self.scrollView setContentSize:CGSizeMake(x, 91.0)];
        //define gestures
        //single tap for wide display
        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(wideDisplay:)];
        imageview.userInteractionEnabled = YES;
        [imageview addGestureRecognizer:singleTap];

单击UIImageView 后,它会被发送到wideDisplay: 方法以广泛显示:

-(void)wideDisplay:(UITapGestureRecognizer*)gesture

    UAModalPanel *wideScreen = [[UAModalPanel alloc] initWithFrame:self.view.bounds];
    wideScreen.padding = UIEdgeInsetsMake(20.0, 20.0, 20.0, 20.0);

    self.imageView = [[UIImageView alloc]init];
    self.imageView = (UIImageView*)gesture.view;
    self.imageView.frame = CGRectMake(20, 20, 790, 500);

    [wideScreen.contentView addSubview:self.imageView];
    [self.view addSubview:wideScreen];    


将 imageView 添加到模态视图后,此 UIImageView 将从滚动视图子视图中删除。 imageView 是一个强大的属性,但尽管如此,它似乎在添加到自定义模态视图后失去了引用,如何防止它在选择后从滚动视图中删除?

【问题讨论】:

【参考方案1】:

你不是每次调用-wideDisplay:时都在处理和创建self.imageView吗?

【讨论】:

是的,如下图,每次选择UIImageView,调用wideDisplay:方法,都会实例化self.imageView 不明白为什么子视图在使用后会从滚动视图中释放出来 视图一次只能有一个超级视图。您将图像视图从self.scrollView(在第一个代码sn-p 中添加的位置)移动到widescreen.contentView。如果将其移至widescreen.contentView,则会从self.scrollView 中删除 您还创建了一个视图[[UIImageView alloc] init],然后通过重新分配self.imageView 立即丢弃该视图

以上是关于UIScrollView 子视图在与 UITapGestureRecognizer 结合使用时释放(移除)内存的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 子视图中滚动事件的锁定处理(在 UIScrollView 超级视图内)

UIScrollView 在视图出现之前不会接受子视图

固定 UIScrollView 的子视图,而其他子视图可滚动

记录 UIScrollView 的子视图会显示未添加的子视图

如何将 UIPanGestureRecognizer 添加到 UIScrollView 子视图

防止 UIScrollView 向子视图发送触摸