Как повернуть изображение в UIButton и НЕ масштабировать его

Я пытаюсь повернуть свойство imageView UIBUtton без его масштабирования. Рассматриваемое изображение имеет размер 24x18 - шире, чем высота, - но после поворота на место изображение масштабируется, чтобы сохранить эти размеры, в результате чего у меня очень сжатое изображение. Как я могу предотвратить это?

Ниже мой код..

-(IBAction)rotateButton
{
NSLog( @"Rotating button" );

[UIView beginAnimations:@"rotate" context:nil];
[UIView setAnimationDuration:.5f];
if( CGAffineTransformEqualToTransform( button.imageView.transform, CGAffineTransformIdentity ) )
{
    button.imageView.transform = CGAffineTransformMakeRotation(M_PI/2);
} else {
    button.imageView.transform = CGAffineTransformIdentity;
}
[UIView commitAnimations];
}

Этого не происходит, если я применяю преобразование к кнопке вместо button.imageView, поэтому я предполагаю, что это свойство imageView, которое я неправильно устанавливаю.

Ваши подсказки и Boos очень приветствуются

M.


person Martin Cowie    schedule 16.08.2010    source источник
comment
FWIW, я получаю сжатый результат, даже когда преобразование применяется к кнопке. И это не происходит на симуляторе, только на устройстве.   -  person rounak    schedule 16.09.2014


Ответы (3)


Я видел, как свойство UIImageView UIButtons ведет себя очень странно — кажется, что некоторые из их свойств доступны только для чтения, включая параметр UIViewContentMode, о котором вы здесь говорите.

Лучшее решение, которое я нашел, - это имитировать настройку «кнопка, содержащая изображение» с отдельным UIImageView и пустым пользовательским стилем UIButton, расположенным поверх него. Дает вам гораздо больше гибкости в управлении изображением.

person Dan Ray    schedule 16.08.2010
comment
У меня была аналогичная проблема с обычными UIImageViews и содержимым, которое сходит с ума при повороте (НЕ то, что должно происходить), что было исправлено путем установки для contentMode значения Center - спасибо за это понимание! - person Adam; 06.05.2011

Примените следующий код при инициализации представления где-то в представлении, которое было загружено. Это поможет. Ответ, который вы получили выше, не является верным ответом :)

button.imageView.clipsToBounds = NO;
button.imageView.contentMode = UIViewContentModeCenter;
person Nikita Leonov    schedule 23.02.2013
comment
Стоит отметить, что вы не можете установить (или полагаться) на button.imageEdgeInsets, так как из-за clipsToBounds = NO это не имеет эффекта. - person Palli; 06.11.2020

Я обнаружил, что подкласс UIButton для удаления преобразования во время layoutSubviews работает, например:

class RotatableImageButton: UIButton {
    override func layoutSubviews() {
        let originalTransform = imageView?.transform
        imageView?.transform = CGAffineTransformIdentity
        super.layoutSubviews()
        if let originalTransform = originalTransform {
            imageView?.transform = originalTransform
        }
    }
}
person John Gibb    schedule 05.01.2016
comment
Это исправило для меня проблему, из-за которой закругленный значок шестеренки системы становился овалом при повороте на 90 ° с помощью self.btnSettings.imageView!.transform = self.btnSettings.imageView!.transform.rotated(by: CGFloat(.pi / 2.0)) и правильно отображался в виде круга только для 0 ° и 180 °. После использования вашего класса значок шестеренки сохранял свою форму правильно для поворота на 90°. Спасибо. - person HudsonGraeme; 14.04.2021