Вопрос по ios5, objective-c, ios – Почему после поворота размер UIImageView меняется?

6

Я новичок в использовании преобразований. И до сих пор не уверены, как они работают.

То, что я пытаюсь сделать, - это повернуть мой UIImageView на заданный угол. Но после поворота он изменяет размер изображения, становясь меньше. Я также делаю масштабирование для ImageView, чтобы оно не было перевернуто.How to rotate and keep the size, that was given in CGRectMake, when ImageView was allocated ?

<code>    UIImageView *myImageView = [[UIImageView alloc]initWithFrame:CGRectMake(x,y,width,height)];        

    myImageView.contentMode = UIViewContentModeScaleAspectFit;

    [myImageView setImage:[UIImage imageNamed:@"image.png"]];

    myImageView.layer.anchorPoint = CGPointMake(0.5,0.5);

    CGAffineTransform newTransform;

    myImageView.transform = CGAffineTransformMakeScale(1,-1);            

    newTransform = CGAffineTransformRotate(newTransform, 30*M_PI/180);

    [self.window addSubview:myImageView];
</code>

Большое спасибо!

@JohannesLumpe Это изменило weidht изображения, и, вероятно, высоту. Да, это видимое изменение, потому что Изображение становится намного меньше, чем было до вращения, с тем же заданным размером ImageView. User1234
@ RohanKapur Нет, я просто хочу вручную повернуть ImageView и сохранить правильный размер. User1234
Что на самом деле меняется? Вы говорите о том, что изменяется кадр UIImageView? Или это видимое изменение размера изображения? Как вы подтвердили изменение? Если вы поворачиваете вид, его кадр всегда будет изменяться, поскольку кадр представляет пространство вида внутри его суперпредставления. Границы повернутого вида останутся прежними. Johannes Lumpe
есть ли какой-то код в штрихах Began: MCKapur
@JohannesLumpe Думаю, я понял, что происходит. Как вы сказали, границы остаются прежними, и вращается только рамка. Могу ли я также установить новые границы? Есть ли способ сделать это? User1234

Ваш Ответ

2   ответа
15

Я создаю сцену, которая должна быть несколько эквивалентна вашей, код следующий:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width/2-100,
                                                                       self.view.bounds.size.height/2-125,
                                                                       200,
                                                                       250)];

imageView.image = [UIImage imageNamed:@"testimage.jpg"];
imageView.contentMode = UIViewContentModeScaleAspectFill;

/*
 * I added clipsToBounds, because my test image didn't have a size of 200x250px
 */
imageView.clipsToBounds = YES;

[self.view addSubview:imageView];

NSLog(@"frame: %@",[NSValue valueWithCGRect:imageView.frame]);
NSLog(@"bounds: %@",[NSValue valueWithCGRect:imageView.bounds]);    

imageView.layer.anchorPoint = CGPointMake(0.5, 0.5);
imageView.transform = CGAffineTransformMakeRotation(30*M_PI/180);

NSLog(@"frame after rotation: %@",[NSValue valueWithCGRect:imageView.frame]);
NSLog(@"bounds after rotation: %@",[NSValue valueWithCGRect:imageView.bounds]); 

Этот код предполагает, что вы используете ARC. Если не добавить

[imageView release];   

в конце.

С помощью этого кода журналы выглядят так:

[16221:207] frame: NSRect: {{60, 105}, {200, 250}}
[16221:207] bounds: NSRect: {{0, 0}, {200, 250}}
[16221:207] frame after rotation: NSRect: {{10.897461, 71.746826}, {298.20508, 316.50635}}
[16221:207] bounds after rotation: NSRect: {{0, 0}, {200, 250}}    

Как видите, границы всегда остаются прежними. Что фактически изменяется из-за поворота, так это рамка, потому что изображение, которое было повернуто на 30 ° С, конечно, шире, чем если бы оно было повернуто. И поскольку центральная точка была установлена на фактический центр обзора, происхождение кадра также изменяется (сдвигаясь влево и вверх). Обратите внимание, что размер самого изображенияdoes not change, Я не использовал преобразование масштаба, поскольку результат может быть достигнут без масштабирования.

Но для ясности вот несколько картинок для вас (вращение 0 & # xB0 ;, 30 & # xB0; 90 & # xB0;): 0°,30° and 90° rotations of UIImageView

Они уже очень похожи, верно? Я нарисовал реальные кадры, чтобы прояснить, в чем разница между границами и рамкой. Следующий действительно проясняет. Я наложил все изображения, поворачивая их на отрицательные градусы, на которые был повернут UIImageView, что дало следующий результат: UIImageViews overlayed to show that size doesn't change

Таким образом, вы видите, как легко поворачивать изображения. Теперь к вашей проблеме, что вы действительно хотите, чтобы кадр остался прежним. Если вы хотите, чтобы конечный кадр имел размер вашего исходного кадра (в этом примере с шириной 200 и высотой 250), вам придется масштабировать полученный кадр. Но это, конечно, приведет к масштабированию изображения, которое вы не хотите. Я действительно думаю, что большая рамка не будет проблемой для вас - вам просто нужно знать, что вы должны принять это во внимание из-за поворота.

Короче говоря: невозможно иметь UIImageView, который будет иметь тот же кадр после поворота. Это невозможно для любого UIView. Просто подумай о прямоугольнике. Если вы поверните его, он не будет прямоугольником после вращения, не так ли?

Конечно, вы можете поместить свой UIImageView в другой UIView, который будет иметь не повернутый фрейм шириной 200 и высотой 250, но это будет просто поверхностно, поскольку он действительно не изменит тот факт, что повернутый прямоугольник имеет отличается по ширине и высоте от оригинала.

Надеюсь, это поможет. :)

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededUIKit functions
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded User1234
Error: User Rate Limit ExceededNSStringFromCGRect()Error: User Rate Limit ExceededNSValueError: User Rate Limit Exceeded[NSValue valueWithCGRect:imageView.bounds]
0

который UIImageView наследует от UIView и приводит к изменениям в кадре в соответствии с масштабированием, преобразованием, вращением устройства в соответствии с выбранным вами UIViewContentMode.

Также, если вы просто хотите повернуть, вы можете просто изменить кадр, используя: -

[UIView beginAnimations:@"Rotate" context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    CGRect frame=yourView.frame;
    frame.origin.y+=distance you want to rotate;
    yourview.frame=frame;
    [UIView commitAnimations];
}

если вы не хотите анимацию, просто измените кадр

Попробуйте использовать это: -

CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.fromValue = [NSNumber numberWithFloat:0.0f];
animation.toValue = [NSNumber numberWithFloat: 2*M_PI];
animation.duration = 0.5f;            
animation.repeatCount = HUGE_VALF;     // HUGE_VALF is defined in math.h so import it
[self.reloadButton.imageView.layer addAnimation:animation forKey:@"rotation"];
Error: User Rate Limit Exceeded User1234
Error: User Rate Limit Exceeded User1234
Error: User Rate Limit Exceeded User1234
Error: User Rate Limit Exceeded

Похожие вопросы