MonoTouch. Поворот фонового изображения - PullRequest
2 голосов
/ 01 декабря 2011

Я применил фоновое изображение к своему ViewController:

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

Теперь, когда ориентация экрана изменяется, он разрушает весь фоновый рисунок, потому что это изображение остается прежним.Конечно, я мог просто повернуть изображение в Photoshop и поместить его в свой проект, но моя скромная гордость инженера-программиста возмутилась.

Я искал во многих источниках.Я пробовал образцы с объективом.Я нахожу только несколько в 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

Чего мне не хватает?

Ответы [ 3 ]

6 голосов
/ 01 декабря 2011

Добавьте UIImageView как подпредставление к представлению вашего контроллера и загрузите ваше изображение в это подпредставление.Вы можете установить ContentMode из UIImageView на ScaleFit, чтобы изменить его размер.Установите AutoresizingMask ваших UIImageView на FlexibleWidth и FlexibleHeight, и вы должны получить желаемый результат и вращение (до тех пор, пока ваш контроллер переопределит 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

4 голосов
/ 01 декабря 2011

Это может квалифицироваться как неправильное использование 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);

Это позволяет системе брать на себя ответственность за то, для чего она предназначена, и не даетнаписать дорогой код поворота всего при достижении желаемого эффекта.

2 голосов
/ 01 декабря 2011

Это может быть излишним только для изображения, но для вращения я использовал это ...

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

...