Interface Inspector

Written by Stephan Michels on 21. September 2013. Posted in Uncategorized

I finally finished first my own software product called Interface Inspector. I wrote the Interface Inspector to debug my own applications during the development to see which are the visible views and their properties. I often have the problem that I don’t know why specific views are not visible or display a wrong content. With this tool I can now inspect the running application and see all necessary information. Moreover I can introspect other applications to see how they manage to build a specific design. A great way to learn from others.

The Interface Inspector is currently published as a public beta version and I hope this tool will be helpful for others too.

Screenshot of the Interface Inspector

 

Debug all called Objective-C methods

Written by Stephan Michels on 31. Januar 2013. Posted in Uncategorized

Once in a while I need to know which methods are called in my code. The simplest solution is to add a breakpoint on the function called objc_msgSend. This function is responsible for the call of every method in Objective-C

id objc_msgSend(id theReceiver, SEL theSelector, ...)

In Xcode you can add actions to breakpoints. In my case add a debugger command to evaluate the receiver and the selector. So I added following command:

expr -- (void)printf("[%s %s]\n",(char *) object_getClassName(*(long*)($rdi)), (char *)($rsi))

You might ask where I get the register names from. I found a good article on expaining the various registers of the different platforms: “Inspecting Obj-C parameters in gdb“.

Important is that you enable “Automatically continue after evaluating”.

Breakpoint on objc_msgSend

Breakpoint on objc_msgSend

Now you get a Output like this

[__NSCFConstantString copy]
[__NSCFConstantString copyWithZone:]
[NSObject valueWithRect:]
[NSObject valueWithBytes:objCType:]
[NSConcreteValue init]
[NSObject resolveInstanceMethod:]
[NSConcreteValue description]
[NSConcreteValue getValue:]
[NSObject stringWithFormat:]

Implementation of an inspector tab bar

Written by Stephan Michels on 29. Mai 2012. Posted in Uncategorized

For my own project I tried to create a similar tab bar like I have seen in the Xcode
inspector. Some of you might be interested in the source code, so I made it free and without any
restriction.

It took some time to find out how to create NSButtons witch look and work identical to
the tab bar buttons like in Xcode. First I created an custom NSButtonCell subclass to
draw the shadows left and right of the button to mimic the shadow of the selected
button.

    - (void)drawBezelWithFrame:(NSRect)frame inView:(NSView *)controlView {
        // Draw background only if the button is selected
        if (self.state == NSOnState) {
            [... draw shadow ...]
        }
    }

To get the etched look of icons you have to use template images and set the bezel style
of the button cell.

    self.bezelStyle = NSTexturedRoundedBezelStyle;

For the functional part, I have struggled a long time with the button action which has been
sent on the mouse up event. I wanted to switch the views on the mouse down event. Following
statement allows the button to send the action of the mouse down event.

    [button sendActionOn:NSLeftMouseDownMask];

The next problem was that button changed it’s state even if the button has already been
selected. To prevent this behavior I overrode the following method in the button cell.

    // prevent automatic state changes
    - (NSInteger)nextState {
        return self.state;
    }

Everything else was straight forward. I hope you find the tips and tricks useful. You
can find the source code on GitHub.

NSRulerView und NSRulerMarker

Written by Stephan Michels on 5. Februar 2012. Posted in Cocoa

Ich wollte für ein kleines Demoprogram (für  grafische Eingabe) Lineale und Guides hinzufügen, ähnlich wie bei Photoshop und anderen Programmen. Guides sind Hilfslinien, die Linealen hinzugefügt werden, um Objekte an diesen Hilfslinien auszurichten.

Nun hab ich dabei die Gelegenheit genutzt, meine Erkenntnisse bei der Implementierung der Guides zu dokumentieren.

Die hypot-Funktion

Written by Stephan Michels on 8. Januar 2012. Posted in Cocoa, Computergrafik

In diversen Fällen ist mir aufgefallen, dass nur Wenige die Funktion hypot („euclidean distance function“) kennen. Mit dieser Funktionen lässt sich elegant der Abstand zwischen zwei Punkten berechnen anstatt die Quadratwurzel aus dem Abstandsquadrat zu berechnen, welcher über den Satz von Pythagoras berechnet wurde.

NSPoint p1, p2;
CGFloat dx = p2.x - p1.x;
CGFloat dy = p2.y - p1.y;

CGFloat length = sqrtf(dx * dx + dy * dy);

Der Abstand lässt sich leichter und wie ich finde weniger fehleranfällig wie folgt berechnen:

CGFloat length = hypotf(dx, dy);

In meinen Verständnis hatte ich immer angenommen, dass die Funktion schneller sein könnte. Und um dies zu überprüfen habe ich ein kleines Programm (git://gist.github.com/1579069.git) geschrieben. Ich musste allerdings feststellen, dass tatsächlich die Funktion hypot langsamer war. Da der Unterschied wie ich finde minimal ist, werde ich weiterhin die Funktion hypot bevorzugen.

Result 1273819835.661994 in 14.537325 seconds (Sqrt)

Result 1273819836.367576 in 19.332056 seconds (Hypot)

 

Teilkurven von Bezier-Splines

Written by Stephan Michels on 8. Januar 2012. Posted in Cocoa, Computergrafik

 

Ich hatte folgendes Problem: Ich hatte eine Kurve, dargestellt durch ein Bezier-Spline, an deren Enden jeweils ein Pfeil angezeigt werden sollte. Nun sollte aber die Kurve nicht jeweils um die Länge der Pfeilspitzen verlängert werden, sondern die Kurve sollte um die Länge der Spitzen verkürzt werden.

 

Als Beispiel wurde hier ein Bezier-Spline mit den beiden Knotenpunkten p1 und p4, sowie mit den Kontrollpunkten p2 und p3 dargestellt. Die Idee ist nun eine Teilkurve zu finden, welche von Start bis End geht.

Nun lassen sich Teile von Splines nicht einfach berechnen wie z.B. bei geraden Linien, weil Splines parametrisierte Kurven sind. Selbst die Länge von Bezier-Splines lässt sich nicht ohne weiteres berechnen. Bei der Suche nach einer Lösung bin auf den wundervollen Artikel „Adaptive Subdivision of Bezier Curves“ von Maxim Shemanarev gestoßen.

Dieser Artikel handelt hauptsächlich von der Berechnung der Länge von Bezier-Splines. Seine Lösung benutzt eine ganze besondere Eigenschaft von Bezier-Splines, bei der von Bezier-Splines zwei Bruchstücke einfach über Trigonometrie berechnen werden können.

In der Darstellung wird gezeigt, dass wir zwei neue Kurven erhalten mit jeweils p1 und p1234 bzw. p1234 und p4 als Knotenpunkte, sowie p12 und p123 bzw. p234 und p34 als Kontrollpunkte.

Mit Hilfe von Intervallschachtelung lassen sich nun die Bruchstücke immer weiter verkleinern. Dabei werden die Bruchstücke dahingehend unterschieden, ob sich die Bruchstücke in dem gewünschten Intervall befinden oder nicht.

Auch hier hab ich ein kleines Demo-Programm geschrieben, um den Algorithmus auszuprobieren. Der Algorithmus ist als Kategorie von NSBezierPath wegen der einfachen Wiederverwendbarkeit implementiert. Auch um die Kategorie universell zu gestalten, habe ich darauf geachtet, dass der Algorithmus mit Linien-Segmenten und auch mit unterbrochen Segmenten umgehen kann. Der Code ist wieder zu finden auf Github.

Blobular Nachbau

Written by Stephan Michels on 4. Januar 2012. Posted in Cocoa, Computergrafik

Vor einiger Zeit bin ich auf ein ganz interessantes Javascript Demo gestoßen. Und zwar geht es um die Darstellung von zwei Kreisen mit einer Kontaktfläche, ähnlich zu zwei Tropfen, welche sich durch die Oberflächenspannung bei geringer Distanz verbinden.

Um diese Grafik zu erzeugen wird mit Hilfe einer Probe Volumen, dessen Radius die Krümmung kontrolliert, die Kontaktfläche modelliert. Im folgenden Schema wird hoffentlich verdeutlich wie ich dabei vorgegangen bin.

Zuerst wird die Position der Probe Volumen (c1, c2) mit Hilfe der Positionen der Kreise (b1, b2) und der Radien (r1, r2) bestimmt. Dabei werden die Schnittpunkte der beiden Kreise durch die Positionen der Kreise der Radien und des Radius des Probevolumens (rp) bestimmt (grün dargestellt).

Der Radius der grünen Kreise ist dabei einmal r1+ rp und entsprechend für den anderen Kreis r2 + rp.

Wie die Schnittpunkte von zwei Kreisen berechnet werden wird ganz gut von dem Artikel „Intersection of two circles“ von Paul Bourke beschrieben.

Die Schnittpunkte bilden nun die Positionen der Probe-Volumen und mit den Winkeln zwischen Positionen der Kreise lassen sich die Winkel bestimmen, mit welchen die verschiedenen Bögen berechnet werden können.

Jetzt gibt es noch einen Spezialfall, wenn beide Kreise weiter voneinander entfernt sind, dann fangen die Probe-Volumen an sich zu überlappen. Als Folge erhalte ich nun zwei getrennte Flächen. Dabei bilden die beiden Schnittpunkte der Probe-Volumen (m1, m2) weitere Stützpunkte für die resultierenden Flächen.

Für Interessierte ist der Code zu finden auf Github. Die Kreise lassen sich per Maus verschieben und der Radius des Probe-Volumen lässt sich über das Menü steuern. Eine interessante Erweiterung für eine zukünftige Version wäre z.B. mehr als zwei Kreise zu haben.

Einleitung

Written by Stephan Michels on 13. Dezember 2011. Posted in Persönlich

Hallo Zusammen,

ich will ein Blog führen zu den täglichen Herausforderungen, auf die ich so während meiner Arbeit treffe, in der Hoffnung, dass der eine oder andere davon profitieren kann. Die meisten Artikel werden sich auf Cocoa Programmierung für die Mac und iOS Platform beziehen, da das mein Hauptarbeitsfeld und Hobby ist.

Ich arbeite hauptsächlich als freiberuflicher Programmierer an Projekten für das iPhone, iPad und Mac. In meiner Freizeit (wenn ich welche habe), schreibe ich an meinen eigenen Mac Applikationen.

Ein bisschen zu meiner Person: Ich habe jahrelang mein Geld als Java Programmierer von Webapplikationen verdient und war der Sprache und Platform überdrüssig geworden. Und mal ehrlich: Kein Mensch kann Desktop Applikationen in Java ernst nehmen. Vielleicht noch Eclipse, aber das war es auch schon.

Jedenfalls habe ich dann begonnen Cocoa zu programmieren, als Hobby und noch bevor das iPhone Mainstream wurde. Mit dem Einzug von iPhone und später dem iPad habe ich eine Reihe von Projekten nebenberuflich geführt. Dies war so erfolgreich, dass ich mich später dazu entschied mich selbstständig zu machen. Und bis jetzt auch noch nicht bereut habe.

Aus naheliegenden Gründen bin ich deshalb immer interessiert an Anfragen bzgl. neuer Projekte. Einfach ein Mail schicken an stephan.michels@gmail.com