2014-10-13 27 views
12

UIImage'I gösteren bir UIImageView var.UIImageView, gösterilen görüntü konumunu elde edin.

UIImage, farklı boyutlardaki diğer UIImage öğelerine dönüşebilir ve UIImage'ın konumu ve boyutu, buna göre değişecektir.

Sorunum, UIImage'ın sonunda (ki her zaman değişecek) bir görünüm eklemeyi deniyorum ve tüm alabildiğim UIImageView'ın karesidir (her zaman tam ekran kalır)).

UIImage öğesinin geçerli "çerçevesini" nasıl alabilirim?

+0

bu bilgi almak için doğrudan bir API yoktur. Görüntü görünümünün çerçevesine, görüntü boyutuna ve görüntü görünümünün 'contentMode'na göre kendiniz hesaplamanız gerekir. – rmaddy

+0

@rmaddy Bu söylenecek çok zor bir şey gibi geliyor. Onu daha basit bir şekilde kesmenin bir yolu yok mu? –

+0

Görsel ve yükseklik elde etmek için Imageview.image.size.width/height öğelerini kullanabilirsiniz. Origin.x ve y properties – Eyeball

cevap

17

Aşağıdakiler UIImageView kullanılan UIViewContentModeAspectFit varsayarak sorunuza cevap verecektir:

Sen UIImageView içindeki görüntünün görüntü boyutlandırma kabul etmek gerekir. Bu, contentMode'u nasıl ayarlayacağınıza bağlıdır. Açıklamanıza göre, UIViewContentModeAspectFit kullandığınızı varsayalım. Ortaya çıkan görüntü UIImageView'da da ortalanacak ve bu yüzden hesaplama için bunu dikkate almanız gerekiyor. Üç içerik modları arasındaki farklar daha iyi anlaşılması için,

-(CGRect)calculateClientRectOfImageInUIImageView:(UIImageView *)imgView 
{ 
    CGSize imgViewSize=imgView.frame.size;     // Size of UIImageView 
    CGSize imgSize=imgView.image.size;      // Size of the image, currently displayed 

    // Calculate the aspect, assuming imgView.contentMode==UIViewContentModeScaleAspectFit 

    CGFloat scaleW = imgViewSize.width/imgSize.width; 
    CGFloat scaleH = imgViewSize.height/imgSize.height; 
    CGFloat aspect=fmin(scaleW, scaleH); 

    CGRect imageRect={ {0,0} , { imgSize.width*=aspect, imgSize.height*=aspect } }; 

    // Note: the above is the same as : 
    // CGRect imageRect=CGRectMake(0,0,imgSize.width*=aspect,imgSize.height*=aspect) I just like this notation better 

    // Center image 

    imageRect.origin.x=(imgViewSize.width-imageRect.size.width)/2; 
    imageRect.origin.y=(imgViewSize.height-imageRect.size.height)/2; 

    // Add imageView offset 

    imageRect.origin.x+=imgView.frame.origin.x; 
    imageRect.origin.y+=imgView.frame.origin.y; 

    return(imageRect); 
} 

, aşağıya bakınız:

enter image description here

+0

Bu çözüm, UIViewContentModeScaleAspectFit ve "UIViewContentModeScaleAspectFill" değil midir? Eğer 'UIViewContentModeScaleAspectFill' kullanmışsanız, hesaplama gerekmez. – rmaddy

+0

Teşekkürler, evet, tabii ki ..AspectFit. Bununla birlikte, eğer ... AslectFill gerekli ise,/yükseklik oranını değiştirmeden UIImageView içine sığmaması durumunda görüntü üst ya da solda kırpılabileceği için bazı hesaplamalar yapmanız gerekecektir. Bu arasındaki fark ... AspectFill ve ... ScaleToFill. – Marcus

+0

Harika, benim için iyi çalıştı – Sakthimuthiah

9

< 3,0 Swift için

// MARK: - Create Rect 
func calculateRectOfImageInImageView(imageView: UIImageView) -> CGRect { 
    let imageViewSize = imageView.frame.size 
    let imgSize = imageView.image?.size 

    guard let imageSize = imgSize, imgSize != nil else { 
     return CGRect.zero 
    } 

    let scaleWidth = imageViewSize.width/imageSize.width 
    let scaleHeight = imageViewSize.height/imageSize.height 
    let aspect = fmin(scaleWidth, scaleHeight) 

    var imageRect = CGRect(x: 0, y: 0, width: imageSize.width * aspect, height: imageSize.height * aspect) 
    // Center image 
    imageRect.origin.x = (imageViewSize.width - imageRect.size.width)/2 
    imageRect.origin.y = (imageViewSize.height - imageRect.size.height)/2 

    // Add imageView offset 
    imageRect.origin.x += imageView.frame.origin.x 
    imageRect.origin.y += imageView.frame.origin.y 

    return imageRect 
} 

Swift 3.0 için

Swift'de yukarıdaki yöntem aşağıdadır. Yine, contentMode öğesinin .ScaleAspectFit olarak ayarlandığını varsayarak verilen imageViewCGRectZero numaralı görüntüde herhangi bir görüntü yoksa geri dönecektir.

func calculateRectOfImageInImageView(imageView: UIImageView) -> CGRect { 
    let imageViewSize = imageView.frame.size 
    let imgSize = imageView.image?.size 

    guard let imageSize = imgSize where imgSize != nil else { 
     return CGRectZero 
    } 

    let scaleWidth = imageViewSize.width/imageSize.width 
    let scaleHeight = imageViewSize.height/imageSize.height 
    let aspect = fmin(scaleWidth, scaleHeight) 

    var imageRect = CGRect(x: 0, y: 0, width: imageSize.width * aspect, height: imageSize.height * aspect) 
    // Center image 
    imageRect.origin.x = (imageViewSize.width - imageRect.size.width)/2 
    imageRect.origin.y = (imageViewSize.height - imageRect.size.height)/2 

    // Add imageView offset 
    imageRect.origin.x += imageView.frame.origin.x 
    imageRect.origin.y += imageView.frame.origin.y 

    return imageRect 
} 
+0

büyük teşekkür ederim – fullMoon

4

ben işlevi AVMakeRectWithAspectRatio inşa kullanarak öneririz.

func AVMakeRectWithAspectRatioInsideRect(_ aspectRatio: CGSize, _ boundingRect: CGRect) -> CGRect 

Parametreler:

aspectratiodur:
genişlik ve yükseklik oranı (en boy oranı) korumak istiyoruz.

boundingRect: İçeri sığdırmak istediğiniz sınırlayıcı dikdörtgen.

Dönüş Değeri Rect sınırlayıcı dahilinde aspectratiodur tarafından belirtilen en boy oranını korur ölçekli CGRect döndürür.

let boundingBox = AVMakeRectWithAtectRatioInsideRect (backgroundImage.boyut Janusz dan harika ve basit çözümü dayanarak, çerçeve)

1

, burada ne yaptım:

let visibleRect = AVMakeRect(aspectRatio: CGSize(width: image.size.width, height: image.size.height), insideRect: self.frame) 
if visibleRect.contains(point) { 
    // Do something great here... 
} 
İlgili konular