UIScrollView 删除子视图动画

Posted

技术标签:

【中文标题】UIScrollView 删除子视图动画【英文标题】:UIScrollView remove subview animated 【发布时间】:2012-10-31 09:03:04 【问题描述】:

我有什么: 基本上,我收集了水平滚动视图中呈现的 UIView。 UIScrollView 启用了分页,每个项目都不是全屏的,所以我可以看到上一个和下一个视图的一部分based on this. 每个视图本身都有删除按钮。

我需要什么: 在删除一个子视图后,我需要找到一个好主意来动画重新加载 UIScrollView 内容。正如我所想的那样,将有4种不同的删除方式: 1.删​​除最后一个视图 2.删除第一个视图 3.删除中间视图-最难的一个 4. 删除唯一视图 - 最简单的一种,只是视图消失的动画

我需要一些建议/解决方案。 谢谢, 迈克尔

编辑:

好的,我还没有完全实现。

这里是reload方法:

- (void)loadScrollView
for(UIView* view in [_scrollView subviews])

    [view removeFromSuperview];


CGRect frame = self.scrollView.frame;
frame.origin.x = 0;
frame.origin.y = 0;
int i = 0;

_scrollView.clipsToBounds = NO;
_scrollView.pagingEnabled = YES;
_scrollView.showsHorizontalScrollIndicator = NO;

for(MPContact* contact in self.items)

    frame.origin.x = self.scrollView.frame.size.width*i;
    MyView *view = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0];
    [view setFrame:frame];

    i++;
    [view.nameAndSurnameLabel setText:@"view text"];
    [view setDelegate:self];
    [self.scrollView addSubview:view];[self.viewsArray addObject:view];
[self.scrollView setContentSize:CGSizeMake(frame.size.width*[self.items count], frame.size.height)];

每个 MyView 都有带委托的删除按钮,委托从 viewsArray 中删除视图并暂时运行此方法。

【问题讨论】:

你能发布你的代码(相关部分)吗? 注意到您的编辑。如何给每个视图一个标签 ID,以便您可以找到视图并相应地删除它们? 我有方法创建我要删除的视图,问题是删除这个视图后如何处理其他视图(如何在scrollView的良好位置平滑动画) 【参考方案1】:

我建议你使用UIView 类的+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion 方法。只需从UIScrollView 中获取您要删除的UIView 并在animations 块中设置view.alpha = 0。在completion 块中,使用removeFromSuperView 方法从UIScrollView 中删除这个UIView。将alpha 设置为 0 将制作淡入淡出动画。

编辑: 迭代所有要移动的视图并更改它的 x 坐标。

for(UIView *view in scrollview.subviews)

    [UIView animateWithDuration:0.1 animations:^
       [view setFrame:CGRectMake(view.x-(/*HERE YOU NEED TO PUT WIDTH OF TOUR DELETING VIEW*/),view.y,view.width,view.heigh)];
   
    completion:^(BOOL finished)
    //remove view from superview and change your uiscrollview's content offset.
   ];


【讨论】:

我知道怎么做消失的动画,但是我需要重新加载 UIScrollView 的漂亮干净的动画(如果我不重新加载它会有洞,如果我这样做的话,在空洞中移动视图将没有动画) 这对我有帮助(需要对其进行编辑以处理所有 4 种删除)。谢谢 @user1315378,是的,这段代码移动了所有子视图。支持我的回答并接受它:)

以上是关于UIScrollView 删除子视图动画的主要内容,如果未能解决你的问题,请参考以下文章

内部动画时的 UIScrollView 回调

检测用户何时中断 UIScrollView 动画

如何使用自动布局在 UIScrollView 中为视图高度设置动画?

我是不是需要删除 UIScrollView 中不可见的子视图以使其平稳运行?

调整滚动视图框架的大小时,UIScrollView 子视图的大小调整不正确

防止重叠的 UIScrollView 滚动