2011-11-30 186 views
2

我申請的背景圖像我的ViewController:MonoTouch。旋轉背景圖片

ParentViewController.View.BackgroundColor = UIColor.FromPatternImage (image) 

現在,當屏幕方向得到改變它breakes我的整個背景的東西,因爲那畫面保持原樣。當然,我可以在Photoshop中旋轉圖像並將其放入我的項目中,但我對軟件工程師的謙遜自豪感起了反感。

我通過了很多來源搜索。我已經嘗試了Objective-C樣本。我在c#中只找到了一些。我沒有時間學習UIKit和Core Graphics之間的差異。我試過CGContext.RotateCTM,我試圖用CGAffineTransform.MakeRotation來實現。它不起作用。我只需要做一件簡單的事情。

顯然在使用RotateCTM或更改CGAffineTransform之前,您必須以某種方式定義關鍵點。

請有人給我看一個簡單的例子,它是如何工作的。

UPD:

這是我走到這一步:

var image = new UIImage ("Images/background.jpg"); 
if (interfaceOrientation == UIInterfaceOrientation.LandscapeLeft) { 
    CGImage imageRef = image.CGImage; 
    var width = imageRef.Width; 
    var height = imageRef.Height; 
    CGImageAlphaInfo alphaInfo = imageRef.AlphaInfo; 
    CGColorSpace colorSpaceInfo = CGColorSpace.CreateDeviceRGB(); 
    CGBitmapContext bitmap = 
      new CGBitmapContext (IntPtr.Zero, width, height, imageRef.BitsPerComponent, imageRef.BytesPerRow, colorSpaceInfo, alphaInfo); 

    bitmap.TranslateCTM(0, imageRef.Height); 
    bitmap.RotateCTM((float)-1.5707f); 
    bitmap.DrawImage (new Rectangle (0, 0, height, width), imageRef); 
    image = UIImage.FromImage (bitmap.ToImage()); 
    bitmap = null; 
} 
ParentViewController.View.BackgroundColor = UIColor.FromPatternImage (image); 

,正如你可以看到它是不是沒有好,儘管它旋轉:

portraitlandscape

我錯過了什麼?

回答

6

添加一個UIImageView作爲您的控制器視圖的子視圖並將您的圖像加載到該子視圖中。 您可能需要將UIImageViewContentMode設置爲ScaleFit以調整其大小。 將您的UIImageViewAutoresizingMask設置爲FlexibleWidthFlexibleHeight,並且您應該獲得所需的結果和旋轉(只要您的控制器覆蓋ShouldAutorotateToOrientation())。

var imageView = new UIImageView(UIImage.FromFile(pathToYourImage)); 

編輯示例代碼:

using System; 
using MonoTouch.Foundation; 
using MonoTouch.UIKit; 

namespace Rotate 
{ 
    [Register ("AppDelegate")] 
    public partial class AppDelegate : UIApplicationDelegate 
    { 
     // class-level declarations 
     UIWindow window; 

     public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
     { 
      // create a new window instance based on the screen size 
      window = new UIWindow (UIScreen.MainScreen.Bounds); 
      window.RootViewController = new TestController(); 
      // make the window visible 
      window.MakeKeyAndVisible(); 

      return true; 
     } 
    } 

    public class TestController : UIViewController 
    { 
     public TestController() : base() 
     { 
     } 

     public override void LoadView() 
     { 
      base.LoadView(); 
      this.imgView = new UIImageView(UIImage.FromFile("img.png")); 
      imgView.Frame = new System.Drawing.RectangleF(0, 0, 300, 300); 
      this.imgView.ContentMode = UIViewContentMode.ScaleAspectFit; 
      this.imgView.AutoresizingMask = UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleRightMargin | UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleBottomMargin; 
      this.View.AddSubview(this.imgView); 
     } 
     private UIImageView imgView; 

     public override void ViewWillAppear (bool animated) 
     { 
      this.imgView.Center = new System.Drawing.PointF(this.View.Bounds.Width/2, this.View.Bounds.Height/2); 
      base.ViewWillAppear (animated); 
     } 

     public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation) 
     { 
      return true; 
     } 
    } 
} 

enter image description here enter image description here

+0

沒有它不工作。我想當設備改變其方向時,它也應該旋轉圖像90度。它不 – Agzam

+0

你試過了嗎?我已經添加了一些代碼來證明它正在按照我向您解釋的方式工作。 – Krumelur

+0

對不起......顯然我嘗試了錯誤的方式......我的道歉。感謝您提供詳細的示例代碼。 – Agzam

4

這可能會成爲一個合格的不當使用FromPatternImage的。在這種情況下,生成的「UIColor」不是視圖,也不符合接收任何旋轉事件的條件。因此,您可能能夠計算邊界更改,旋轉圖像,應用新計算的邊界,重置所有內部的BackgroundColor屬性(全部都在WillRotateToInterfaceOrientation(...)內),但這非常複雜,甚至不具有遠程執行效果。

在我看來,更理智的路徑是簡單地創建一個UIImageView並將其置於層次結構中的一切:

var imageView = new UIImageView(UIImage.FromFile("Images/background.png")); 
imageView.Frame = new RectangleF(...) // set appropriate frame here 
imageView.AutoResizingMask = ...; // set appropriate mask here 
ParentViewController.View.AddSubView(imageView); 
ParentViewController.View.SendSubviewToBack(imageView); 

這使系統承擔的東西負責它的設計做的,並保持你不必編寫昂貴的旋轉代碼,同時達到預期的效果。

+0

你的意思是我必須有一個肖像模式的圖像和另一個景觀? – Agzam

+0

這就是我已經提出的,但海報宣稱UIIMageView不起作用。我已經更新了我的回答,以證明相反。 – Krumelur