- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 UIView(或者更确切地说它的 CALayer)设置动画,并且在动画结束时它不再可见(我进行 3D 变换,使其围绕 y 旋转 90°,想象一扇门朝你打开),虽然它是技术上“可见”,因为它的框架仍在屏幕上。
在此动画结束时,我在 animationDidStop:finished: 方法中将该 View 从其父 View 中移除。
问题是,有一个短暂的闪烁,您看到这个 View 在它被移除之前处于其原始未转换状态。
我想知道如何解决这个问题。我不知道。我尝试为图层的不透明度设置动画,但这也不起作用。闪烁仍然发生。
有任何想法吗?我可以提供任何东西,或者这里有人可能以前遇到过这个问题吗?
编辑:这是一些代码(向下滚动并查找 if(isHalfDone) where [subview removeFromSuperview];
- (void) pageOpenView:(UIView *)viewToOpen duration:(NSTimeInterval)duration pageTurnDirection:(PageTurnDirection) p{
// Remove existing animations before stating new animation
[viewToOpen.layer removeAllAnimations];
// Make sure view is visible
viewToOpen.hidden = NO;
// disable the view so it’s not doing anythign while animating
viewToOpen.userInteractionEnabled = NO;
float dir = p == 0 ? -1.0f : 1.0f; // for direction calculations
// create an animation to hold the page turning
CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
transformAnimation.removedOnCompletion = NO;
transformAnimation.duration = duration;
transformAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
CATransform3D startTransform = CATransform3DIdentity;
if (p == NEXT_PAGE) {
startTransform.m34 = 0.001f;
}else {
startTransform.m34 = -0.001f;
}
// start the animation from the current state
transformAnimation.fromValue = [NSValue valueWithCATransform3D:startTransform];
// this is the basic rotation by 90 degree along the y-axis
CATransform3D endTransform = CATransform3DMakeRotation(3.141f/2.0f,
0.0f,
dir,
0.0f);
// these values control the 3D projection outlook
if (p == NEXT_PAGE) {
endTransform.m34 = 0.001f;
endTransform.m14 = -0.0015f;
}else {
endTransform.m34 = -0.001f;
endTransform.m14 = 0.0015f;
}
transformAnimation.toValue = [NSValue valueWithCATransform3D:endTransform];
// Create an animation group to hold the rotation
CAAnimationGroup *theGroup = [CAAnimationGroup animation];
// Set self as the delegate to receive notification when the animation finishes
theGroup.delegate = self;
theGroup.duration = duration;
// CAAnimation-objects support arbitrary Key-Value pairs, we add the UIView tag
// to identify the animation later when it finishes
[theGroup setValue:[NSNumber numberWithInt:viewToOpen.tag] forKey:@"viewToOpenTag"]; // We set the tag to the page number
[theGroup setValue:[NSNumber numberWithInt: p] forKey:@"PageTurnDirection"];
[theGroup setValue:[NSNumber numberWithBool:YES] forKey:@"isAnimationMidpoint"]; // i.e. is this the first half of page-turning or not?
// Here you could add other animations to the array
theGroup.animations = [NSArray arrayWithObjects:transformAnimation, nil];
theGroup.removedOnCompletion = NO;
// Add the animation group to the layer
[viewToOpen.layer addAnimation:theGroup forKey:@"flipViewOpen"];
}
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
// Get the tag from the animation, we use it to find the animated UIView
NSNumber *tag = [theAnimation valueForKey:@"viewToOpenTag"];
PageTurnDirection dir = [[theAnimation valueForKey:@"PageTurnDirection"] intValue];
BOOL isHalfDone = [[theAnimation valueForKey:@"isAnimationMidpoint"] boolValue];
UIView *toStack; // the stack the page has moved from
UIView *fromStack; // the stack the new page will go to.
int indexDirection; // will be either 1 or -1
int targetLastPageInStack; // the page number that wants to get added to its stack (i.e. either high or low)
// depending on which direction we are turning, we search a different stack
if (dir == NEXT_PAGE) {
fromStack = rightStack;
toStack = leftStack;
indexDirection = 1;
int lastPg;
UIView *lastPgInStack;
if ([fromStack.subviews count] > 0) {
lastPgInStack = [fromStack.subviews objectAtIndex:0];
if ([lastPgInStack tag] == pageIndex) {
lastPg = pageIndex; // pagenr of currently last page in stack.
}
else {
// there was no last page, so the current page is the last page
lastPg = [lastPgInStack tag];
}
}else {
lastPg = pageIndex;
}
targetLastPageInStack = lastPg + 2;
}
else {
fromStack = leftStack;
toStack = rightStack;
indexDirection = -1;
int lastPg;
UIView *lastPgInStack = [fromStack.subviews objectAtIndex:0];
if ([lastPgInStack tag] == pageIndex-1) {
lastPg = pageIndex-1; // pagenr of currently last page in stack.
}
else {
// there was no last page, so the current page is the last page
lastPg = [lastPgInStack tag];
}
targetLastPageInStack = lastPg - 2;
}
// different handling if the page turning is half done, or fully done.
if (isHalfDone) {
UIView *subview = [fromStack viewWithTag:[tag intValue]];
if (flag) {
// Now we just hide the animated view since
// animation.removedOnCompletion is not working
// in animation groups. Hiding the view prevents it
// from returning to the original state and showing.
subview.hidden = YES;
[subview removeFromSuperview]; // REMOVE THE ANIMATED PAGE FROM THE STACK
// now create one on that stack
if ((dir == NEXT_PAGE && targetLastPageInStack <= self.endPageIndex) || (dir == PREV_PAGE && targetLastPageInStack >= self.startPageIndex)) {
BODBookPage *newPage = [BODBookPage pageInBook:&myDocumentRef pageNum:targetLastPageInStack frame:fromStack.bounds] ;
newPage.hidden = NO;
[fromStack insertSubview:newPage atIndex:0];
}
}
// now create the view for the page that'll be turned over and add it to the right stack. Probably set it to hidden as well.
BODBookPage *newPage = [BODBookPage pageInBook:&myDocumentRef pageNum:[tag intValue] + 1*indexDirection frame:toStack.bounds] ;
newPage.hidden = YES;
[toStack addSubview:newPage];
[self pageCloseView:newPage duration:turningTime/2.0f pageTurnDirection:dir];
}
else {
// we just animated the page turning from up to over
// now have to remove the most distant view, so the view at subview index 0. We do this to keep memory usage low.
if ([toStack.subviews count] > 1) {
[(UIView*)[toStack.subviews objectAtIndex:0] removeFromSuperview];
}
pageIndex = pageIndex + 2*indexDirection;
}
}
最佳答案
这是问题的答案:它是关于 animation fillMode property .
关于ios - CAAnimation - 更改动画最后一帧的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6199613/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!