2012-05-13 17 views
6

Dönüşümler kullanırken yeni. Ve hala nasıl çalıştıklarını hatırladım.UIImageView boyutu döndürüldükten sonra neden değiştiriliyor?

Yapmaya çalıştığım şey, UIImageView'umu belirli bir açıyla döndürmektir. Ancak döndürüldükten sonra, resmin boyutunu değiştirerek küçülüyor. Ayrıca ImageView için ölçekleme yapıyorum, bu yüzden baş aşağı olmayacaktır. ImageView ayrıldığında CGRectMake'de verilen boyutu nasıl döndürür ve tutarsınız?

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]; 

Çok teşekkürler!

+0

Aslında ne değişiyor? UIImageView çerçevesinin değiştiğinden bahsediyor musunuz? Ya da görüntü boyutunun gözle görülür bir değişimi mi? Değişikliği nasıl doğruladın? Bir görünümü döndürürseniz, çerçeve her zaman değişecektir, çünkü çerçeve görüntünün süper görünüm içindeki alanını temsil eder. Döndürülmüş görünümün sınırları aynı kalacaktır. –

+0

dokunuşlarda herhangi bir kod varBegan: – MCKapur

+0

@JohannesLumpe Görüntüyü değiştirerek ve muhtemelen yüksekliğini de değiştiriyor. Evet, görüntü değişiyor çünkü Görüntü çok daha küçük oluyor, daha sonra dönüyordu, aynı ImageView verilen boyutta. – User1234

cevap

15

Tamam, bakacağım sözüme bakalım, işte benim cevabım:

Bir sahne oluşturuyorum sizinkine biraz eşdeğer olmalıdır e, kodu aşağıdaki gibidir:

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]); 

Bu kod ARC kullandığınız varsayılmıştır. Sonunda,

[imageView release]; 

'u eklemeyin. Eğer sınırları hep aynı kalır görebileceğiniz gibi

[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}}  

: günlükleri şuna benzer bu kodu kullanarak

. Rotasyondan dolayı gerçekte ne değişiyor çerçeve, çünkü 30 ° C döndürülen bir görüntü, döndürülemediğinden daha geniştir. Ve merkez noktası görüntünün gerçek merkezine ayarlandığından, çerçevenin kökü de değişir (sola ve üste doğru itilir). Resmin kendisinin boyutunun değiştirmediğine dikkat edin. Ölçek dönüşümü kullanmadım, çünkü sonuç ölçeklendirme olmadan elde edilebilir. 0°,30° and 90° rotations of UIImageView

Zaten doğru, oldukça benzer: Ama

size (0 °, 30 ° 90 ° döndürme) için bazı resimler burada daha anlaşılabilir olması için? Çerçeveleri ve sınırları arasındaki farkın ne olduğunu açıklığa kavuşturmak için gerçek çerçeveleri çizdim. Bir sonraki gerçekten açık hale getirir. UIImageView'in döndürüldüğü negatif derecelerle döndürerek tüm görüntüleri yerleştirdim, şu sonucu verdi: UIImageViews overlayed to show that size doesn't change

Görüntülerin nasıl döndürüleceği oldukça basittir. Şimdi senin problemine, aslında çerçevenin aynı kalmasını istiyorsun. Son çerçevenin orijinal çerçevenizin boyutuna sahip olmasını istiyorsanız (bu örnekte 200 genişliğinde ve 250 yüksekliğinde), sonuçta oluşan kareyi ölçeklendirmeniz gerekecektir. Fakat bu elbette ki istemediğiniz görüntüyü ölçeklendirir.Aslında daha büyük bir karenin sizin için sorun olmayacağını düşünüyorum - sadece rotasyon nedeniyle hesaba katmanız gerektiğini bilmeniz gerekiyor. Kısaca

: döndürüldükten sonra aynı çerçeve olacak bir UIImageView olması mümkün değildir. Bu herhangi bir UIView için mümkün değildir. Sadece bir dikdörtgeni düşün. Döndürürseniz, dönüşten sonra dikdörtgen olmaz, değil mi?

Elbette UIImageView'ınızı 200 ve 250'lik bir yüksekliğe sahip, döndürülemeyen bir kareye sahip olacak başka bir UIView'in içine koyabilirsiniz ama bu sadece yüzeysel olur. Döndürülmüş dikdörtgen, orijinalden farklı bir genişlik ve yüksekliğe sahiptir.

Umarım bu yardımcı olur. :)

+0

gibi 'NSValue' yıllarda şeyler sarma biraz daha kolay olabilir bir işlev' NSStringFromCGRect() 'Orada' [NSValue valueWithCGRect: imageView.bounds] ' –

+0

Teşekkür Buna dikkat çektiğin için, bunu yaz gerekiyor! –

+2

bu kullanışlı [UIKit fonksiyonlarının] bir bütün yük var (http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKitFunctionReference/Reference/reference.html) –

0

UIImageView öğesinin UIView'den miras aldığı contentMode'u ayarlamayın ve seçtiğiniz UIViewContentMode uyarınca ölçekleme, dönüştürme, aygıt rotasyonuna göre çerçevedeki değişikliklere yol açmayın. Ayrıca sadece sadece kullanarak çerçeveyi değiştirebilir döndürmek istiyorsanız

: -

[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]; 
} 

Eğer animasyon sadece çerçeveyi değiştirmek istemiyorsanız

Bu kullanma deneyin: -

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"]; 
+0

Kullanıyorum, bu yüzden görüntüm en boy oranını kaybetmeyecek. Eğer onu kaldırırsam, onu tutmaz ve görüntü güzel görünmez. – User1234

+0

Cevabınız için teşekkürler, ama hala kafam karıştı. Ben sadece belirli bir açı ile ImageView döndürmek istiyorum.Ve boy oranı tutmak istiyorum, bu yüzden görüntü doğru görünecek.Daha Clear-Ben görüntü verilen boyutu ile, ROTATING önce aynı boyuta bakmak istiyorum. Bu yüzden dönme, yüksekliği/geri dönüşü değiştirmez. Bu mümkün mü? – User1234

+0

Yapabilecekleriniz görüntüyü döndürmek ve daha sonra orijinal –

İlgili konular