2016-02-23 2 views
0

У меня проблема с представлением изображения. Я динамически добавляю свой список прокрутки. Я использую iOS 8 и классы классов и автомат. Скроллвью был добавлен через раскадровку, и я также добавил ограничения, соответствующие размеру представления.Xamarin iOS - UIImageView внутри UIScrollView, перемещенный после изменения ориентации

Задача состоит в том, чтобы динамически добавленное изображение просматривалось с центром, но после изменения ориентации оно перемещается в пределах прокрутки.

Есть тонны решений здесь, и большинство из них указали на переопределение ViewWillLayoutSubviews() функции и затем установить центр в UIImageView в к Scrollview там. Ни одно из предложений не помогло мне. Всякий раз, когда я поворачиваю устройство, изображение просматривается.

Некоторые предложения я попытался

UIScrollView with centered UIImageView, like Photos app

Center UIImageView inside UIScrollView without contentInset?

Вот как я добавляю в UIImageView. Эта функция вызывается в ViewDidLoad().

public void AddImageInScrollView(int index) 
    { 
     try 
     { 
      //Setting up the imageView 

      var imageUrl = Items.fetchImages[index]; 

      //Setting up the imageView 
      imageView = new UIImageView(); 
     //call method to load the images 
      imageView.SetImage(
       url: new NSUrl(imageUrl.AbsoluteUri), 
       placeholder: UIImage.FromFile("sample.png"), 
       completedBlock: (image, error, type, url) => 
       { 
        imageResizer = new ImageResizer(image); 

        imageResizer.RatioResize(100,100); 

        UIImage resizedImage = imageResizer.ModifiedImage; 
        //when download completes add it to the list 
        Car.images.Add(resizedImage); 

       }); 
      //end method call 

      imageView.UserInteractionEnabled = true; 
      imageView.ContentMode = UIViewContentMode.ScaleAspectFit; 
      imageView.Center = ScrollViewMain.Center; 


      //Adding the imageView to the scrollView as subView 
      ScrollViewMain.AddSubview(imageView); 

      //ScrollViewMain.ContentSize = imageView.Image.Size; 
      ScrollViewMain.ContentSize = new CGSize(ScrollViewMain.Frame.Size.Width,ScrollViewMain.Frame.Size.Height); 
      catch (Exception ex) 
     { 

      Console.WriteLine(ex.Message + ex.StackTrace); 
     } 
    } 

Функция ViewWillLayoutSubviews

public override void ViewWillLayoutSubviews() 
    { 
     base.ViewWillLayoutSubviews(); 

     imageView.Frame = new CGRect(0,0,ScrollViewMain.Frame.Size.Width,ScrollViewMain.Frame.Size.Height); 

     CenterScrollViewContents(); 
    } 

В CenterScrollViewContents функционируют

public void CenterScrollViewContents() 
    { 
     try 
     { 

     var boundsSize = ScrollViewMain.Bounds.Size; 

     var contentsFrame = imageView.Frame; 

     if (contentsFrame.Size.Width < boundsSize.Width) { 

      contentsFrame.X = ((float)boundsSize.Width - (float)contentsFrame.Size.Width)/2.0f; 

     } else { 
      contentsFrame.X = 0.0f; 
     } 

     if (contentsFrame.Size.Height < boundsSize.Height) { 

      contentsFrame.Y = ((float)boundsSize.Height - (float)contentsFrame.Size.Height)/2.0f; 

     } else { 
      contentsFrame.Y = 0.0f; 
     } 

     imageView.Frame = contentsFrame; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

    } 

экран образец выстрел из того, что он выглядит как после вращения

Screen shot of displaced image in land scape mode

+0

Вы не обновляете ContentSize ScrollView. Я бы предположил, что это проблема. –

+0

Я уже делаю это в функции AddImageToScrollView, которая вызывается в ViewDidLoad(). //ScrollViewMain.ContentSize = imageView.Image.Size; ScrollViewMain.ContentSize = новый CGSize (ScrollViewMain.Frame.Size.Width, ScrollViewMain.Frame.Size.Height); – naffie

+0

Да, но не в обновлении 'ViewWillLayoutSubviews'. Просто попробуйте скопировать 'ScrollViewMain.ContentSize = новый CGSize (ScrollViewMain.Frame.Size.Width, ScrollViewMain.Frame.Size.Height);' для этой функции. –

ответ

1

Введите код с ViewWillLayoutSubviews по номеру ViewDidLayoutSubviews. Разница в том, что ViewWillLayoutSubviews - это «Вызывается, чтобы уведомить контроллер вида, что его представление предназначено для компоновки его подзонов». и ViewDidLayoutSubviews is «Вызывается, чтобы уведомить контроллер вида, что его представление только что выложило его подзоны."

Проблема заключается в том, что ScrollViewMain.Frame является

{X=0,Y=0,Width=375,Height=667} in ViewWillLayoutSubviews 

но

{X=0,Y=0,Width=667,Height=375} in ViewDidLayoutSubviews 

Функция выглядит

public override void ViewDidLayoutSubviews() 
{ 
    base.ViewDidLayoutSubviews(); 
    ScrollViewMain.ContentSize = new CGSize(ScrollViewMain.Frame.Size.Width, ScrollViewMain.Frame.Size.Height); 
    imageView.Frame = new CGRect(0, 0, ScrollViewMain.Frame.Size.Width, ScrollViewMain.Frame.Size.Height); 
    CenterScrollViewContents(); 
} 

Bonus Protip:

Вы можете использовать imageView.Center = ScrollViewMain.Center; для просмотра в центре.

И если у вас есть еще некоторое время, посмотрите ограничения Autolayout. Они спасают вас.

+0

Я переместил код из ViewWillLayoutSubviews в ViewDidLayoutSubviews, как вы сказали, но изменений нет , ViewDidLayoutSubviews не вызывается, и изображение по-прежнему не центрировано. Иногда даже перед вращением устройства, а также после смещения смещается. Я также использую ограничения AutoLayout для каждого другого экрана. Это единственный вид, где мне нужны динамические UIImageView. Я загружаю изображения с сервера, поэтому я заметил, что только первое изображение смещается до и после вращения, так как размер кадра составляет 600x600. После прокрутки рамка меньше. – naffie

+0

Ваше настоящее приложение или образец? Вы отменили его и посмотрели на размер рамки? Попробуйте 'imageView.BackgroundColor = UIColor.Red', чтобы увидеть, подходит ли рамка изображения. Вы тестируете симулятор или устройство? Я посмотрю, изменил ли я что-то еще, сегодня днем. –

+0

Он работает !! .. Он работает. Мне просто пришлось очистить проект и снова его построить. В настоящее время вызывается ViewDidLayoutSubviews. Большое спасибо. Ты спас мне жизнь :-) Я принял этот ответ. – naffie

0

Мне удалось решить это, используя простое решение. Я понял, что при инициализации imageView я не передал размер кадра в его конструктор. Существует несколько способов сделать это, но для моего случая, после поворота экрана, кажется, что размер не обновлялся.

До:

 imageView = new UIImageView(); 
     imageView.Frame = new CGRect(0,0,ScrollViewMain.Frame.Size.Width,ScrollViewMain.Frame.Size.Height); 

Решение:

 var frame = new CGRect(0,0,ScrollViewMain.Frame.Size.Width,ScrollViewMain.Frame.Size.Height); 
    //Setting up the imageView 
     imageView = new UIImageView(frame); 

изображения внутри Scrollview теперь всегда с центром даже после изменения ориентации.

Смежные вопросы