Abbrechen einer "animateWithDuration"

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Abbrechen einer "animateWithDuration"

    Hallo
    ich bin noch neue in dem Thema iOS.
    Daher eine Anfänger-Frage:
    Wie bricht man eine Animation ab die mittels einer „animateWithDuration“ gestartet wurde wurde bevor „completion“ eine Rückmeldung abgibt.

    Hintergrund ich suche eine Methode mit der ich an ein Label-Feld einen String übergeben kann.
    Der Text soll animiert werden, wenn er nicht vollständig in das Feld passt,eine laufende Animation muss abgebrochen werden sobald ein neuer Text eingestellt werden soll.

    Ich würde mich freuen wenn mir jemand einen Tipp geben kann oder eine Demo-Projekt zur Verfügung stellen könnte .

    Danke!!!

    Gruß Calpos
  • Hallo
    Danke für deine Antwort.
    Diese Antwort hatte ich in meiner Recherche vorher auch gefunden.
    Leider kriege ich es damit nicht zum Laufen, ich weiss nicht was ich falsch mache.
    Der Text läuft einfach weiter.
    Kannst du mir möglicherweise ein kurzes funktionsfähiges Demo Projekt zu Verfügung stellen.
    Ich wäre dir sehr Dankbar!!!!
    ich habe Teile dieses Codes eingebaut:
    CABasicAnimation innerhalb einer "Duration" stoppen und wieder von vorne starten
    Leider ohne Erfolg.
    Im Grunde beschreibt es die Lösung für das was ich mit einem Text machen möchte.
    Mein Wissen reicht offensichtlich nicht aus es so zu modifizieren, das es auf einen Text angewendet werden kann.
    Help!!!!
    Ich bin auch mit dieser leider Antwort nicht zurecht gekommen:
    stackoverflow.com/questions/12…uration-before-completion
    Gruß Calpos

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Calpos ()

  • Hallo


    hier meine Code:
    Was mache ich falsch?
    Ich bin Anfänger.
    ich kann auch mein Test -Projekt hochladen.



    //
    // ViewController.m
    // Scrolling
    //
    //

    #import "ViewController.h"
    #import <QuartzCore/QuartzCore.h>



    @interface ViewController ()



    @property (weak, nonatomic) UIView *centerView;
    @property (nonatomic, strong) NSMutableDictionary *displayLabel;
    @property (nonatomic, strong) NSMutableDictionary *displayHigh;
    @property (nonatomic, strong) NSMutableDictionary *displayField;


    @property (nonatomic, assign) bool isRunning;

    @end

    @implementation ViewController





    - (void)viewDidLoad {
    [super viewDidLoad];

    _isRunning = NO;

    [self removeCenterView];


    }





    - (IBAction)btn_Start:(id)sender
    {

    if (_isRunning)

    {
    [self.centerView.layer removeAllAnimations];
    }


    // Dieses wird später durch eine andere Anwendung aufbereitet
    // nur zu Demo und Test
    self.displayLabel =nil;

    self.displayLabel =[[NSMutableDictionary dictionary]init];

    self.displayHigh =nil;

    self.displayHigh =[[NSMutableDictionary dictionary]init];

    self.displayField =nil;

    self.displayField =[[NSMutableDictionary dictionary]init];


    [self.displayLabel setObject: @"11>> Dies Lang-Text Album-Titel"forKey:@"11"];
    [self.displayLabel setObject: @"12>> Dies Lang-Text Song -Titel"forKey:@"12"];

    [self.displayHigh setObject: @"0"forKey:@"11"];
    [self.displayHigh setObject: @"20"forKey:@"12"];

    [self.displayField setObject: @"F_CENTER_11"forKey:@"11"];
    [self.displayField setObject: @"F_CENTER_12"forKey:@"12"];
    //*************************************************************************

    [self labelAnimation:@"11"];

    [self labelAnimation:@"12"];

    _isRunning=YES;



    }




    - (IBAction)btn_Ende:(id)sender
    {
    [self.centerView.layer removeAllAnimations];

    [self removeCenterView];

    _isRunning = NO;


    }


    -(void)labelAnimation: (NSString *)field
    {

    // NSLog(@" currentStringField: %@", field);


    CGFloat textsize = 20.0f;
    NSString *fontName = @"Arial";

    NSString *currentString = [self.displayLabel objectForKey:field];

    NSString *high = [self.displayHigh objectForKey:field];

    BOOL center = YES;


    CGRect frame = self.centerView.frame;
    // NSLog(@" currentCenterFrame: %f", frame.size.width);
    // NSLog(@" currentCenterFrame: %f", frame.size.height);


    UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, [high intValue], frame.size.width, textsize)];


    [self.centerView addSubview:myLabel];
    [myLabel setFont:[UIFont fontWithName:fontName size:textsize]];



    CGSize textSize = CGSizeZero;
    CGSize maxSize = CGSizeMake(MAXFLOAT, CGRectGetHeight(myLabel.bounds));

    CGFloat startingX = 0.0f;
    CGFloat endX = 0.0f;
    CGFloat tsw = 0.0f;



    [self.centerView addSubview:myLabel];


    NSDictionary *textAttributes = nil;

    {
    // Use this labels attributes
    textAttributes = @{
    NSFontAttributeName: [UIFont fontWithName:fontName size:textsize]
    };
    }


    CGRect textRect = [currentString boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:textAttributes context:nil];

    textSize = textRect.size;

    {
    endX = myLabel.frame.size.width;
    tsw =textSize.width;

    // NSLog(@" endX : %f", endX);
    // NSLog(@" textSize: %f", textSize.width);
    // NSLog(@" textheight: %f", textSize.height);


    if(endX <=tsw)
    {
    startingX = 0;

    // self.tickerSpeed = 50;
    }
    else
    {

    if ( center )
    {
    startingX = (endX - textSize.width)/2;
    }
    else
    {
    startingX = 0.01;
    }

    }

    }


    endX = -textSize.width;

    // NSLog(@" endX : %f", endX);
    // NSLog(@" textSize : %f", textSize.width);
    //
    // NSLog(@" startingX: %f", startingX);
    // NSLog(@" origin.y : %f", myLabel.frame.origin.y);
    //
    // NSLog(@" textSize.width : %f", textSize.width);
    // NSLog(@" textSize.width : %f",maxSize.height);
    //
    //
    // NSLog(@" tickerSpeed: %f", _tickerSpeed);
    // NSLog(@"Anzahl Zeichen: %lu", (unsigned long)currentString.length);
    // NSLog(@" currentString: %@", currentString);

    [myLabel setFrame:CGRectMake(startingX, myLabel.frame.origin.y, textSize.width, textSize.height)];

    [myLabel setText:currentString];


    // Calculate a uniform duration for the item

    // float duration = (textSize.width + myLabel.frame.size.width) / tickerSpeed;

    float duration = 7.0f;


    // Create animation

    if( startingX == 0)
    {

    [UIView animateWithDuration:duration
    delay:1.0f
    options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState
    animations:^
    {
    // Update end position

    CGRect tickerFrame = myLabel.frame;

    tickerFrame.origin.x = endX;

    // tickerFrame.origin.x = -50;
    [myLabel setFrame:tickerFrame];

    }
    completion:^(BOOL finished)

    {
    if (self.isRunning)
    {

    [self labelAnimation:field];


    }
    }

    ];
    }


    }




    -(void)removeCenterView
    {
    [ self.centerView removeFromSuperview];

    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(100, 123,175,184)];

    self.centerView = myView;

    [self.view addSubview:self.centerView];
    [self.centerView setBackgroundColor:[UIColor cyanColor]];
    [self.centerView setClipsToBounds:YES];


    }


    @end
  • macmoonshine schrieb:

    Calpos schrieb:

    Kannst du mir möglicherweise ein kurzes funktionsfähiges Demo Projekt zu Verfügung stellen.
    Nein.
    Schau mal hier rein, da findest du Informationen zur Funktionsweise.
    Hallo
    Diese Infos sind mir auch bekannt.
    Mein Problem ist das ich diese Infost leider anzuwenden weis.
    Trag doch bitte in meine Code ein was zutun ist damit die Animation gecancelt werden kann.
    Meine Recherche in der Vergangenheit hat für mich die Erkenntnis gebracht, das viele mit dieser Sache ein Problem haben.
    Mich persönlich ärgert es das etwas derartigen nicht über das StoryBoard einstellen kann.
    Alles mögliche kann man mit Texten machen nur sie automatisch animieren, wenn sie zu lang sich für das Label-Feld, das geht nicht über das Storyboard.
    ich habe bislang im Netz keinen brauchbaren Tipp gefunden, der das Problem löst .
    Darum benötige ich eure Hilfe!!
    Gruß Calpos
  • Thallius schrieb:

    Calpos schrieb:

    Mich persönlich ärgert es das etwas derartigen nicht über das StoryBoard einstellen kann.
    Bist Du "ZusammenClicker" oder "Programmierer" ?
    Hallo Thallius
    Du hast Richtig erkannt das ich bin kein Programmierer bin.
    Ich habe nun aber eine Lösung gefunden mit der ich alles im StoryBoard "zusammenklicken" an.
    Perfect!!!!
    Das Ergebnis ist jetzt genauso wie ich es haben wollte.
    Man muss das Rad ja nicht immer wieder neu erfinden, frei nach dem Motto suchet der findet.

    Gruß Calpos.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Calpos ()

  • Hallo
    Unter dem Suchbegriff :
    marquee label objective c
    sind Lösungen zu finden,

    Meine habe ich unter:
    github.com/cbpowell/MarqueeLabel
    gefunden

    Die Einstellungen sind im StoryBord innerhalb von Sekunde durchführbar.
    Das DemoProjekt ist auch für einen Anfänger wie mich selbsterklärend.
    Das Tool ermöglicht genau das was ich Eingangs gewünscht habe aber mit "animatewithDuration" nicht habe realisiert können.
    Man kann hier Texte sehr einfach und schnell ohne großen Programmier-Aufwand realisieren.
    Wer aber nicht clicken möchte ........
    Gruß Calpos