Estoy teniendo un problema similar como este

Estoy generando la altura de la vista en tiempo de ejecución.Aquí está mi código

@interface CollectionViewController ()
{
NSMutableArray *arrMain;
}
@property(nonatomic,strong) NSMutableArray *arrMain;
@end
@implementation CollectionViewController
@synthesize arrMain,
- (void)viewDidLoad
{
[super viewDidLoad];
[cView registerNib:[UINib nibWithNibName:@"CViewCell" bundle:nil] forCellWithReuseIdentifier:kCellID];
CViewFlowLayout *fl = [[CViewFlowLayout alloc] init];
self.cView.collectionViewLayout = fl;
NSString *strJson = MY FUNCTION WHICH RETURNS JSON STRING;
SBJSON *parser = [[SBJSON alloc] init];
self.arrMain = [[NSMutableArray alloc] init];
self.arrMain = [parser objectWithString:strJson error:nil];
for (int i=0; i<[self.arrMain count]; i++) {
NSDictionary *dic = [self.arrMain objectAtIndex:i];
[self setTags:[[UIView alloc] init] selDictionary:dic];  //This function generates height and save it to the dictionary
}
[cView reloadData];
}
- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section;
{
return [self.arrMain count];
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *dic = [self.arrMain objectAtIndex:indexPath.row];
return CGSizeMake(236,40+[[dic valueForKey:@"TAGS_HEIGHT"] intValue]);
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath;
{
CViewCell *cell =(CViewCell *) [cv dequeueReusableCellWithReuseIdentifier:kCellID forIndexPath:indexPath];
NSDictionary *dic = [self.arrMain objectAtIndex:indexPath.row];
if ([cell viewWithTag:11]){
[[cell viewWithTag:11] release];
[[cell viewWithTag:11] removeFromSuperview];
}
UIView *viewTags = [[UIView alloc] init];
[viewTags setTag:11];
[viewTags setBackgroundColor:[UIColor lightGrayColor]];
[self setTags:viewTags selDictionary:dic];
[viewTags setFrame:CGRectMake(5, 10, CONTENT_WIDTH, [[dic valueForKey:@"TAGS_HEIGHT"] floatValue])];
[cell.contentView addSubview:viewTags];
return cell;
}

Había probado el enlace de arriba de la solución, pero no es trabajo para mí.
Aquí está una imagen de mi salida.

UICollectionView con la dinámica de la altura no conseguir el mismo espacio entre células

Necesito el espaciado de la misma.
Es cualquiera que tiene la solución para este problema ?

Es este error de UICOllectionView ? Porque me encontré con este problema en este artículo también.

Esto no es un error de UICollectionView. RTFM developer.apple.com/library/ios/documentation/WindowsViews/… y tener una mirada en la figura 3-4. El camino a seguir es subclase UICollectionViewLayout.

OriginalEl autor Viral Narshana | 2014-02-03

6 Comentarios

  1. 7

    Tengo la solución general para este tipo de problema:

    - (void)viewDidLoad
    {
    [super viewDidLoad];
    [cView registerNib:[UINib nibWithNibName:@"CViewCell" bundle:nil] forCellWithReuseIdentifier:kCellID];
    CViewFlowLayout *fl = [[CViewFlowLayout alloc] init];
    fl.minimumInteritemSpacing = 10;
    fl.scrollDirection = UICollectionViewScrollDirectionVertical;
    self.cView.collectionViewLayout = fl;
    NSString *strJson = MY FUNCTION WHICH RETURNS JSON STRING;
    SBJSON *parser = [[SBJSON alloc] init];
    self.arrMain = [[NSMutableArray alloc] init];
    self.arrMain = [parser objectWithString:strJson error:nil];
    for (int i=0; i<[self.arrMain count]; i++) {
    NSDictionary *dic = [self.arrMain objectAtIndex:i];
    [self setTags:[[UIView alloc] init] selDictionary:dic];  //This function generates height and save it to the dictionary
    }
    [cView reloadData];

    }

    A continuación, actualizar el código en CViewFlowLayout.m, que es una subclase de UICollectionViewFlowLayout.

    Aquí está el código:

    #define numColumns 3
    @implementation CViewFlowLayout
    @synthesize numOfColumnsToDisplay;
    - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
    {
    NSArray* attributesToReturn = [super layoutAttributesForElementsInRect:rect];
    for (UICollectionViewLayoutAttributes* attributes in attributesToReturn)
    {
    if (nil == attributes.representedElementKind)
    {
    NSIndexPath* indexPath = attributes.indexPath;
    attributes.frame = [self layoutAttributesForItemAtIndexPath:indexPath].frame;
    }
    }
    return attributesToReturn;
    }
    - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
    {
    UICollectionViewLayoutAttributes* currentItemAttributes = [super layoutAttributesForItemAtIndexPath:indexPath];
    if (indexPath.item < numColumns){
    CGRect f = currentItemAttributes.frame;
    f.origin.y = 0;
    currentItemAttributes.frame = f;
    return currentItemAttributes;
    }
    NSIndexPath* ipPrev = [NSIndexPath indexPathForItem:indexPath.item-numColumns inSection:indexPath.section];
    CGRect fPrev = [self layoutAttributesForItemAtIndexPath:ipPrev].frame;
    CGFloat YPointNew = fPrev.origin.y + fPrev.size.height + 10;
    CGRect f = currentItemAttributes.frame;
    f.origin.y = YPointNew;
    currentItemAttributes.frame = f;
    return currentItemAttributes;
    }

    Esta solución funciona para el desplazamiento vertical solamente. Si quieres ver más o menos columnas, basta con cambiar el numColumns.

    esta solución dowes no funcionan bien si una célula es de dos grandes y el segundo es pequeño. a continuación, las células comenzarán a aparecer demasiado tarde. Becaseue este celular llamadas de vista de colección elemento en indexpath elemento en el que hay orignal lugar, pero luego se mueve a la celda hasta
    El problema con UICollectionViewFlowLayout es que es esencialmente un diseño de cuadrícula. No importa cuán grande o pequeña de las celdas en la fila son, a su fila siempre se va a obtener el mismo tamaño de la celda más grande, que esta extraña espaciado de celda. Con el fin de alinear todas las células correctamente usted necesita para proporcionar una costumbre UICollectionViewLayout, como descrito por Albert. Para seguir su ejemplo de código aquí es un buen ejemplo de la aplicación de una costumbre UICollectionView objc.io/issue-3/collection-view-layouts.html

    OriginalEl autor Viral Narshana

  2. 3

    Intente esto:

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {
    return CGSizeMake(250, 150);
    }
    Gracias por responder. Quiero la altura de la celda dinámica y el espaciado mínimo para las líneas debe ser el mismo entre todas las células.

    OriginalEl autor svmrajesh

  3. 1

    Ver esto en Storybord o xib conjunto de valores!
    UICollectionView con la dinámica de la altura no conseguir el mismo espacio entre células

    Gracias por responder. Lo he comprobado y el valor conjunto de más de allí. Quiero la altura de la celda dinámica y el espaciado mínimo para las líneas debe ser el mismo entre todas las células.
    sus células no tienen la misma altura ,el uso de todas las células de la altura y la anchura de la misma
    El ancho es el mismo. La altura no es la misma. Estoy generando altura con esta línea de código for (int i=0; i<[self.arrMain cuenta]; i++) { NSDictionary *dic = [self.arrMain objectAtIndex:i]; [self setTags:[[UIView alloc] init] selDictionary:dic]; // Esta función genera altura y guardarlo en el diccionario } en viewDidLoad
    mejor uso de la vista tabla para dividir más celdas en una fila probar los ejemplos también se consigue en Google
    No puedo usar la vista de tabla. Ver las imágenes en este enlace. stackoverflow.com/questions/14482882/… obtendrá una mejor idea de mi problema.

    OriginalEl autor Muralikrishna

  4. 1

    La clase que hereda de UICollectionViewFlowLayout debe contener métodos :

    - (CGSize)collectionViewContentSize
    {
    return CGSizeMake(200, 200) //as per your cell size
    }
    - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
    {
    NSArray* attributesToReturn = [super layoutAttributesForElementsInRect:rect];
    for (UICollectionViewLayoutAttributes* attributes in attributesToReturn)
    {
    if (nil == attributes.representedElementKind)
    {
    NSIndexPath* indexPath = attributes.indexPath;
    attributes.frame = [self layoutAttributesForItemAtIndexPath:indexPath].frame;
    }
    }
    return attributesToReturn;
    }
    - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
    {
    UICollectionViewLayoutAttributes* currentItemAttributes =
    [super layoutAttributesForItemAtIndexPath:indexPath];
    if (!currentItemAttributes)
    {
    currentItemAttributes = [UICollectionViewLayoutAttributes
    layoutAttributesForCellWithIndexPath:indexPath];
    }
    return currentItemAttributes;
    }

    Y en Su CollectionViewController agregar

    #pragma mark - Collection View Datasource
    - (CGSize)collectionView:(UICollectionView *)collectionView
    layout:(UICollectionViewLayout  *)collectionViewLayout
    sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {
    //Adjust cell size for orientation
    if (UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]))
    {
    return CGSizeMake(150, 230);
    }
    return CGSizeMake(150, 230);
    }
    no puedo poner el fix de la altura en sizeForItemAtIndexPath como soy de la generación de la altura de la vista con esta línea de código en el método viewDidLoad for (int i=0; i<[self.arrMain cuenta]; i++) { NSDictionary *dic = [self.arrMain objectAtIndex:i]; [self setTags:[[UIView alloc] init] selDictionary:dic]; // Esta función genera altura y guardarlo en el diccionario }
    cant u llamar a este código de sizeForItemAtIndexPath en lugar de ver lo hicieron cargar…coz este método restablece todos los ajustes relacionados con el tamaño de la u hecho en viewdidload
    He intentado también. No es de trabajo.

    OriginalEl autor Swati

  5. 1

    Puede establecer el tamaño de la propiedad:

    flowLayout.headerReferenceSize = CGSizeMake(0, 100);//constant height for all the items header

    Si Dinámicos :

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
    if (section == albumSection) {
    return CGSizeMake(0, 100);
    }
    return CGSizeZero;
    }
    Gracias por responder. Quiero la altura de la celda dinámica y el espaciado mínimo para las líneas debe ser el mismo entre todas celular no para de encabezado.
    Compruebe la edición
    Kumar Ki, yo no estoy hablando de espacio de la cabecera. Quiero igual espacio entre la celda verticalmente, como se muestra en la imagen. Estoy teniendo sólo una sección.

    OriginalEl autor Kumar KL

  6. 1

    Utilizando el siguiente método

    //Swift

    func collectionView(_ collectionView: UICollectionView,
    layout collectionViewLayout: UICollectionViewLayout,
    sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{
    return CGSizeMake(250, 150);
    }

    //C Objetivo

    -(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return CGSizeMake(250, 150);
    }

    OriginalEl autor Sankalp S Raul

Dejar respuesta

Please enter your comment!
Please enter your name here