我创建了一个自定义 UIView,我试图让 UIPinchGestureRecognizer 处理它的大小调整。 但是当我测试我的代码时,文本在捏合时会调整大小,并且框架仍然是相同的大小。
在floatingToolbar.m中
-(void) pinchFired:(UIPinchGestureRecognizer *)recognizer{
if (recognizer.state == UIGestureRecognizerStateChanged) {
CGFloat scale = [recognizer scale];
if ([self.delegate respondsToSelector:@selector(floatingToolbar:didPinchWithScale:)]) {
[self.delegate floatingToolbar:self didPinchWithScale:scale];
}
[recognizer setScale:scale];
}
}
在SBViewController.m
-(void) floatingToolbar:(SBAwesomeFloatingToolbar *)toolbar didPinchWithScale:(CGFloat)scale{
NSLog(@"Scale is ------ %f",scale);
CGAffineTransform currentTransform = CGAffineTransformIdentity;
CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);
toolbar.transform = newTransform;
}
最佳答案
基本上有两个问题:
更新比例
首先,我认为您想要将 [recognizer setScale:scale]
更改为 recognizer.scale = 1
。否则,随着用户继续捏合,大小将呈指数变化,而不是线性变化。
例如,使用.scale = 1
,您的日志将类似于:
Log Transform Scale
1
Scale is ------ 0.98 0.98
Scale is ------ 0.99 0.97
Scale is ------ 0.98 0.95
Scale is ------ 0.98 0.93
使用您当前的方法(根本不会改变比例),您的日志将如下所示:
Log Transform Scale
1
Scale is ------ 0.98 0.98
Scale is ------ 0.92 0.90
Scale is ------ 0.88 0.79
Scale is ------ 0.83 0.65
这很糟糕,因为你的 View 会收缩得太快。
使用CGAffineTransformScale
CGAffineTransformScale
(和其他 CGAffineTransform
)不会更新框架。
来自UIView
class reference在 transform
属性上:
WARNING: If this property is not the identity transform, the value of the frame property is undefined and therefore should be ignored.
如果您的工具栏依赖 frame
,则只需将工具栏的 frame
乘以 scale
的高度和宽度即可.
关于ios - UIPinchGestureRecognizer 调整自定义 UIView 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25920195/