Pregunta

Estoy usando NSOutlineView para un proyecto, y parece que no puede averiguar dos cosas:

  • ¿Cómo eliminar el triángulo de información para los nodos del árbol. Las aplicaciones como iTunes parecen ser capaces de hacer esto:

text alt

¿Hay algún tipo de método NSOutlineView Delegado que se utiliza para esto? O requiere una subclase?

  • ¿Cómo desactivar la sangría para los artículos. He intentado usar setIndentationPerLevel:. y poniéndolo a 0 así como cambiar el guión de columna a 0 en el Interface Builder, pero no parecen tener ningún efecto
¿Fue útil?

Solución

le han acabado en la persona aquí. He tenido que lidiar con esto hace apenas una semana.

Extracción del triángulo desplegable : poner en práctica el método frameOfOutlineCellAtRow: en la subclase NSOutlineView y NSZeroRect retorno (. Sólo si desea ocultar ese triángulo particular, de la fila, por supuesto)

- (NSRect)frameOfOutlineCellAtRow:(NSInteger)row {
    return NSZeroRect;
}

Desactivar sangría de la vista de esquema estándar de reserva espacio de diseño en el extremo izquierdo para dibujar los triángulos de, en caso de que el artículo es ampliable. Pero se puede anular que a los distintos elementos de la especificación de un marco de dibujo diferente. También hace que en la subclase, respondiendo a este mensaje:

- (NSRect)frameOfCellAtColumn:(NSInteger)column row:(NSInteger)row {
    NSRect superFrame = [super frameOfCellAtColumn:column row:row];


    if ((column == 0) /* && isGroupRow */) {
        return NSMakeRect(0, superFrame.origin.y, [self bounds].size.width, superFrame.size.height);
    }
    return superFrame;
}

Otros consejos

Para referencia futura, la manera más limpia y más simple para ocultar el triángulo en expansible artículos NSOutlineView es mediante la implementación de la outlineView: shouldShowOutlineCellForItem: método de la protocolo NSOutlineViewDelegate en su delegado:

-(BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item
{
    // replace this with your logic to determine whether the
    // disclosure triangle should be hidden for a particular item
    return [item hidesDisclosureTriangle];
}

he tenido que combinar los dos enfoques anteriores porque outlineView:shouldShowOutlineCellForItem: sola no elimina el espacio reservado para los triángulos desplegables (que no eliminar los triángulos sí mismos).

Delegado:

- (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item {
    return NO;
}

subclase de NSOutlineView:

@implementation ExpandedOutlineView

#define kOutlineCellWidth 11
#define kOutlineMinLeftMargin 6

- (NSRect)frameOfCellAtColumn:(NSInteger)column row:(NSInteger)row {
    NSRect superFrame = [super frameOfCellAtColumn:column row:row];
    if (column == 0) {
        // expand by kOutlineCellWidth to the left to cancel the indent
        CGFloat adjustment = kOutlineCellWidth;

        // ...but be extra defensive because we have no fucking clue what is going on here
        if (superFrame.origin.x - adjustment < kOutlineMinLeftMargin) {
            NSLog(@"%@ adjustment amount is incorrect: adjustment = %f, superFrame = %@, kOutlineMinLeftMargin = %f", NSStringFromClass([self class]), (float)adjustment, NSStringFromRect(superFrame), (float)kOutlineMinLeftMargin);
            adjustment = MAX(0, superFrame.origin.x - kOutlineMinLeftMargin);
        }

        return NSMakeRect(superFrame.origin.x - adjustment, superFrame.origin.y, superFrame.size.width + adjustment, superFrame.size.height);
    }
    return superFrame;
}

@end

Resultados:

Captura de NSOutlineView sin indentación de nivel superior

PXSourceList . Es el estilo que está buscando con un muy buen API.

La forma correcta para especificar la intención por nivel es sobrescribiendo indentationPerLevel de NSOutlineView.

class NoIndentOutlineView: NSOutlineView {
    override var indentationPerLevel: CGFloat {
        get {
            return 0;
        }
        set {
            // Do nothing
        }
    }
}

Esto hará que los niños tengan la misma sangría que los padres.

Esto es en lo que respecta a ocultar el botón de la divulgación. Si usted está buscando para ocultarlo a nivel mundial en artículos extensibles, uno puede hacer esto:

extension NSOutlineView {
    override open func makeView(withIdentifier identifier: NSUserInterfaceItemIdentifier, owner: Any?) -> NSView? {
        if identifier == NSOutlineView.disclosureButtonIdentifier {
            return nil
        } else {
            return super.makeView(withIdentifier: identifier, owner: owner)
        }
    }
}

Otra cosa que puede subclase NSOutlineView y anular la función makeView.

Sé que el q es para obj-c. Sólo tenía que trabajar a través de este y mi proyecto es rápida.

He intentado esto en Swift. Simplemente funciona. No sé si se trata de una manera apropiada. No debe ser equivalente en Obj-C:

extension NSTableRowView {
    override open func layout() {
        super.layout()
        if let cell = subviews.first as? NSTableCellView, cell.objectValue is <YourHeaderCellClass> {
            subviews.first?.setFrameOrigin(NSZeroPoint)
        }
    }
}

Asegúrese de que la devolución del artículo en YourHeaderCellClass fuente de datos método.

func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top