旋转后UIImageView的高度和宽度会发生变化

时间:2015-06-07 22:43:16

标签: ios objective-c uiimageview transformation

嘿伙计们,我一直在尝试使用两个UISliders来操纵一个UIImageView。一个用于缩放图像的滑块和一个用于旋转图像的滑块。但是,当我从一个滑块切换到另一个滑块时,它会重置前一个旋转。 (因此,如果我将图像缩放为125x125时,通常为100x100,然后再使用另一个滑块旋转图像,则会旋转图像,但会将其大小更改为100x100,反之亦然)。所以无论如何,我尝试使用CGAffineTransformConcat来组合两个转换,我尝试在每次转换后设置ImageView的框架,我尝试删除并读取imageView到_myArray以“保存”它,我简单地尝试使用anchorpoints但所有没有运气。所以我的问题是,我做错了什么?我觉得我的代码应该工作,每个动作不应该重置我的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;

}

有没有人知道为什么每种方法都会重置之前的其他转换。

1 个答案:

答案 0 :(得分:1)

如果查看代码,您会注意到您正在明确地将转换设置为Identity转换中的新值。

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调用中调用该转换方法,而不是尝试单独设置转换