MonoTouch的。旋转的背景图像

时间:2011-11-30 22:15:24

标签: background xamarin.ios uiimage

我已将背景图像应用于我的ViewController:

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

现在,当屏幕方向发生变化时,它会破坏我的整个背景,因为该图片保持不变。当然我可以在Photoshop中旋转图像并将其放入我的项目中,但我对软件工程师的骄傲感到反感。

我搜索了很多来源。我尝试过Objective-c样本。我在c#中只发现了一些。我没有时间学习UIKit和Core Graphics之间的差异。我试过了CGContext.RotateCTM,我试图通过CGAffineTransform.MakeRotation实现这一目标。它不起作用。我只需要做一件简单的事情。

显然在使用RotateCTM或更改CGAffineTransform之前,您必须以某种方式定义关键点。

请有人给我看一个简单的例子,它是如何运作的。

更新:

这是我到目前为止所得到的:

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

正如你所看到的那样并不好,虽然它确实在旋转:

portrait landscape

我错过了什么?

3 个答案:

答案 0 :(得分:6)

UIImageView作为子视图添加到控制器的视图中,并将图像加载到该子视图中。 您可能需要将ContentMode的{​​{1}}设置为UIImageView以使其调整大小。 将ScaleFit的{​​{1}}设置为AutoresizingMaskUIImageView,您应该获得所需的结果和轮换(只要您的控制器覆盖FlexibleWidth)。< / p>

FlexibleHeight

编辑样本代码:

ShouldAutorotateToOrientation()

enter image description here enter image description here

答案 1 :(得分:4)

这可能有资格使用FromPatternImage。在这种情况下,生成的“UIColor”不是视图,也不符合接收任何旋转事件的条件。因此,您可能能够计算边界变化,旋转图像,应用新计算的边界,重置WillRotateToInterfaceOrientation(...)内的BackgroundColor属性,但这非常复杂,甚至无法实现远程性能。

在我看来,更合理的方法是简单地创建一个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);

这允许系统对其设计的内容承担责任,并使您不必编写昂贵的旋转代码,同时实现所需的效果。

答案 2 :(得分:2)

对于一张图片来说可能有些过分,但对于轮换我一直在使用它......

https://github.com/escoz/monotouch-controls/blob/master/UICatalog/RotatingViewController.cs