iOS: Restricciones en la vista no seleccionada en iCarousel

Estoy usando iCarousel para mostrar las instancias de una vista personalizada que he creado en IB. Cuando se carga el carrusel, la primera vista en el carrusel se muestra correctamente, así:

introduzca la descripción de la imagen aquí

Sin embargo, los otros índices parecen ignorar mis restricciones, así: introduzca la descripción de la imagen aquí

Una vez que hago clic en esta vista, el layout se corrige a sí mismo. Observe también que el primer índice ahora tiene un layout atornillado: introduzca la descripción de la imagen aquí

¿Alguna idea de cómo corregir esto? Mi código relacionado con el carrusel:

- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel { //return the total number of items in the carousel NSLog(@"size=%d",audio.count); return audio.count; } - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view { NSLog(@"get view for index %d",index); Audio *aud = ; CGRect screenRect = [[UIScreen mainScreen] bounds]; CGFloat screenWidth = screenRect.size.width; CGFloat screenHeight = screenRect.size.height; AudioView *aView; float height = screenWidth*.5; float width = height * (16.0/9.0); //create new view if no view is available for recycling if (view == nil) { aView = [[[NSBundle mainBundle] loadNibNamed:@"AudioView" owner:self options:nil] objectAtIndex:0]; [aView setFrame:CGRectMake(0, 0, width, height)]; }else{ aView=(AudioView *)view; } aView.layer.cornerRadius=8; NSLog(@"%f",aView.frame.size.height); NSLog(@"%f",aView.frame.size.width); aView.backgroundColor=[UIColor alizarinColor]; aView.textLabel.text=aud.text; aView.titleLabel.text=aud.name; if (rowCurrentlyPlaying==index&&isPlaying) { aView.imageView.image = [UIImage imageNamed:@"pause.png"]; }else{ aView.imageView.image = [UIImage imageNamed:@"play.png"]; } return aView; } - (CGFloat)carousel:(iCarousel *)carousel valueForOption:(iCarouselOption)option withDefault:(CGFloat)value { if (option == iCarouselOptionSpacing) { return value * 1.1f; } return value; } - (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index{ NSLog(@"Clicked"); if(index==self.carousel.currentItemIndex){ Audio *aud = ; NSURL *audUrl = [NSURL URLWithString:aud.audioUrl]; if (rowCurrentlyPlaying==index) { if (isPlaying) { [anAudioStreamer pause]; isPlaying=NO; }else{ [anAudioStreamer play]; isPlaying=YES; } }else{ rowCurrentlyPlaying=index; isPlaying=YES; aPlayerItem = [[AVPlayerItem alloc] initWithURL:audUrl]; anAudioStreamer = [[AVPlayer alloc] initWithPlayerItem:aPlayerItem]; [anAudioStreamer play]; } [carousel reloadData]; } } 

EDIT: Probé esto también en iPad, y pensé que estas capturas de pantalla podrían ayudar a arrojar algo de luz (por favor, ignore los divertidos tamaños de fuente). Parece que simplemente no se extiende al ancho completo cuando no se selecciona.

Diseño correcto: introduzca la descripción de la imagen aquí

Diseño incorrecto: introduzca la descripción de la imagen aquí

No he mirado iCarousel en un time, pero esto es del file readMe en cualquier versión que tenga aquí

 iCarousel supports the following built-in display types: - iCarouselTypeLinear - iCarouselTypeRotary - iCarouselTypeInvertedRotary - iCarouselTypeCylinder - iCarouselTypeInvertedCylinder - iCarouselTypeWheel - iCarouselTypeInvertedWheel - iCarouselTypeCoverFlow - iCarouselTypeCoverFlow2 - iCarouselTypeTimeMachine - iCarouselTypeInvertedTimeMachine You can also implement your own bespoke carousel styles using `iCarouselTypeCustom` and the `carousel:itemTransformForOffset:baseTransform:` delegate method. NOTE: The difference between `iCarouselTypeCoverFlow` and `iCarouselTypeCoverFlow2` types is quite subtle, however the logic for `iCarouselTypeCoverFlow2` is substantially more complex. If you flick the carousel they are basically identical, but if you drag the carousel slowly with your finger the difference should be apparent. `iCarouselTypeCoverFlow2` is designed to simulate the standard Apple CoverFlow effect as closely as possible and may change subtly in future in the interests of that goal. 

No estoy seguro de si usted entiende que el iCourousel está aplicando transformaciones a las vistas que no son la selección actual, esto es deliberado. Tiene una puñalada en emular el api de cobertura de Apple, (que no está disponible para nosotros).

ok por lo que su object carrusel tiene una propiedad del tipo tipo llamado iCarouselType, de la enumeración anterior, la mejor apuesta es intentar cada uno de estos para encontrar el que más le convenga.

He estado buscando durante todo el día una respuesta a esta pregunta, lo mismo me sucedía a mí. Establecer el marco de la UIView personalizada no funciona.

La solución es un poco extraña:

  1. Vaya al file xib para la UIView personalizada. También asumiré que tiene la subclass correspondiente (files .h y .m) para el UIVIew personalizado
  2. Agregue una subvista que cubra toda la vista. Llamaré a esto la vista de background.
  3. Agregue las vistas de text, etc. como sub-vistas de la vista de background y establezca las restricciones relativas a la vista de background.
  4. Para la vista de background, agregue las siguientes restricciones: Espacio superior para supervisar, Espacio principal para supervisar, Ancho igual a: Altura igual a:
  5. Cree dos salidas, una de la restricción de ancho y otra para la restricción de altura del paso 4. Estas salidas deben estar en el file .h de la UIView personalizada.
  6. En el método viewForItemAtIndex que tiene arriba, continúe asignando e inicializando la Vista personalizada utilizando el método loadNibNamed . Sin embargo, después de eso, establezca las constantes de restricción de ancho y alto en function de los límites del carrusel (o el ancho y la altura que desee). Por ejemplo,

     CustomView *customView = (CustomView *) view; customView.widthConstraint.constant = carousel.bounds.size.width; customView.heightConstraint.constant = carousel.bounds.size.height; 

He descubierto algo que se ve diferente de la implementación habitual de iCarousel.

En el método - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view

Supongo que necesitas usar: objectAtIndex:index]; en lugar de objectAtIndex:0];

 if (view == nil) { aView = [[[NSBundle mainBundle] loadNibNamed:@"AudioView" owner:self options:nil] objectAtIndex:0]; [aView setFrame:CGRectMake(0, 0, width, height)]; } 

Tengo una pieza simple de código que he usado en mi aplicación en vivo como:

 - (UIView *)carousel:(iCarousel *)_carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view { if (view == nil) { view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; view.contentMode = UIViewContentModeCenter; [view addSubview:[items objectAtIndex:index]]; } else { view = [items objectAtIndex:index]; } view = [items objectAtIndex:index]; return view; } 

Espero que ayude.

cuando crea una vista de audio en "viewForItemAtIndex", simplemente configura el marco de vista

 [aView setFrame:CGRectMake(0, 0, width, height)]; 

Creo que debes establecer el marco de la label de título y la label de text de aView, para get el text de ancho completo.

Para el segundo problema, cuando hace clic en la vista, esa vista se muestra correctamente, pero el text de la vista anterior se corta.

Creo que tienes están volviendo a cargar toda la vista del carrusel onclick,

[carousel reloadData];

En lugar de eso, debe volver a cargar solo esa vista en la que se hace clic. para eso puedes usar

  • (vacío) reloadItemAtIndex: índice (NSInteger) animado: (BOOL) animado;

Que esta línea resuelva su problema.

Disfrutar….