• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: How to redraw a view in slow-motion
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How to redraw a view in slow-motion


  • Subject: Re: How to redraw a view in slow-motion
  • From: Matthias Arndt <email@hidden>
  • Date: Sat, 25 Jun 2011 09:19:25 +0200

Hi guys,

I'd just like to give you some final feedback, how I was able to solve my problem, drawing a view with some thousand paths in a slow-motion. You all have contributed to this approach, which is a mixture of your suggestions, and works pretty well so far.

The basic idea:

1. make the drawing object able to draw only a part of all paths. Therefore I introduced an NSRange property, which reflects by default all paths
2. use a timer to step through the paths in small portions for each animations step and trigger drawRect: (I skipped the timer and use "performSelector")
3. As the previous drawing is still visible, it's not necessary to draw from the 1st path with every animation step
4. to avoid a corrupted display, I handle resizing (or changed view options) with a complete redraw

For those who are interested I attached some code fragments of the related NSView object.

Thanks again for your support!
Matthias

NSView:

- (void)startAnimation
{
	[design setDisplayRange:NSMakeRange(0, 0)];
	[self setAnimationStep:15];
	[self setAnimationDelay:0.1];
	[self nextAnimationStep:nil];
}

- (void)pauseAnimation
{
	[NSObject cancelPreviousPerformRequestsWithTarget:self];
}

- (void)resumeAnimation
{
	[self nextAnimationStep:nil];
}

- (void)stopAnimation
{
	[design setDisplayRange:NSMakeRange(0, [[design stitches] count])];
	[NSObject cancelPreviousPerformRequestsWithTarget:self];
	[self setNeedsDisplay:YES];
}

- (void)nextAnimationStep:(NSTimer *)sender
{
	NSRange displayRange = [design displayRange];
	displayRange.location += displayRange.length;
	displayRange.length = [self animationStep];

	if ((displayRange.location + displayRange.length) >= [design numberOfStitches])
	{
		[self stopAnimation];
	}
	else
	{
		[design setDisplayRange:displayRange];
		[self performSelector:@selector(nextAnimationStep:) withObject:nil afterDelay:[self animationDelay]];

		[self setNeedsDisplay:YES];
	}
}

- (void)setFrame:(NSRect)frameRect
{
	[super setFrame:frameRect];

	BOOL animationActive = ([design displayRange].location != 0);
	if (animationActive)
	{
		NSRange displayRange = [design displayRange];
		[design setDisplayRange:NSMakeRange(0, displayRange.location + displayRange.length)];
	}
}
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

References: 
 >Re: How to redraw a view in slow-motion (From: Matthias Arndt <email@hidden>)
 >Re: How to redraw a view in slow-motion (From: Graham Cox <email@hidden>)

  • Prev by Date: Re: tooltips not firing on first try
  • Next by Date: Strange pause selecting row in NSTableView
  • Previous by thread: Re: How to redraw a view in slow-motion
  • Next by thread: Re: How to redraw a view in slow-motion
  • Index(es):
    • Date
    • Thread