如何阻止正在移动的UIView?

时间:2016-01-13 09:25:13

标签: ios objective-c

如何阻止正在移动的UIView? 或者正在减速的视图。

问题是,例如:

我有一种方法可以在按钮的点击事件中更改视图的位置;同时另一个拖动事件可以改变View的位置。如果我先让拖动事件发生,那么当视图正在减速时,我会快速点击B,视图的位置会根据B后面的方法改变,但它会立即回到减速的位置并继续减速。视图不会返回到按钮B指示的位置,即使它完成减速。

代码如下。

首先我使用KVO使视图(即_topView是代码)响应tableView的contentOffset(在拖动tableView时,View会移动)。

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary<NSString *,id> *)change context:(void *)context

{
   CGPoint contentOffset = [change[NSKeyValueChangeNewKey] CGPointValue];

   CGRect topFrame = _topView.frame;

   topFrame.origin.y = -(contentOffset.y + TOP_SECTION_HEIGHT);
   _topView.frame = topFrame;
}

然后点击buttonB,将触发下面的动画。

    topFrame = CGRectMakke(...);
[UIView animateWithDuration:1 animations:^{
        _topView.frame = topFrame;//topView
        targetTableView.contentOffset = targetViewTargetOffset;
    }];

3 个答案:

答案 0 :(得分:0)

试试这段代码会对你有所帮助。:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.1];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];

答案 1 :(得分:0)

为什么你的观点在移动?

关键是,如果它只是一个美学动画,您可以使用-snapshotViewAfterScreenUpdates:创建视图的副本,隐藏原始视图并将此快照移到其上,然后删除快照并将原始视图移动到动画的结束位置。它的内存/电池耗电很贵,但你的动画完全独立于你的KVO代码。

如果它是一个更重要的组件,通过更强的互动,您应该在KVO中添加一个标记(例如:isAnimated),以防止在启动动画时更改位置。

正如@Fogmeister所说,KVO不是动画的最佳选择,滚动视图更是如此,因为他们有代表(scrollviewDidScroll)。

答案 2 :(得分:0)

据我所知,你应该停止tableview减速,然后调用按钮事件的方法。 按下按钮时停止减速:

-(IBAction)buttonPressed:(id)sender
{
    //this will stop table view animations
    [targetTableView setContentOffset:targetTableView.contentOffset animated:NO];
    //then you can adjust the frame of a view accurately
    topFrame = CGRectMakke(...);
[UIView animateWithDuration:1 animations:^{
        _topView.frame = topFrame;//topView
        targetTableView.contentOffset = targetViewTargetOffset;
    }];
}