3 berichten aan het bekijken - 1 tot 3 (van in totaal 3)
  • Q:
    Bijdrager
    lord anubis

    SplitView, View indeling problemen?

    Heb net een chat achter de rug met iemand van hier die gek werd van NSView en sub’s om deze fatsoenlijk in te delen. Splitviews met sub splitviews welke met xcode 4 priority settings verknald kunnen worden.

    Ik heb hem iets toegestuurt wat ik ooit eens gemaakt had. Een subclass van NSView om wat duidelijkheid te krijgen of ik goed bezig was met dat view gedoe. Zal het hier ook plaatsen.

    Wat doet het?
    Heel simpel, het leest de identifier van de view ‘ ‘,0,1..13 en tekent de bij behorende achtergrond kleur in de view samen met een border met een ietwat afgeronde hoeken. Zo kan je zien of je view overlapt of onder geschoven word. En handig tijdens resizing tests.

    Wat moet je doen?
    Maak een nieuwe objective-c NSView subclass aan.
    Copy/Paste de twee code delen [hm] in je deze files, add ze in het project.
    Dan kies voor de NSViews die je zichtbaar wilt hebben, de nieuwe subClass ( NSViewBackground ).
    Zet in het ‘identifier’ veld van je View een getal van de kleur die je wilt zien.
    Uiteraard kan je nog meer kleuren toevoegen of verplaatsen.

    Ik weet het, het stelt niet veel voor maar het werkt. Mocht je een unieke kleuren combnatie creëren, en je word er rijk mee stuur even een foto.

    //
    // NSViewBackgound.m
    //
    //
    // Created by rva on 22-11-09.
    // Copyright (c) 2009 __MyCompanyName__. All rights reserved.
    //

    #import <Cocoa/Cocoa.h>

    @interface NSViewBackgound : NSView

    -(void)drawBorder:(NSRect)rect borderColorLight:(bool)light;

    @end

    //
    // NSViewBackgound.m
    //
    //
    // Created by rva on 22-11-09.
    // Copyright (c) 2009 __MyCompanyName__. All rights reserved.
    //

    #import “NSViewBackgound.h”

    @implementation NSViewBackgound

    – (id)initWithFrame:(NSRect)frame
    {
    self = [super initWithFrame:frame];
    if (self) {
    // Initialization code here.
    }

    return self;
    }

    – (void)drawRect:(NSRect)rect
    {
    bool borderColorLight;
    switch ([[self identifier] intValue]) {
    case 1:
    [[NSColor redColor] set];
    borderColorLight = true;
    break;
    case 2:
    [[NSColor orangeColor] set];
    borderColorLight = false;
    break;
    case 3:
    [[NSColor yellowColor] set];
    borderColorLight = false;
    break;
    case 4:
    [[NSColor greenColor] set];
    borderColorLight = false;
    break;
    case 5:
    [[NSColor blueColor] set];
    borderColorLight = true;
    break;
    case 6:
    [[NSColor purpleColor] set];
    borderColorLight = true;
    break;
    case 7:
    [[NSColor grayColor] set];
    borderColorLight = true;
    break;
    case 8:
    [[NSColor whiteColor] set];
    borderColorLight = false;
    break;
    case 9:
    [[NSColor magentaColor] set];
    borderColorLight = false;
    break;
    case 10:
    [[NSColor lightGrayColor] set];
    borderColorLight = false;
    break;
    case 11:
    [[NSColor darkGrayColor] set];
    borderColorLight = true;
    break;
    case 12:
    [[NSColor cyanColor] set];
    borderColorLight = false;
    break;
    case 13:
    [[NSColor brownColor] set];
    borderColorLight = true;
    break;
    default:
    [[NSColor clearColor] set];
    borderColorLight = false;
    break;
    }
    [NSBezierPath fillRect:rect];
    [self drawBorder:rect borderColorLight:borderColorLight];
    }

    -(void)drawBorder:(NSRect)rect borderColorLight:(bool)light{
    NSRect frameRect = [self bounds];
    if(rect.size.height < frameRect.size.height)
    return;
    NSRect borderRect = NSMakeRect(rect.origin.x+1, rect.origin.y+1, rect.size.width-2, rect.size.height-2);
    NSBezierPath *viewBorder = [NSBezierPath bezierPathWithRoundedRect:borderRect xRadius:7 yRadius:7];
    [viewBorder setLineWidth:1];
    if ( light ) {
    [[NSColor whiteColor] set];
    } else {
    [[NSColor blackColor] set];
    }
    [viewBorder stroke];
    }

    @end

    AAN de Admins, wanneer worden de bugs eens weggehaald als je code plaatst tussen de code tags, met al die <p></p>.

    </p>
    <p>//<br />
    //  NSViewBackgound.m<br />
    //<br />
    //<br />
    //  Created by rva on 22-11-09.<br />
    //  Copyright (c) 2009 __MyCompanyName__. All rights reserved.<br />
    //</p>
    <p>#import <Cocoa/Cocoa.h></p>
    <p>@interface NSViewBackgound : NSView</p>
    <p>-(void)drawBorder:(NSRect)rect borderColorLight:(bool)light;</p>
    <p>@end</p>
    <p>
    Bijdrager
    Verwijder

    Aanvullende tip: probeer bij dit soort problemen eerst eens met NSShowAllViews aan, dan wordt om alle views een lijntje getekend. Het is niet zo overzichtelijk maar veel minder werk en het werkt met alle subclasses van NSView.
    Of werkt dit niet meer met 10.7/8?

    Bijdrager
    lord anubis

    Ook eens geprobeerd maaar is idd slecht zichtbaar en als er een lijn naast staat dan weet je niet meer wie is wie. 10.8 niet op geprobeerd, eerlijk gezegd.

    Daarom gebruik ik hier ronden hoeken dan zie je of de lijn die je ziet aansluit op de ronde hoeken. Of dat het een b.v NSSplitview divider lijn is.

3 berichten aan het bekijken - 1 tot 3 (van in totaal 3)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.