Andere Ruler

  • Andere Ruler

    Hallo,

    ich würde gerne die Ruler von NSScrollView verändern, und zwar so, dass sie wie in InDesign in der ScrollView drinnen liegen, ein eigenes Menü haben und weiß sind. Das Problem ist: Ich weiß nicht, wie ich das hinbekomme.

    NSScrollView hat eine ClipView als Subview. Da die Ruler innerhalb von NSScrollView liegen sollen, sollte die ClipView verändert werden? Oder die ScrollView? Oder die CustomView innerhalb der Clipview?
    Muss ich NSRulerView manipulieren, und wenn ja, wie? Probleme mit NSRulerView habe ich schon, dass ich es z.B. nicht hinbekomme die Höhe anzupassen (die horizontale RulerView ist immer Größer)

    Vielleicht könnt ihr mir helfen, ich habe nur ganz wenig über NSRulerView im Internet gefunden.


    Frohes neues Jahr.

    PS: Bin schon auf die Idee gekommen, keine ClipView in die ScrollView zu legen sondern eine NSBox mit der NSClipView und 2 Custom Pseudo RulerViews, aber NSScrollView nimmt das nicht an.
    There are 10 kinds of people in the world - those who understand binary
    and those who don't.
  • RE: Andere Ruler

    also so ganz hab ich noch nicht, was du jetzt genau willst. Aber aus eingener Erfahrung kann ich nur sagen, dass die ScrollViews mit allem drum und dran das bei weitem abscheulichste in Cocoa sind :D
    Aber vielleicht könntest du mal was malen, da ich kein Indesign drafu hab...

    Max
  • RE: Andere Ruler

    Das die ScrollView wiederlich ist, kann ich aus meiner Erfahrung der letzten paar Tage bestätigen.

    So, im Anhang eine Komposition verschiedener Fenster, zum einen InDesign, zum anderen ein Screenshot von Sketch. Ich habe ein paar Sachen markiert, die mich an NSRulerView stören:

    1. Die NSScroller in Sketch gehen nicht über die Ruler. Das wäre schön, wenn man machen könnte, ist allerdings nicht so wichtig.

    2. In der linken Ecke brauche ich so ein Kreuz. Wie man das allerdings mit Cocoa hinbekommt - keine Ahnung

    3. Der Rand oben ist größer, als er sein sollte. Bei Sketch ist jetzt auch der Rand an der Seite größer (was er nicht per default in Cocoa ist), aber ich hätte den gerne ganz weg (sieht aufgeräumter aus).


    Mit der Beschriftung kann ich leben, obwohl ich bei NSRulerView auch gerne einen weißen Hintergrund hätte.

    Vielleicht könnt ihr mir jetzt helfen, zugegeben, es war von mir oben ziemlich schlecht erklärt.
    (ich habe jetzt gleich mal ein paar Punkte hinzugefügt, nach denen ich ursprünglich nicht gefragt hatte, aber wo ich schon einmal dabei bin...)
    There are 10 kinds of people in the world - those who understand binary
    and those who don't.
  • RE: Andere Ruler

    naja, du musst nur eine subclass machen und deine eigenen zeichen-methoden implemenieren. NSRulerView hat ja die Methode - (void)drawHashMarksAndLabelsInRect: (NSRect)rect, die das zeichnen macht. Du müsstest das nur erweitern/überschreiben und mal ein bissel mit den parametern probieren. Wegen dem scroller müsstest du dann doch schon etwas im ScrollView ändern. Obwohl Sketch es "falsch" macht, ist es vielleicht ganz nützlich und du solltest es dir mal genauer anschauen, wie dort z.b. das links breiter gemacht wird.

    Max
  • RE: Andere Ruler

    So schlimm finde ich es nicht. Man braucht etwas, um es zu verstehen, weil sie extrem mächtig sind. Aber sie sind eben auch extrem mächttig.

    So kannst du deinen Rules einfach setzen:

    Quellcode

    1. setRulerViewClass:
    2. + (void)setRulerViewClass:(Class)aClass
    3. Sets the default class to be used for ruler objects in NSScrollViews to aClass. This class is normally NSRulerView, but you can use this method to set it to a custom subclass of NSRulerView.
    4. This method simply sets a global variable private to NSScrollView. Subclasses of NSScrollView should override both this method and rulerViewClass to store their ruler view classes in private variables.

    Was willst du mehr? Wie willst du es einfacher haben?

    Größere Sorgen bereitet mir die Anordnung der Elemente, die du ändern willst. Ich würde hier NSScrollVioew ableiten, den Standard-Init machen und dann die Subviews entsprechend verändern mittels -setFrame(NSScroller). Dürfte gehen. Ansonsten suche doch mal in den Examples nach NSRuler & Co.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: Andere Ruler

    Ok, vielen Dank schon einmal. Zum Teil habe ich die Sachen schon ausprobiert, werde mich morgen noch einmal mit euren Hilfestellungen dransetzten. Vielen Dank schon einmal.
    There are 10 kinds of people in the world - those who understand binary
    and those who don't.
  • RE: Andere Ruler

    Ok, ich habe das Problem Nummer 3 gelöst. Um die größe anzupassen, reicht schon das:

    Quellcode

    1. [[scrollView horizontalRulerView] setReservedThicknessForAccessoryView:-16.0];
    Man muss eine negative Zahl eingeben, da diese zur schon existierenden Größe addiert, also im Endeffekt abgezogen wird, da wir sie negativ gewählt haben. Wenn ich das nächste problem gelöst habe, melde ich mich wieder...
    There are 10 kinds of people in the world - those who understand binary
    and those who don't.
  • RE: Andere Ruler

    ja, aber das bringt dir nicht allzu viel, weil du ja noch das fadenkreuz da rein ham willst. Also kannst du es gleich komplett überschreiben und mit toms methode setzen. Ich hab bei mir allerdings einen anderen weg gewählt:

    Quellcode

    1. scrollView = [textView enclosingScrollView];
    2. _counterView = [[MyRulerView alloc] initWithScrollView:scrollView orientation:NSVerticalRuler];
    3. [_counterView setRuleThickness: MyRulerViewWidth];
    4. [scrollView setHasHorizontalRuler: NO];
    5. [scrollView setHasVerticalRuler: YES];
    6. [scrollView setVerticalRulerView: _counterView];
    7. [scrollView setRulersVisible: YES];


    Max
  • RE: Andere Ruler

    Ich werde der Einfachheit halber beides machen, zum einen wie bereits beschrieben das setReserved... aufrufen, um die Horizontale Größe anzupassen und zum anderen eine Subklasse von NSRulerView machen, die gegen die Superklasse über setRulerViewClass austauschen und dann ein paar Methoden überschreiben.
    Das Kreuz oben bastel ich über ein fertiges NSImage rein, indem ich einfach drawHashMarksAndLabelsInRect überschreibe, dann überprüfe ob die aktuelle RulerView horizontal ausgerichtet ist und in diesem Fall das Image reinzeichne.
    There are 10 kinds of people in the world - those who understand binary
    and those who don't.
  • RE: Andere Ruler

    Denkst du wirklich? Ich habe absichtlich ein Bild genommen, da ich dachte, dass das Rendern von 4 linien ziemlich lange dauert im Gegensatz zum Bild. Wie würdest du das machen? Einen BezierPath nehmen, lineWidth auf 1 setzten und dann einfach stroken, oder würdest du eher mit NSRectFill ein rect mit z.B. einer höhe von 1 machen?
    There are 10 kinds of people in the world - those who understand binary
    and those who don't.
  • RE: Andere Ruler

    Wie meinst du mit CoreGraphics? Wie muss ich damit ein Rechteck füllen? Benutzt NSRectFill nicht direkt CoreGraphics?
    Ich hätte das jetzt so über [[NSColor colorWithDevicedWhite:0.4 alpha:1.0] set]; die Farbe gesätzt und dann das zugehörige Rect über NSRectFill() gefüllt. Aber nach deinem letzten Post scheint es schneller zu gehen?
    There are 10 kinds of people in the world - those who understand binary
    and those who don't.
  • RE: Andere Ruler

    Original von M.A.X
    du solltest dir überlegen, ob du das kreuzel nicht lieber aus linien selber zeichen willst, als da jedes mal ein bild reinzuzeichnen. Wegen der Performance sollte das mit linien wesentlich schneller sein.


    Nee, bei vier lütten Futzellinien macht man sich über so 'nen Tinneff keine Gedanken.

    Über Performance macht man sich Gedanken, wenn

    a.) ein Performanceproblem vorliegt (d.h. man dieses merkt).
    b.) Performance ein spezielles Anforderungskriterium darstellt.

    Wenn a.) od. b.) zutrifft, dann

    1.) mißt man, woran das liegt/ wo die Zeit vertrödelt wird.
    2.) versucht diese Stellen zu verbessern.
    3.) geht zurück zu 1.) und schaut, ob sich die Situation verbessert hat...

    Allgemein zur Performance von Bezier Paths:

    Je häufiger sich Pfade überschneiden, desto stärker nimmt die Zeichengeschwindigkeit ab.

    D. h. x-mal paralllelverlaufende Bezier Pfade zu zeichnen, ist um einen spürbare Faktor schneller, als die gleiche Anzahl von sich überschneidenden Pfaden zu zeichen.* Ab einer gewissen Anzahl von Schnittpunkten kann man allgemein erwarten, daß ein Image besser performt.

    Für eine Entscheidung, ob man mit Paths selber zeichnet oder ein Bild verwendet, können dann auch noch andere Kriterien eine Rolle spielen: Wie groß ist jeweils der Implementierungsaufwand? Lohnt der sich? Wie groß wäre ein Bild? Will ich das im App Bundle mitschleppen? Wie wirkt sich das auf das Memoryfootprint des Programms aus?....

    Wie gesagt, bei vier kleinen Linien braucht man sich idR um all das keine Gedanken zu machen.

    t.

    *Ich glaube der Effekt nimmt exponentiell mit der Anzahl der sich schneidenden Linien zu. Bin mir in diesem Punkt aber nicht ganz sicher.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • RE: Andere Ruler

    Ich mache mir lieber vorher einen bissel mehr aufwand, da ich mir sicher sein kann, dass mein interface designer nie genug bekommen kann und das ganze in der nächsten version garantiert animiert haben will. Ich hatte es schon 100te male, dass ich diesen fehler begangen habe und ich hab nicht vor ihn nochmals zu machen ;)

    Max

    P.S.: Zitat aus einem guten Buch:

    Haben sie jemals zweimal den selben dummen Fehler begangen?
    - Willkommen im wirklichen Leben.
    Ist ihnen dieser Fehler schon hunderte Male passiert?
    - Willkommen in der Softwareentwicklung.