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 【问题描述】:例子很简单,将一堆UIImageView
s作为子视图添加到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 的子视图会显示未添加的子视图