gpt4 book ai didi

uiview - 动画期间的 UIScrollView 触摸事件未使用 animateWithDuration : but work fine with UIView beginAnimations: 触发

转载 作者:行者123 更新时间:2023-12-03 15:09:43 24 4
gpt4 key购买 nike

我有一个 UIScrollView 子类,我使用 UIView 动画以编程方式滚动。

我希望用户能够在动画发生时点击或放大 ScrollView 的 UIImageView 内容。

这在使用类似于以下的公式时效果很好:

- (void) scrollSmoothlyatPixelsPerSecond:(float)thePixelsPerSecond {
// distance in pixels / speed in pixels per second
float animationDuration = _scrollView.contentSize.width / thePixelsPerSecond;

[UIView beginAnimations:@"scrollAnimation" context:nil];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
[UIView setAnimationDuration:animationDuration];
_scrollView.contentOffset = CGPointMake(_scrollView.contentSize.width, 0);
[UIView commitAnimations];
}

现在,从 iOS 4.0 开始,不鼓励 UIView beginAnimations:。因此,我尝试使用块和 UIView animateWithDuration 更新我的代码:滚动的工作方式与上述相同。

关键和令人抓狂的区别在于,在动画期间,UIScrollView 和其他 View 不再响应事件处理方法:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

也不:
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

尝试缩放时被调用。

为清楚起见进行编辑:没有 UIView 响应触摸事件。这不仅限于 UIScrollView。 UIScrollView 的同级 UIToolbar 不响应触摸事件,作为 UIScrollView 同级的 subview 的其他按钮也不响应。在动画进行时,整个父 UIView 似乎被卡住在用户交互之外。同样,在动画完成后,所有上述 UIViews 再次响应。

无论动画状态如何,这些都在 UIView beginAnimations: 公式中被调用。

我的 animateWithDuration: 代码略有不同 - 但差异并不重要。动画完成后,再次调用上述触摸事件...

这是我的动画代码:
- (void) scrollSmoothlyToSyncPoint:(SyncPoint *) theSyncPoint andContinue:(BOOL)theContinueFlag{

float animationDuration = theSyncPoint.time - [player currentTime];
[UIView animateWithDuration:animationDuration
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
[_scrollView setContentOffset:theSyncPoint.contentOffset];
}
completion:^(BOOL finished){
if (theContinueFlag) {
SyncPoint *aSyncPoint = [self nextSyncPoint];
if (aSyncPoint) {
[self scrollSmoothlyToSyncPoint:aSyncPoint andContinue:YES];
}
}
}];
}

在上述动画块期间触发的唯一事件处理程序是:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

所以,问题是:我应该 - 忽略 Apple 不鼓励的标签并继续使用 beginAnimation 公式吗?我应该 - 使用 hitTest 重新实现缩放和其他基于触摸的事件吗?是否有一些关于动画块之间实现差异的知识可以帮助我解决这个问题?有什么明显的东西我失踪了吗?

我是 Apple 的新开发人员,所以我不知道如何认真对待他们不鼓励的标签。但是如果这个 API 将被弃用然后消失,我宁愿朝着持久的方向前进。

非常感谢您的关注。

最佳答案

您只需要在调用动画时包含 UIViewAnimationOptionAllowUserInteraction 选项,如下所示:

[UIView animateWithDuration:animationDuration 
delay:0
options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction)
<snip>];

这是偷偷摸摸的,我知道! ;)

回复:“不鼓励”标签 - 一般来说,当 Apple 告诉您不要设计在其平台上运行的应用程序时,这通常是为了您好。所以你想要采用动画块而不是笨重的旧方式是正确的。

关于uiview - 动画期间的 UIScrollView 触摸事件未使用 animateWithDuration : but work fine with UIView beginAnimations: 触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3614116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com