color big ios objective-c user-interface width uisegmentedcontrol

ios - big - ionic p



¿Cambiar el ancho de un control segmentado basado en títulos en cada segmento? (3)

Empieza así, lo que me gusta:

Pero luego agrego un segmento y esto sucede:
El ancho está establecido en IB, no en código.

Todo lo que necesito es un método para calcular el ancho sobre la marcha. Al final, haría algo como esto:

control.width = (labelWidths + marginWidths); // where marginWidths = (marginWidth * control.numberOfSegments)


Como se muestra en la imagen a continuación, cambie la propiedad Auto-Size a ''Proporcional al contenido''.


El método en la respuesta de prgrmr aquí funciona bien para su propósito previsto, pero esto no es todo.

En lugar de agregar una sobrecarga innecesaria con subvistas de UILabel personalizadas,
Modifiqué el código de ejemplo en el enlace de arriba para llegar a esto:

- (void)resizeSegmentsToFitTitles:(UISegmentedControl *)control { CGFloat textWidth = 0; // total width of all text labels CGFloat marginWidth = 0; // total width of all margins NSUInteger nSegments = control.subviews.count; UIView *aSegment = [control.subviews objectAtIndex:0]; UIFont *theFont = nil; // get font for segment title label for (UILabel *label in aSegment.subviews) { if ([label isKindOfClass:[UILabel class]]) { theFont = label.font; break; } } // calculate width of text in each segment for (NSUInteger i = 0; i < nSegments; i++) { NSString *title = [control titleForSegmentAtIndex:i]; CGFloat width = [title sizeWithFont:theFont].width; CGFloat margin = 15; if (width > 200) { NSString *ellipsis = @"…"; CGFloat width2 = [ellipsis sizeWithFont:theFont].width; while (width > 200-width2) { title = [title substringToIndex:title.length-1]; width = [title sizeWithFont:theFont].width; } title = [title stringByAppendingString:ellipsis]; } [control setTitle:title forSegmentAtIndex:i]; textWidth += width; marginWidth += margin; } // resize segments to accomodate text size, evenly split total margin width for (NSUInteger i = 0; i < nSegments; i++) { // size for label width plus an equal share of the space CGFloat textWidth = [[control titleForSegmentAtIndex:i] sizeWithFont:theFont].width; // the control leaves a 1 pixel gap between segments if width // is not an integer value; roundf() fixes this CGFloat segWidth = roundf(textWidth + (marginWidth / nSegments)); [control setWidth:segWidth forSegmentAtIndex:i]; } // set control width [control setFrame:CGRectMake(0, 0, (textWidth + marginWidth), 30)]; }


Puede usar la propiedad apportionsSegmentWidthsByContent y configurarla en YES .