XCode / Objective-C Gestures ->Noob

Schattenfänger

Lt. Junior Grade
Registriert
Nov. 2010
Beiträge
273
Hey, wir machen gerade ObjC.
Und wollte da mal eine Kleinigkeit machen habe aber keine Ahnung von der Sprache.

Jedenfalls ich möchte einfach nur ein Bild pinchen bzw. zoomen. Und den Scalefaktor in einem Label ausgeben.

Ich habe jetzt im Storyboard das Bild und das Label hinzugefügt.
Dazu habe ich in dem ViewController.h

Code:
-(IBAction)pinch:(UIPinchGestureRecognizer*)sender;
    -(IBAction)show:(id)sender;

Und in ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    
     UIPinchGestureRecognizer *pinch=[[UIPinchGestureRecognizer alloc] initWithTarget: self action:@selector(pinch:)];
    [self.view addGestureRecognizer:pinch];
    
    
}


-(IBAction)pinch:(UIPinchGestureRecognizer*)recognizer{
    NSLog(@"Pinch with scale %.2f detected",recognizer.scale);
    CGFloat scale = recognizer.scale;
    //self.imageView.transform = CGAffineTransformScale(self.imagePanel.transform, scale, scale);
    recognizer.scale = 1.0;
}

-(void)show:(id)sender{
    
}

Also ich bekomme weder eine Fehlermeldung noch funktioniert es.

Ich habe zwar alles so gemacht wie ich es im Internet finde aber bin nicht in der Lage im StoryBoard vom ViewController zum Label zu "ziehen" und dass dann mit show zu verlinken, bzw wird show nicht angezeigt.
Gibt es neben dem Storyboard sonst noch eine Methode die Labels mit einer Methode zu verlinken? In Java würde ich ja einfach eine Methode aufrufen, aber hier weiß ich nichtmal wie man an das Label kommt.

In diesem Tutorial steht noch einiges an Code mit Property und IBOutlet muss ich villeicht damit noch was machen?
 
Du solltest dir noch einmal durchlesen was ein Property ist. Ich sehe hier weder dein Label im Code, noch eine Zuweisung von einem String an das Label.
Über IBOutlets stellst du sozusagen die Verknüpfung des Labels mit dem Code her, das musst du im Storyboard / Interface Builder machen und dann erzeugt er dir im Code eigentlich automatisch den entsprechenden Property Eintrag.

Am besten du nimmst dir erst einmal ein einfaches Tutorial und machst das um zu verstehen wie das alles zusammen wirkt. Es gibt sehr gute und gut verständliche Tutorials bei raywenderlich.com
 
Okay, danke die Setie ist auf jedenfall besser als die von Apple.

Also wenn ich das richtig verstanden habe, dann
property: erstellt getter/setter für eine Variable
IBAction: Wenn ich ein Event habe wird ein IBAction geworfen und die Methode aufgerufen
IBOutlet: Benötige ich wenn ich ein grafisches Element im Code ansprechen möchte.
Selector: Führt halt eine Methode aus.

Also ich habe jetzt ein IBOutlet UILabel *debugLabel im controller.h hinzugefügt, bekomme aber nur die Meldung, dass IBOutlet nur zu einer Instanzvariable oder property hinzugefügt werden kann. Und beim Compilieren, dass ich keine Variable innerhalb von @interface deklarieren kann. Aber im Tutorial stehen die innerhalb.

Und ich verstehe nach wie vor nicht wesshalb ich meine UIView bzw das Bild nicht mit einer Methode binden kann. Im Tutorial wird doch auch nur die Methode erstellt und dann im Storyboard zum graphischen Objekt hingezogen.
Im Endeffekt möchte ich nur mal, dass mein NSSlog invoked wird.
Ich mach das doch im Endeffekt genauso wie es überall steht.
 
Okay, anscheinend gehts wohl bei mir nicht mit dem "ziehen". Habe die Methoden/Vars einfach im Outline definiert und funktioniert.

Hätte da noch zwei Fragen.
Gibt es eine einfache Möglichkeit, die Bilder dynamisch zu skalieren? Im Moment habe ich einfach einen min/max Scale eingestellt. Und den Rest was ich gefunden habe war von Apple eine 200 Zeilen Methode.

Gibt es in OBJC irgendwelche Methodenunterscheidungen?
Wenn ich danach google gibt es nur [myObject method]
Aber es ist zb auch Möglich label.text =..... zu verwenden. Oder auch CGAffineTransform()... usw

Und was ist mit einem : hinter einem MethodenNamen? Sind die nur für IBActions? Wenn ich den nämlich wegmache bekomm ich einen Fehler für pinches.
 
Das mit dem ziehen sollte schon funktionieren, aber ich meine man muss eine Taste dazu gedrückt halten - habe das auch schon länger nicht mehr gemacht und kann es grad nicht testen.

Du kannst die Bilder sicher dynamisch skalieren, aber für so etwas ist google am besten, bzw. Stackoverflow hilft einem da weiter. Ich will jetzt auch nicht die Doku von Xcode durchforsten (wobei die wirklich gut ist!). Und was du dir durchlesen solltest ist das Konzept von delegates in Objective-C. Das hier sollte dir schon weiterhelfen und dann suchst du in der Doku nach der ImageView Klasse und schaust was sie dir anbietet:
https://developer.apple.com/library...esandDataSources/DelegatesandDataSources.html

Wenn du eckige Klammern verwendest wird im Prinzip eine Nachricht an das Object geschickt also [myObject method] sagt dem myObject das du method davon ausfuehren willst. Die Punkt Notation benutzt man wie in anderen Programmiersprachen um auf Member zuzugreifen, da dies ueber die Getter/Setter von Properties realisiert wird, passiert hier im Hintergrund das gleiche wie wenn du [label text] machen wuerdest sozusagen.

Wenn du etwas hast das wie CGAffineTransform() aussieht dann ist das C Code. Und die Doppelpunkte in den Methodenname sind dazu da die Parameter zu trennen. Schau dir hier mal den Vergleich zwischen Java und Objective-C Syntax an: https://blog.codecentric.de/en/2011/04/short-introduction-to-ios-for-java-developers-objective-c/

Wenn du die Doppelpunkte wegmachst dann aenderst du den Methodennamen bzw. die Signatur wie man es nennt. Und dann kann die Methode natuerlich nicht mehr aufgerufen werden.

Ansonsten besorg dir aus der Bibliothek vielleicht auch ein gutes Buch. Ich finde den Einstieg in Objective-C sogar leichter als in Java oder andere Programmiersprachen aber ein bisschen lesen muss man einfach.
 
Zurück
Oben