Изменение высоты и ширины UIImageView после поворота

Привет, ребята, я пытался использовать два UISlider для управления одним UIImageView. Один ползунок для масштабирования изображения и один для его поворота. Однако, когда я переключаюсь с одного ползунка на другой, он сбрасывает предыдущее вращение. (Поэтому, если я масштабирую изображение до 125x125, когда оно обычно составляет 100x100, а затем использую другой ползунок для поворота изображения, он поворачивает его, но меняет его размер обратно на 100x100 и наоборот). Так или иначе, я попытался использовать CGAffineTransformConcat для объединения двух преобразований, я попытался установить фрейм ImageView после каждого преобразования, я попытался удалить и прочитать imageView в _myArray, чтобы «сохранить» его, и я кратко попытался использовать точки привязки, но все без везения. Вот и вопрос, что я делаю не так??? Я чувствую, что мой код должен работать, и каждое действие не должно сбрасывать мой 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;

}

Кто-нибудь знает, почему каждый метод сбрасывает предыдущие преобразования других.


person Pecans    schedule 07.06.2015    source источник
comment
Ваше изображение использует автоматическую компоновку?   -  person rdelmar    schedule 08.06.2015
comment
Да и размерные классы, если это имеет значение   -  person Pecans    schedule 08.06.2015
comment
Это может быть проблемой. Иногда автоматическая компоновка и преобразования плохо сочетаются друг с другом. Попробуйте отключить автоматическую раскладку и посмотрите, решит ли это проблему.   -  person rdelmar    schedule 08.06.2015


Ответы (1)


Если вы посмотрите на свой код, вы заметите, что вы явно устанавливаете преобразование в новое значение для преобразования Identity.

CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, sender.value, sender.value);

Что вам нужно сделать, так это применить их вместе... вы можете сохранить преобразование вращения и преобразование масштаба в качестве свойств, и IBActions обновит их, а затем установит преобразование как конкатенацию двух.

Итак, шкала будет выглядеть так:

self.scaleValue = sender.value;

И вращение будет выглядеть так:

self.rotateValue = sender.value * 2*M_PI / sender.maximumValue;

И у вас будет другой метод, называемый преобразованием

-(void)transform
{
    CGAffineTransform fullTransform = CGAffineTransformMakeRotation(self.rotateValue);
    CGAffineTransformScale(fullTransform, self.scaleValue, self.scaleValue);
    UIImageView *selectedImage = [_myArray objectAtIndex:0];
    selectedImage.transform = fullTransform;
}

Затем вы должны вызвать этот метод преобразования в вызовах IBAction в конце вместо того, чтобы пытаться установить преобразования отдельно.

person Good Doug    schedule 08.06.2015
comment
С небольшой доработкой получилось отлично! Я не могу отблагодарить вас, я пытался решить эту проблему в течение 6 часов ... В итоге я использовал -(void) transform { CGAffineTransform fullTransform = CGAffineTransformMakeRotation(_rotationValue); CGAffineTransform fullTransform2 = CGAffineTransformScale(fullTransform, _scaleValue, _scaleValue); CGAffineTransform final = CGAffineTransformConcat(fullTransform, fullTransform2); UIImageView *selectedEye = [_eyeArray objectAtIndex:0]; selectedEye.transform = final; } По какой-то причине ваш код не масштабировал изображение, но это работает отлично! - person Pecans; 08.06.2015