2012-12-09 4 views
7

UICollectionViewDelegateFlowLayout ha un metodo chiamato (GetSizeForItem in MonoTouch).Come è possibile fornire l'implementazione GetSizeForItem in UICollectionViewController?

Ma non sto fornendo il delegato esplicitamente, invece, sto ereditando da UICollectionViewController.
Combina funzionalità di origine dati e delegate ma non ha questo metodo per eseguire l'override.

Ho provato ad aggiungere questo al mio controllo:

[Export ("collectionView:layout:sizeForItemAtIndexPath:")] 
public virtual SizeF GetSizeForItem (UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath) 
{ 
    return new SizeF (100, 100); 
} 

ed è stato mai chiamato.

Come si fornisce questo metodo senza ricorrere alla separazione di delegato e origine dati?

+0

Non è possibile. In Obj-C l'oggetto datasource può adottare il protocollo delegato. Questo non è posible in Monotouch. – svn

+0

@svn: quindi l'unica soluzione è liberarsi del controller e utilizzare invece l'origine dati e delegare? Se questo è il caso, si prega di postarlo come risposta in modo da poterlo accettare. –

+0

È possibile definire e assegnare all'utente delegato e origine dati personalizzati all'interno del controller sottoclasse. In questo modo puoi semplicemente usare il tuo modulo di controllo personalizzato all'esterno e utilizzare internamente i tuoi delegati personalizzati – svn

risposta

11

Non è possibile. In Obj-C l'oggetto viewcontroller (o qualsiasi classe) può adottare il protocollo delegato. Questo non è posible in Monotouch. Hai dato per usare un'istanza delegata. Ma questo può essere una classe privata

public class CustomCollectionViewController:UICollectionViewController 
{ 
    public CustomCollectionViewController():base() 
    { 

     this.CollectionView.Delegate = new CustomViewDelegate(); 

    } 

    class CustomViewDelegate: UICollectionViewDelegateFlowLayout 
    { 

     public override System.Drawing.SizeF GetSizeForItem (UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath) 
     { 
      return new System.Drawing.SizeF (100, 100); 
     } 
    } 
} 
+0

Questo ha funzionato per me, grazie. –

+0

Si noti, tuttavia, che in questo caso metodi come 'ShouldSelectItem' e altri metodi delegati verranno chiamati sul proprio delegato e ** non ** sul controller. –

+1

Quale è come dovrebbe essere secondo i documenti Apple. UICollectionViewDelegateFlowLayout eredita UICollectionViewDelegate che implementa tali metodi – svn

8

Edit: Senza la necessità di creare una sottoclasse delegato, aggiungere questo nel vostro UICollectionviewSource

/** Other methods such as GetItemsCount(), GetCell()... goes here **/ 

[Export ("collectionView:layout:sizeForItemAtIndexPath:"), CompilerGenerated] 
public virtual CGSize GetSizeForItem (UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath) 
{ 
    return new CGSize (width, height); 
} 
+1

Grazie per l'eccellente funzionamento :) –