gpt4 book ai didi

ios - 当在其上使用捏合手势时,uiview 的边界是否会改变?

转载 作者:行者123 更新时间:2023-11-29 11:20:51 25 4
gpt4 key购买 nike

我正在使用 UIPinchGestureRecognizer 来扩展/缩小 uiview。

UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scaleElement:)];
[pinchGesture setDelegate:self];
[element addGestureRecognizer:pinchGesture];
[pinchGesture release];

//刻度元素方法

- (void)scaleElement:(UIPinchGestureRecognizer *)gestureRecognizer {
UIView *element = [gestureRecognizer view];
[self adjustAnchorPointForGestureRecognizer:gestureRecognizer];
if ([gestureRecognizer state] == UIGestureRecognizerStateBegan){
lastTouchPosition = [gestureRecognizer locationInView:element];
}
else if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged){
CGPoint currentTouchPosition = [gestureRecognizer locationInView:element];
CGPoint deltaMove = [self calculatePointDistancewithPoint1:currentTouchPosition andPoint2:lastTouchPosition];
float distance = sqrt(deltaMove.x*deltaMove.x + deltaMove.y*deltaMove.y);
float hScale = 1 - deltaMove.x/distance * (1-gestureRecognizer.scale);
float vScale = 1 - deltaMove.y/distance * (1-gestureRecognizer.scale);
if (distance == 0) {
hScale = 1;
vScale = 1;
}
element.transform = CGAffineTransformScale([element transform], hScale, vScale);
CGAffineTransform transform = CGAffineTransformMakeScale(hScale, vScale);
element.bounds = CGRectApplyAffineTransform(element.bounds, transform);
[gestureRecognizer setScale:1];
lastTouchPosition = currentTouchPosition;
}
if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) {
NSLog(@"scaling over");
NSLog(@"bounds = %@",NSStringFromCGRect(element.bounds));
NSLog(@"frame = %@", NSStringFromCGRect(element.frame));
}
NSLog(@"scalePiece exit");
}

//adjustAnchorPointForGestureRecognizer method

- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
UIView *elementToAdjust = gestureRecognizer.view;
[self.view bringSubviewToFront:gestureRecognizer.view];
CGPoint locationInView = [gestureRecognizer locationInView:elementToAdjust];
CGPoint locationInSuperview = [gestureRecognizer locationInView:elementToAdjust.superview];
elementToAdjust.layer.anchorPoint = CGPointMake(locationInView.x / elementToAdjust.bounds.size.width, locationInView.y / elementToAdjust.bounds.size.height);
elementToAdjust.center = locationInSuperview;
}
}

控制台打印:

bounds = {{0, 0}, {178.405, 179.018}}
frame = {{300.642, 566.184}, {192.899, 194.227}}

为什么当框架改变时边界不调整?它与自动调整蒙版大小有什么关系,因为我有此 View 的 subview 吗?

最佳答案

这与 UIPinchGestureRecognizer 无关。这与您设置 transform 以执行缩放有关。更改 transform 不会更改 bounds。它只是更改此 View 的坐标空间 (bounds) 映射到父 View 的坐标空间 (frame) 的方式。如果您需要 bounds 来匹配 frame,您必须直接更改其中之一,而不是使用 transform。也就是说,您通常应该使用 transform,因为它要快得多。

编辑

如果您不是要缩放,而是要调整 View 大小,请调用 setBounds:。您可以通过将转换应用到 bounds 而不是元素来找到新的 bounds

CGPoint currentTouchPosition = [gestureRecognizer locationInView:element];
CGPoint deltaMove = [self calculatePointDistancewithPoint1:currentTouchPosition andPoint2:lastTouchPosition];
...

CGAffineTransform transform = CGAffineTransformMakeScale(hScale, vScale);
self.bounds = CGRectApplyAffineTransform(self.bounds, transform);

关于ios - 当在其上使用捏合手势时,uiview 的边界是否会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7242440/

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