【发布时间】:2011-06-16 02:50:39
【问题描述】:
我正试图在UIScrollView 被捏缩缩小到超出其最小缩放限制并且即将动画回来时收到通知,但我发现这非常困难。有没有办法单独使用 delegate 方法来做到这一点,还是我需要覆盖 UIScrollView's 触摸处理?
【问题讨论】:
标签: ios uiscrollview uiscrollviewdelegate
我正试图在UIScrollView 被捏缩缩小到超出其最小缩放限制并且即将动画回来时收到通知,但我发现这非常困难。有没有办法单独使用 delegate 方法来做到这一点,还是我需要覆盖 UIScrollView's 触摸处理?
【问题讨论】:
标签: ios uiscrollview uiscrollviewdelegate
使用scrollViewDidZoom: 并检查是否scrollView.zoomBouncing == YES。然后使用zoomScale 来确定视图弹跳的方向。
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
if (scrollView.zoomBouncing) {
if (scrollView.zoomScale == scrollView.maximumZoomScale) {
NSLog(@"Bouncing back from maximum zoom");
}
else
if (scrollView.zoomScale == scrollView.minimumZoomScale) {
NSLog(@"Bouncing back from minimum zoom");
}
}
}
【讨论】:
您可以使用 UIScrollView 的 scrollViewDidZoom 委托方法来检测它即将动画返回的时刻。当视图被夹住时,您会看到scrollView.zoomScale 低于scrollView.minimumZoomScale。然后,一旦用户松开手指,scrollViewDidZoom 将再次调用scrollView.zoomScale == scrollView.minimumZoomScale,但scrollView.zooming == NO。
捕捉这一刻很好,但尝试做任何事情来抢占反弹到最小缩放比例动画似乎对我来说有非常奇怪的副作用。 :(
【讨论】:
if !scrollView.zooming && scrollView.zoomScale < 0.6 {do something}
在 Swift 4.0 中:
func scrollViewDidZoom(_ scrollView: UIScrollView) {
if scrollView.zoomScale == scrollView.minimumZoomScale
{
print("zoomed out")
}
}
这将在用户完成缩放并且 zoomScale 处于其最小可能值时调用,即当滚动视图完全缩小时。
【讨论】:
我用UIPinchGestureRecognizer 做到了。
-(void)viewDidLoad{
UIPinchGestureRecognizer *gestureRecognizer =
[[[UIPinchGestureRecognizer alloc] initWithTarget:self
action:@selector(pinched:)]
autorelease];
gestureRecognizer.delegate=self;
[self.scrollView addGestureRecognizer:gestureRecognizer];
//your code
}
-(void)pinched:(UIPinchGestureRecognizer*)gestureRecognizer{
if(gestureRecognizer.state==UIGestureRecognizerStateEnded){
//pinch ended
NSLog(@"scale: %f",scrollView.zoomScale);
}
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
【讨论】: