2017-01-11 129 views
0

有一個UIImageView作爲屬性通過從其他用戶在圖像上塗寫的視圖控制器的segue傳遞。我無法在接收視圖控制器中適合/縮放圖像以適應UIView。無論我嘗試什麼,它都會在屏幕上顯示。調整UIImageView的大小以適應屏幕

這裏有一些我與零次的成功嘗試在viewDidLoad()

incomingImgView?.frame = CGRect(x: 0, y: 0, width: view.bounds.width , height: view.bounds.height) 
// incomingImgView?.frame = CGRect(x: 0, y: 0, width: 100 , height: 100) 

incomingImgView?.contentMode = .scaleAspectFit 

incomingImgView?.clipsToBounds = true 

//incomingImgView?.frame = view.bounds 
viewContainer.addSubview(incomingImgView!) 


// incomingImgView?.image?.scaleImage(toSize: CGSize(width: 100, height: 100)) 
// incomingImgView?.layoutIfNeeded() 

view.layoutIfNeeded() 
+3

爲什麼你在兩個UIViews之間傳遞UIImageView?爲什麼不只是傳遞一個UIImage,讓每個UIView按照你想要的方式進行尺寸調整? – dfd

+1

@CodeTree請不要做那樣的事情。傳遞數據 - 而不是接口。 –

回答

1

請試試這個:

incomingImgView?.frame = CGRect(x: 0, y: 0, width: viewContainer.bounds.width , height: viewContainer.bounds.height) 
+0

no:| 這是怎麼代表,但不是工作 incomingImgView .frame =的CGRect?(X:0,Y:0,寬度:viewContainer.bounds.width,高度:viewContainer.bounds.height)? incomingImgView .contentMode = .scaleAspectFit viewContainer.addSubview(!incomingImgView) view.layoutIfNeeded() –

+0

請加入這一行,並嘗試 - viewContainer.layoutIfNeeded() – CrazyVK56

+0

已經嘗試過:| –

0

要設置幀兩次,你試圖設置第一次被替換爲框架因此它將採用view.bounds的框架而不是incomingImgView?.frame = CGRect(x: 0, y: 0, width: view.bounds.width , height: view.bounds.height)

嘗試下面的代碼,並檢查

incomingImgView?.frame = CGRect(x: 0, y: 0, width: 100 , height: 100) 
    incomingImgView?.contentMode = .scaleAspectFit  
    incomingImgView?.clipsToBounds = true 
    viewContainer.addSubview(incomingImgView!)  
+0

對不起!這是粘貼代碼時,錯誤,編輯它,不工作 –

+0

@CodeTree你可以告訴我你是如何通過從segue imageView? –

+0

如果讓validVC:FinalViewController = {VC如果 讓capturedImage = {imgView validVC.incomingImgView = capturedImage self.navigationController .pushViewController(validVC,動畫:真)? }} –

0

我一直在這個確切問題,工作了一段時間,並用此溶液從繼承的UIImageView,我所做的類想出了(注意,可能只把它作爲自己的UIImageView而不是創建一個新的類,如果這是你改變的唯一的事情)的擴展:

func scaleAndCenterInParent(){ 
    //Scales and centers to superview 
    if let screenSize = superview?.frame.size{ 

     let frameSize = self.frame.size 


     if frameSize.width > screenSize.width || frameSize.height > screenSize.height{ 
      //Image exceeds screen in at least one direction 
      var scale: CGFloat = 1 
      let frameRatio = (frameSize.width)/(frameSize.height) 

      if frameRatio >= 1{ 
       //landscape frame 
       scale = screenSize.width/frameSize.width 
      }else{ 
       //portrait frame 
       scale = screenSize.height/frameSize.height 
      } 

      //apply transform to self (imageview) 
      self.transform = self.transform.scaledBy(x: scale, y: scale) 



      //center 
      self.frame.origin.x = (superview!.bounds.midX - (frameSize.width*0.5)) 
      self.frame.origin.y = (superview!.bounds.midY - (frameSize.height*0.5)) 
     } 
    } 
} 

編輯:請注意,您仍然需要設置.scaleAspectFit參數,因爲這隻會改變幀的大小。它保留了完整的圖像質量。

+0

@CodeTree對不起,這是一個個人功能,代碼現在更新:self.transform = self.transform.scaledBy(x:scale,y:scale) – Simen91

+0

是的,雖然它不會使視圖更小它會擴大到更大的一個,這將是非常方便的,我猜在哪裏至少我可以玩...我會盡力讓你知道。 –

+0

@CodeTree該功能只在視圖超過其超視圖時才縮小(它不像現在那樣擴大)。如果您希望它向上或向下放大或縮小,無論其大小與其超級視圖相關,只要移除if語句以檢查它是否超出屏幕大小 – Simen91

0

您試過了嗎incomingImgView.sizeToFit()此方法適合其父視圖的正確大小的視圖。

相關問題