1

初めて UICollectionView(Controller) を経験しています。実際には、TableView を操作するのと同じくらい簡単なはずですが、そうではありません。

フロー (複数の行) 内のすべての画像を表示するのではなく、一番上の行だけが表示されます。他のすべての画像はどこかにあります...スクロールは有効になっていますが、何も起こらず、バウンスもスクロールもありません...そして、向きを変更した後(および元に戻した後)、さらにいくつかの画像が表示されますが、ランダムに表示されます。向きが変わるたびに、別の場所に表示されます。

私の例には7つの画像が必要です。

IB の私のプロパティ: IB 設定のスクリーンショット

初めて: 初めて

回転後 (および元に戻した後): 回転後

フォト ギャラリーを実装するためのソース コード。

using System;

using MonoTouch.Foundation;
using MonoTouch.UIKit;
using System.Collections.Generic;
using Xamarin.Media;
using MonoTouch.AssetsLibrary;
using MonoTouch.CoreGraphics;
using System.Diagnostics;
using System.Linq;
using System.Drawing;

namespace B2.Device.iOS
{
    public partial class TagesRapportDetailRegieBilderCollectionViewController : UICollectionViewController
    {
        private const string Album = "Rapport";

        public TagesRapportDetailRegieBilderSource Source { get; private set; }
        private TagesRapportDetailRegieBilderDelegate _delegate;

        public TagesRapportDetailRegieBilderCollectionViewController (IntPtr handle) : base (handle)
        {
            Source = new TagesRapportDetailRegieBilderSource(this);
            _delegate = new TagesRapportDetailRegieBilderDelegate(this);

            // Delegate - Muss im konstruktor sein. ViewDidLoad geht nicht!
            CollectionView.Delegate = _delegate;
        }

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

            // Cell Klasse registrieren
            CollectionView.RegisterClassForCell (typeof(ImageCell), new NSString("imageCell"));

            // DataSource
            CollectionView.Source = Source;

            // Bilder laden
            LoadImages();
        }

        private void LoadImages()
        {
            Source.Images.Clear();

            var assetsLibrary = new ALAssetsLibrary();
            assetsLibrary.Enumerate(ALAssetsGroupType.Album, GroupsEnumeration, GroupsEnumerationFailure);
        }

        private void GroupsEnumeration(ALAssetsGroup group, ref bool stop)
        {
            if (group != null && group.Name == Album)
            {
                //notifies the library to keep retrieving groups
                stop = false;

                //set here what types of assets we want,
                //photos, videos or both
                group.SetAssetsFilter(ALAssetsFilter.AllPhotos);

                //start the asset enumeration
                //with ALAssetsGroup's Enumerate method
                group.Enumerate(AssetsEnumeration);

                CollectionView.ReloadData();
            }
        }

        private void AssetsEnumeration(ALAsset asset, int index, ref bool stop)
        {
            if (asset != null)
            {
                //notifies the group to keep retrieving assets
                stop = false;

                //use the asset here
                var image = new UIImage(asset.AspectRatioThumbnail());

                Source.Images.Add(image);
            }
        }

        private void  GroupsEnumerationFailure(NSError error)
        {
            if (error != null)
            {
                new UIAlertView("Zugriff verweigert", error.LocalizedDescription, null, "Schliessen", null).Show();
            }
        }
    }

    public class TagesRapportDetailRegieBilderDelegate : UICollectionViewDelegateFlowLayout
    {
        private TagesRapportDetailRegieBilderCollectionViewController _controller;

        public TagesRapportDetailRegieBilderDelegate(TagesRapportDetailRegieBilderCollectionViewController controller)
        {
            _controller = controller;
        }

        public override System.Drawing.SizeF GetSizeForItem(UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath)
        {
            var size = _controller.Source.Images[indexPath.Row].Size.Width > 0
                ? _controller.Source.Images[indexPath.Row].Size : new SizeF(100, 100);

            size.Width /= 3;
            size.Height /= 3;

            return size;
        }

        public override UIEdgeInsets GetInsetForSection(UICollectionView collectionView, UICollectionViewLayout layout, int section)
        {
            return new UIEdgeInsets(50, 20, 50, 20);
        }
    }

    public class TagesRapportDetailRegieBilderSource : UICollectionViewSource
    {
        private TagesRapportDetailRegieBilderCollectionViewController _controller;

        public List<UIImage> Images { get; set; }

        public TagesRapportDetailRegieBilderSource(TagesRapportDetailRegieBilderCollectionViewController controller)
        {
            _controller = controller;
            Images = new List<UIImage>();
        }

        public override int NumberOfSections(UICollectionView collectionView)
        {
            return 1;
        }

        public override int GetItemsCount(UICollectionView collectionView, int section)
        {
            return Images.Count;
        }

        public override UICollectionViewCell GetCell(UICollectionView collectionView, NSIndexPath indexPath)
        {
            var cell = collectionView.DequeueReusableCell(new NSString("imageCell"), indexPath) as ImageCell;

            cell.Image = Images[indexPath.Row];

            return cell;
        }
    }

    public class ImageCell : UICollectionViewCell
    {
        UIImageView imageView;

        [Export ("initWithFrame:")]
        public ImageCell (System.Drawing.RectangleF frame) : base (frame)
        {
            imageView = new UIImageView(frame);
            imageView.AutoresizingMask = ~UIViewAutoresizing.None;
            ContentView.AddSubview (imageView);
        }

        public UIImage Image 
        {
            set 
            {
                imageView.Image = value;
            }
        }
    }
}
4

1 に答える 1