¿Cómo establecer el ancho del marco de una vista? (¿Por qué no puedo configurarlo directamente?)

Quiero restablecer el tamaño del marco de UIView, así que escribí:

view.frame.size.width = x;

pero no funciona, ¿alguien puede decirme por qué?

preguntado el 22 de mayo de 12 a las 09:05

4 Respuestas

no puedes establecer el ancho directamente, haz esto

CGRect frm = view.frame;
frm.size.width = x;
view.frame = frm;

Respondido el 14 de diciembre de 17 a las 17:12

sí, pero quiero saber cuál es la diferencia entre estos dos estilos de código, qué causará si mi código pasa. - Kaibin

porque la propiedad de marco de la vista devuelve un nuevo marco, no el de la vista propia. y estableces el ancho del marco recién obtenido que no afectará - Saad

Cuando usted llama view.frame obtienes una copia de la propiedad frame rect, por lo que configurarla es con frame.size.width cambia el ancho de la copia y no el tamaño del marco de la vista

contestado el 22 de mayo de 12 a las 09:05

Aquí hay un pase en el porqué. Su código se traduce en

[view frame] // <- This hands you a CGRect struct, which is not an object.
             //    At this point, view is out of the game.
.size        // <- On the struct you were handed
.width       //             "
= x;         // <- the struct you were handed changed, but view was untouched

Otra forma de verlo es que hay una variable invisible allí, a la que no puedes acceder:

 CGRect _ = [view frame]; // hands you a struct
 _.size.width = x;

contestado el 28 de mayo de 14 a las 00:05

-(void)changeWidth:(UIView*)view wid:(int)newWid{
    CGRect rc=view.frame;
    view.frame=CGRectMake(rc.origin.x, rc.origin.y, newWid, rc.size.height);
}

- (void) adjustViewtForNewOrientation: (UIInterfaceOrientation) orientation {
    //if (UIInterfaceOrientationIsLandscape(orientation)) {
    loadMoreView.frame=CGRectMake(0, 0, WIDTH, 50);
    headerView.frame=CGRectMake(0, [MLTool getPaddingHeight:self], WIDTH, HEI_SEGMENT);
    [self changeWidth:webview wid:WIDTH];
    [self changeWidth:tableView wid:WIDTH];
    [self changeWidth:  segmentedControl  wid:WIDTH-SEG_LEFT*2];
}

contestado el 30 de mayo de 15 a las 04:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.