cocoa - populares - hashtags en español
¿Cómo hago para mover NSView al frente de todos los NSViews? (7)
Tengo una súper vista, que tiene 2 subvistas. Estas subvistas están superpuestas.
Cada vez que elijo una vista desde un menú, la vista correspondiente debe convertirse en la vista frontal y manejar las acciones. es decir, debería ser la subvista más frontal.
acceptsFirstResponder
renuncia a todo el trabajo bien. Pero los eventos del mouse hacia abajo se envían a la subvista superior que se configuró.
Saludos, Dhana
Aquí hay otra forma de lograr esto que es un poco más clara y sucinta:
[viewToBeMadeForemost removeFromSuperview];
[self addSubview:viewToBeMadeForemost positioned:NSWindowAbove relativeTo:nil];
Según la documentación de este método, cuando utiliza relativeTo:nil
la vista se agrega arriba (o debajo, con NSWindowBelow
) a todos sus hermanos.
El siguiente código debería funcionar bien ...
NSMutableArray *subvies = [NSMutableArray arrayWithArray:[self subviews]];//Get all subviews..
[viewToBeMadeForemost retain]; //Retain the view to be made top view..
[subvies removeObject:viewToBeMadeForemost];//remove it from array
[subvies addObject:viewToBeMadeForemost];//add as last item
[self setSubviews:subvies];//set the new array..
Otra forma es utilizar el método sortSubviewsUsingFunction: context: de NSView para reordenar una colección de vistas de hermanos a su gusto. Por ejemplo, defina su función de comparación:
static NSComparisonResult myCustomViewAboveSiblingViewsComparator( NSView * view1, NSView * view2, void * context )
{
if ([view1 isKindOfClass:[MyCustomView class]])
return NSOrderedDescending;
else if ([view2 isKindOfClass:[MyCustomView class]])
return NSOrderedAscending;
return NSOrderedSame;
}
Luego, cuando desee asegurarse de que su vista personalizada permanezca por encima de todas las vistas de hermanos, envíe este mensaje a la supervista de su vista personalizada:
[[myCustomView superview] sortSubviewsUsingFunction:myCustomViewAboveSiblingViewsComparator context:NULL];
Alternativamente, puede mover este código a la supervista en sí, y enviar el mensaje sortSubviewsUsingFunction: context: a self en su lugar.
Para mover una vista al frente, debe colocarse como el último elemento en la matriz de subvistas. Aquí hay una solución de Swift 3.0:
func bringChildToFrontWith(viewIdentifier: Int) {
var subViewArray = self.subviews // Apple docs recommend copying subViews array before operating on it, as it "can be changed at any time"
for ix in 0 ..< subViewArray.count {
if let childView = subViewArray[ix] as? MyViewSubClass {
if childView.myViewSubClassIdentifier == viewIdentifier {
let topItem = subViewArray[ix];
subViewArray.remove(at: ix)
subViewArray.append(topItem)
self.contentView.subviews = subViewArray
}
}
}
}
Pude hacer que esto funcionara sin llamar a removeFromSuperView
// pop to top
[self addSubview:viewToBeMadeForemost positioned:NSWindowAbove relativeTo:nil];
Puede intentar esto:
[viewToBeMadeFirst.window makeKeyAndOrderFront:nil];
Puede lograr esto simplemente agregando la vista nuevamente; no creará otra instancia de esto.
[self addSubview:viewToBeMadeForemost];
Puede registrar el número de subvistas antes y después de que se ejecute esta línea de código.