2016-11-15 6 views
0

irrtümlich nach oben. Ich habe einen ImageViewController, der eine ImageZoomView darstellt (die zZ noch nicht zoomt, aber bald). Wenn ich auf das Bild klicke, wird das gesamte Bild leicht nach oben verschoben. Dies sollte nicht passieren, das Bild sollte an seinem Platz bleiben, bis ein Benutzer wischt oder kneift.UIImageView bewegt sich beim Klicken auf

Der ImageViewController lebt in einem UIPageViewController, der das Wischen zwischen Ansichten ermöglicht. Das einzige Problem, das ich habe, ist mit dem ImageViewController (d. H. Der VideoViewController und PdfViewController funktionieren beide gut und nicht nach oben verschieben)

ImageZoomView ist ein UIScrollView mit einem UIImageView als Kind Kontrolle.

ImageZoomView:

public class ImageZoomView : UIScrollView 
{ 
    private UIImage _image; 
    private UIImageView _imageView; 

    public ImageZoomView() 
    { 
     _imageView = new UIImageView 
     { 
      ContentMode = UIViewContentMode.ScaleAspectFill 
     }; 

     AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight; 
     ClipsToBounds = true; 
     AddSubview(_imageView); 
    } 

    public int Index { get; set; } 

    public override void LayoutSubviews() 
    { 
     base.LayoutSubviews(); 
     var imageWidth = Bounds.Width; 
     _imageView.Frame = new CGRect(
      Bounds.Left, Bounds.Top, 
      imageWidth, imageWidth/_image.Size.Width * _image.Size.Height); 

     ContentSize = _imageView.Bounds.Size; 
    } 

    public void DisplayImage(UIImage image) 
    { 
     _image = image; 
     _imageView.Image = image; 
    } 
} 

ImageViewController:

public class ImageViewController : AssetViewController 
{ 
    private ImageZoomView _imageView; 

    public ImageViewController(int index, Media media) : base(index, media) { } 

    public override void ViewDidLayoutSubviews() 
    { 
     base.ViewDidLayoutSubviews(); 
     _imageView.Frame = View.Bounds; 
    } 

    public override void LoadView() 
    { 
     _imageView = new ImageZoomView() 
     { 
      Index = Index, 
      BackgroundColor = UIColor.White, 
     }; 
     _imageView.DisplayImage((_media as LocalMedia<UIImage>).Resource); 
     View = _imageView; 
    } 
} 

AssetViewController:

public abstract class AssetViewController : UIPageViewController 
{ 
    protected Media _media; 

    public AssetViewController(int index, Media media) 
    { 
     _media = media; 
     Index = index; 
     View.BackgroundColor = Globals.ColorDark; 
    } 

    public int Index { get; set; } 

    public Media CurrentMedia { get { return _media; } } 
} 
+0

Haben Sie innen VideoViewController oder PdfViewController Ansichten, die von UIScrollView abgeleitet sind? –

+0

@YuriS Nein, weder der VideoViewController noch der PdfViewController haben eine Abhängigkeit von der UIScrollView-Klasse. Beide Klassen stammen von UIViewController; Der PdfViewController verwendet im Grunde eine UIImageView, um das Dokument anzuzeigen (jedoch keine UIScrollView-Eltern) und der VideoViewController verwendet einen AVPlayer.Ich glaube, dass das Standardverhalten von UIScrollView der Schuldige dieses Problems ist, aber ich habe keine Ahnung, was ich tun muss, um das Problem zu beheben. – kformeck

+0

Leider ist der AVPlayer nicht frei und ich kann das nicht reproduzieren. Kannst du den Code vereinfachen, um das gleiche Problem aber ohne AVPlayer zu zeigen? Auch der gesamte Projektquellcode würde helfen, genau zu reproduzieren, was Sie haben. Wenn ich anfange, mein Storyboard mit Controllern und Einschränkungen zu erstellen, die nicht mit dem übereinstimmen, was Sie haben. Irgendeine Chance, Quelle von Dropbox oder GitHub aber ohne AVPlayer zu bekommen? –

Antwort

0

Nur wenige Dinge verursacht Probleme

  1. Alle Ihre Controller sind von UIPageViewController abgeleitet. Die Inhaltscontroller sollten nicht von UIPageViewController abgeleitet werden

  2. In ImageViewController ersetzt der Code View = _imageView; Hauptansicht von Controller zu ScrollView. Ich schlage vor, zu verwenden AddSubview(_imageView); Was ich sah, dass diese fehlerhafte Bewegung nicht die Bildlaufansicht aber irgendwie Ansicht des ganzen Controllers verschiebt.

  3. LayoutSubviews wird ziemlich oft aufgerufen und berechnet immer die gleiche Sache, da sich weder Bildgröße noch Scrollgrenzen ändern.

Im Folgenden vorgeschlagene Verbesserungen.

ImageViewController begnügt Controller innerhalb PageViewController und ImageZoomView ist die Bildlaufansicht innen ImageViewController

PageViewController

public partial class PageViewController : UIPageViewController 
{ 
    public PageViewController(IntPtr handle) : base(handle) 
    { 
    } 

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

     List<ImageViewController> pages = new List<ImageViewController>(); 
     UIStoryboard board = UIStoryboard.FromName("Main", null); 

     for (int i = 0; i < 3; i++) 
     { 
      ImageViewController ctrl = (ImageViewController)board.InstantiateViewController("imageControllerStoryboardID"); 
      ctrl.Index = i; 
      pages.Add(ctrl); 
     } 
     DataSource = new PageDataSource(pages); 
     View.Frame = View.Bounds; 
     //Set the initial content (first page) 
     SetViewControllers(new UIViewController[] { pages[0] }, UIPageViewControllerNavigationDirection.Forward, false, s => { }); 
    } 


} 

public class PageDataSource : UIPageViewControllerDataSource 
{ 
    List<ImageViewController> pages; 

    public PageDataSource(List<ImageViewController> pages) 
    { 
     this.pages = pages; 
    } 

    override public UIViewController GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController) 
    { 
     var currentPage = referenceViewController as ImageViewController; 
     if (currentPage.Index == 0) 
     { 
      return pages[pages.Count - 1]; 
     } 
     else 
     { 
      return pages[currentPage.Index - 1]; 
     } 
    } 

    override public UIViewController GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController) 
    { 
     var currentPage = referenceViewController as ImageViewController; 
     return pages[(currentPage.Index + 1) % pages.Count]; 
    } 
} 

ImageViewController

public partial class ImageViewController : UIViewController 
{ 
    public int Index; 
    private ImageZoomView _imageView; 

    public ImageViewController (IntPtr handle) : base (handle) 
    { 
    } 

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

     _imageView = new ImageZoomView(UIImage.FromFile("MergedImage.png"), View.Frame) 
     { 
      Index = Index, 
      BackgroundColor = UIColor.Blue, 
     }; 
     View.AddSubview(_imageView); 
    } 

} 

ImageZoomView

public class ImageZoomView : UIScrollView 
{ 
    private UIImage _image; 
    private UIImageView _imageView; 

    public ImageZoomView(UIImage image, CGRect frame):base() 
    { 
     _imageView = new UIImageView 
     { 
      ContentMode = UIViewContentMode.ScaleAspectFill, 
     }; 

     _image = image; 
     _imageView.Image = image; 
     Frame=_imageView.Frame = frame; 


     AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight; 
     ClipsToBounds = true; 
     AddSubview(_imageView); 

     ContentSize = new CGSize(Frame.Width, Frame.Width/_image.Size.Width * _image.Size.Height); 
     _imageView.Center = new CGPoint(ContentSize.Width/2, ContentSize.Height/2); 
    } 



    public int Index { get; set; } 

} 

Es gibt immer noch einen Code aus dem ursprünglichen Beispiel als nicht verwendetes Indexfeld und private _image-Variablen. Kann in der Zukunft nützlich sein, also behielt ich sie herum