gpt4 book ai didi

iPhone UIImageView 捏合缩放

转载 作者:行者123 更新时间:2023-12-03 19:02:55 26 4
gpt4 key购买 nike

我一直在尝试使用 CGAffinTransformScale 为 PhotoView (一个 UIImageView 实例)实现捏缩放/缩小(计划使用旋转,因此不能依靠帧进行缩放,并且会添加 subview ,因此 UIScrollView 会更复杂,我思考)。无论如何,这个概念很容易掌握,代码很快就组合在一起......从那时起,我一直试图使用三种不同的方法来解决相同的两个(相关的?!)问题,但一直无法做到这一点:1-我的代码以某种方式丢失了缩放中间的触摸计数(从 count = 2 到 count = 1)并返回到 iPhone 上的触摸计数,但模拟器上没有。2- 触摸点一和触摸点二在每次移动时都会来回跳跃几个像素,导致图像连续快速地缩小和放大,尽管总体效果是按照用户意图进行缩小或放大(两者都是) iPhone 和模拟器)。

代码如下:

#import "PhotoView.h"


@implementation PhotoView;
@synthesize originalCenter, distance, zooming;
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
// Initialization code
self.userInteractionEnabled = YES;
self.multipleTouchEnabled = YES;
zooming = NO;
}
return self;
}

float distanceBetweenTwoPoints(CGPoint point1, CGPoint point2)
{
NSLog(@"point1 x: %5.2f point 2 x: %5.2f ---- point 1 y: %5.2f point 2 y: %5.2f",point1.x,point2.x,point1.y,point2.y);
return (sqrt(pow(point1.x -point2.x,2) + pow(point1.y - point2.y,2)));
}
-(void) touchesBegan: (NSSet *) touches withEvent:(UIEvent *) event {

if ([touches count] > 1) {

NSLog(@"^^^^^^^^^^^^^^^Tocuhes began with double touch!");

distance = distanceBetweenTwoPoints([[[touches allObjects] objectAtIndex:0] locationInView:self],
[[[touches allObjects] objectAtIndex:1] locationInView:self]);
zooming = YES;
}
else {
zooming = NO;
origianlCenter = [[[touches allObjects] objectAtIndex:0] locationInView:self];
NSLog(@">>>>>>>>>>>>Touches began with single touch");
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

if (zooming) NSLog(@"!!!!!!!!!end zoom!!!!!!!");

zooming = NO;
if ([[touches anyObject] tapCount] == 2) {
UITouch *thisTouch = [touches anyObject];
CGPoint thisPoint = [thisTouch locationInView:self];
}
}

- (void) touchesMoved: (NSSet *) touches withEvent:(UIEvent *) event {
if ([touches count] > 1 && zooming) { // ignore if user added a second finger touch
float distanceNew = distanceBetweenTwoPoints([[[touches allObjects] objectAtIndex:0] locationInView:self],
[[[touches allObjects] objectAtIndex:1] locationInView:self]);
if (distance <= 0.f) { // should never be true - but it is sometimes!!!
distance = distanceNew;
}
float delta = 1.0f + ((distanceNew-distance)/distance);
self.transform = CGAffineTransformScale(self.transform, delta, delta);
distance = distanceNew;
}
else {
if (zooming) {
NSLog(@"*************shouldn't be here********* %d",[touches count]);
return;
}
CGPoint thisPoint = [[[touches allObjects] objectAtIndex:0] locationInView:self];
self.transform = CGAffineTransformTranslate(self.transform, thisPoint.x-originalCenter.x, thisPoint.y-originalCenter.y);

}
}
- (void)dealloc {
[super dealloc];
}
@end

日志示例:

^^^^^^^^^^^^^^^Tocuhes began with double touch!
point1 x: 87.33 point 2 x: 235.63 ---- point 1 y: 322.30 point 2 y: 117.09
point1 x: 90.76 point 2 x: 232.02 ---- point 1 y: 318.29 point 2 y: 123.51
point1 x: 86.22 point 2 x: 236.71 ---- point 1 y: 323.30 point 2 y: 117.42
point1 x: 89.51 point 2 x: 232.38 ---- point 1 y: 319.47 point 2 y: 123.47
point1 x: 84.97 point 2 x: 237.02 ---- point 1 y: 324.48 point 2 y: 116.56
*************shouldn't be here********* 1
point1 x: 88.49 point 2 x: 232.52 ---- point 1 y: 321.27 point 2 y: 122.91
*************shouldn't be here********* 1
point1 x: 83.95 point 2 x: 237.11 ---- point 1 y: 327.21 point 2 y: 116.96
!!!!!!!!!end zoom!!!!!!!

我开始怀疑我因为 CGAffinTransformScale 而失去了对触摸点的追踪;但是,我在网上没有发现任何内容表明这是一个问题。任何线索(包括“阅读 xyz 上的文档”)将不胜感激!

提前致谢。

最佳答案

也许是左字段的答案,但另一种方法可能是将 UIImageView 放入 UIScrollView 中,在 ScrollView 委托(delegate)上定义 viewForZoomingInScrollView: 方法,然后设置 maximumZoomScale /minimumZoomScale 属性,您无需执行计算来自行设置变换即可进行捏缩放?我刚刚在最近的一个项目中做到了这一点,效果很好。

关于iPhone UIImageView 捏合缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2135744/

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