UIImageView 旋转后高宽变化
UIImageView height and width changes after rotation
大家好,我一直在尝试使用两个 UISlider 来操作一个 UIImageView。一个滑块用于缩放图像,一个滑块用于旋转图像。但是,当我从一个滑块切换到另一个滑块时,它会重置之前的旋转。 (因此,如果我将图像缩放为 125x125,而它通常为 100x100,然后使用另一个滑块旋转图像,它会旋转图像但将其大小更改回 100x100,反之亦然)。所以无论如何,我尝试使用 CGAffineTransformConcat 来组合这两个转换,我尝试在每次转换后设置 ImageView 的框架,我尝试删除 imageView 并将其读取到 _myArray 到 "save" 它,我简要地尝试使用锚点但都没有运气。所以我的问题是,我做错了什么???我觉得我的代码应该可以工作,每个动作都不应该重置我的 UIImageView 但我不知道为什么它不会。
- (IBAction)scaleImage:(UISlider *)sender {
NSLog(@"ScaleImage Called");
UIImageView *selectedImage = [_myArray objectAtIndex:0];
CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, sender.value, sender.value);
selectedImage.transform = transform;
_scaleValue = sender.value;
//_width = selectedImage.frame.size.width
//_height = selectedImage.frame.size.height
_sizeLabel.text = [NSString stringWithFormat:@"%d", _scaleValue];
}
- (IBAction)rotateImage:(UISlider *)sender {
UIImageView *selectedImage = [_myArray objectAtIndex:0];
//selectedImage.frame = CGRectMake(selectedImage.frame.origin.x, selectedImage.frame.origin.y, _width, _height);
selectedImage.transform = CGAffineTransformMakeRotation(sender.value * 2*M_PI / sender.maximumValue);
_rotationLabel.text = [NSString stringWithFormat:@"%d", _rotationValue];
_rotationValue = sender.value;
}
有谁知道为什么每个方法都会重置其他方法之前的转换。
如果您查看您的代码,您会注意到您在身份转换中明确地将转换设置为新值。
CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, sender.value, sender.value);
您要做的是将两者一起应用...您可以将旋转变换和缩放变换保存为属性,IBActions 将更新这些属性,然后将变换设置为两者的串联。
所以,比例看起来像:
self.scaleValue = sender.value;
旋转看起来像:
self.rotateValue = sender.value * 2*M_PI / sender.maximumValue;
你还有另一个方法叫做 transform
-(void)transform
{
CGAffineTransform fullTransform = CGAffineTransformMakeRotation(self.rotateValue);
CGAffineTransformScale(fullTransform, self.scaleValue, self.scaleValue);
UIImageView *selectedImage = [_myArray objectAtIndex:0];
selectedImage.transform = fullTransform;
}
然后您将在最后的 IBAction 调用中调用该转换方法,而不是尝试单独设置转换
大家好,我一直在尝试使用两个 UISlider 来操作一个 UIImageView。一个滑块用于缩放图像,一个滑块用于旋转图像。但是,当我从一个滑块切换到另一个滑块时,它会重置之前的旋转。 (因此,如果我将图像缩放为 125x125,而它通常为 100x100,然后使用另一个滑块旋转图像,它会旋转图像但将其大小更改回 100x100,反之亦然)。所以无论如何,我尝试使用 CGAffineTransformConcat 来组合这两个转换,我尝试在每次转换后设置 ImageView 的框架,我尝试删除 imageView 并将其读取到 _myArray 到 "save" 它,我简要地尝试使用锚点但都没有运气。所以我的问题是,我做错了什么???我觉得我的代码应该可以工作,每个动作都不应该重置我的 UIImageView 但我不知道为什么它不会。
- (IBAction)scaleImage:(UISlider *)sender {
NSLog(@"ScaleImage Called");
UIImageView *selectedImage = [_myArray objectAtIndex:0];
CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, sender.value, sender.value);
selectedImage.transform = transform;
_scaleValue = sender.value;
//_width = selectedImage.frame.size.width
//_height = selectedImage.frame.size.height
_sizeLabel.text = [NSString stringWithFormat:@"%d", _scaleValue];
}
- (IBAction)rotateImage:(UISlider *)sender {
UIImageView *selectedImage = [_myArray objectAtIndex:0];
//selectedImage.frame = CGRectMake(selectedImage.frame.origin.x, selectedImage.frame.origin.y, _width, _height);
selectedImage.transform = CGAffineTransformMakeRotation(sender.value * 2*M_PI / sender.maximumValue);
_rotationLabel.text = [NSString stringWithFormat:@"%d", _rotationValue];
_rotationValue = sender.value;
}
有谁知道为什么每个方法都会重置其他方法之前的转换。
如果您查看您的代码,您会注意到您在身份转换中明确地将转换设置为新值。
CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, sender.value, sender.value);
您要做的是将两者一起应用...您可以将旋转变换和缩放变换保存为属性,IBActions 将更新这些属性,然后将变换设置为两者的串联。
所以,比例看起来像:
self.scaleValue = sender.value;
旋转看起来像:
self.rotateValue = sender.value * 2*M_PI / sender.maximumValue;
你还有另一个方法叫做 transform
-(void)transform
{
CGAffineTransform fullTransform = CGAffineTransformMakeRotation(self.rotateValue);
CGAffineTransformScale(fullTransform, self.scaleValue, self.scaleValue);
UIImageView *selectedImage = [_myArray objectAtIndex:0];
selectedImage.transform = fullTransform;
}
然后您将在最后的 IBAction 调用中调用该转换方法,而不是尝试单独设置转换