动画按钮图像的最佳方法是什么?
假设我想像6帧一样循环并让用户仍然可以点击按钮?
我应该为图像设置动画,并在界面构建器中只有一个隐形按钮吗?
有没有办法在定义中定义动画UIButton?
或者是否更好地为图像设置动画并找到用户触摸点并对其进行操作?
我有UIScrollView子类.它的内容是可重用的 - 大约有4或5个视图用于显示数百个元素(同时滚动隐藏的对象重用,并在需要查看它们时跳转到另一个位置)
我需要的是:能够自动滚动我的滚动视图到任何位置.例如,我的滚动视图显示第4,第5和第6个元素,当我点击某个按钮时,它需要滚动到第30个元素.换句话说,我需要UIScrollView的标准行为.
这很好用:
[self setContentOffset:CGPointMake(index*elementWidth, 0) animated:YES];
Run Code Online (Sandbox Code Playgroud)
但我需要一些定制.例如,更改动画持续时间,添加一些代码以在动画结束时执行.
明显的决定:
[UIView animateWithDuration:3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
[self setContentOffset:CGPointMake(index*elementWidth, 0)];
} completion:^(BOOL finished) {
//some code
}];
Run Code Online (Sandbox Code Playgroud)
但我有一些动作连接到滚动事件,所以现在它们都在动画块中,它导致所有子视图的帧也动画(感谢几个可重复使用的元素,所有这些都不是我想要的动画)
问题是:我如何制作自定义动画(实际上我需要自定义持续时间,最后操作和BeginFromCurrentState选项)以进行内容偏移而不动画连接到scrollViewDidScroll事件的所有代码?
UPD:
感谢Andrew的回答(第一部分)我解决了内部动画的问题scrollViewDidScroll:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
[UIView performWithoutAnimation:^{
[self refreshTiles];
}];
}
Run Code Online (Sandbox Code Playgroud)
但scrollViewDidScroll必须(为了我的目的)执行每一帧动画,就像它的情况一样
[self setContentOffset:CGPointMake(index*elementWidth, 0) animated:YES];
Run Code Online (Sandbox Code Playgroud)
但是,现在它只在动画开始时执行一次.
我怎么解决这个问题?
我希望UIProgressView在10秒内将我的进度从0变为1.
码:
[UIView animateWithDuration:10.0 animations:^{
[_myProgressView setProgress:1 animated:YES];
} completion:(BOOL finished)^{
if (finished) NSLog(@"animation finished);
}];
Run Code Online (Sandbox Code Playgroud)
动画工作正常,但完成后NSLog总是立即调用.
我试过animateWithDuration: withDelay:但延迟没有得到尊重并立即执行.
有谁遇到过同样的问题?
谢谢你的帮助.
在解释我的问题之前,重要的是要说我已经实现了这个问题中提出的建议,我认为我对这种animateWithDuration方法的怀疑是完全不同的,尽管两个问题的标题非常相似.
所以,我是一个Swift新手,我正在Swift做一些小项目,基于我以前做过的之前的Objective C演示.
这是我的Objective C代码:
- (void)moveSideBarToXposition: (int) iXposition{
[UIView animateWithDuration:0.5f
delay:0.1
options: UIViewAnimationOptionTransitionNone
animations:^{ self.mainView.frame = CGRectMake(iXposition, 20, self.mainView.frame.size.width, self.mainView.frame.size.height); }
completion:^(BOOL finished){
if (self.isSidebarHidden==YES) {
self.isSidebarHidden = NO;
}
else{
self.isSidebarHidden = YES;
}
}];
}
Run Code Online (Sandbox Code Playgroud)
这是我的Swift版本:
func moveSideBarToXposition(iXposition: Float) {
UIView.animateWithDuration(0.5, delay: 1.0, options: UIViewAnimationTransition.None, animations: { () -> Void in
self.contentView.frame = CGRectMake(iXposition, 20, self.contentView.frame.size.width, self.contentView.frame.size.height)
}, completion: { (finished: Bool) -> Void in
if isMenuHidden == true {
isMenuHidden = false …Run Code Online (Sandbox Code Playgroud) 我在UIStackView中嵌入了两个UILabel.顶部标签始终可见,但底部标签通过hidden属性打开和关闭.我想要将此效果设置为动画,因此我将其粘贴在动画块中:
private func toggleResultLabel(value:Double) {
if value == 0 {
UIView.animateWithDuration(0.25) { () -> Void in
self.resultLabel.hidden = true
}
} else {
UIView.animateWithDuration(0.25) { () -> Void in
// Something weird is happening. I had to add 3 of the same statements to get
// the hidden flag to be false
self.resultLabel.hidden = false
self.resultLabel.hidden = false
self.resultLabel.hidden = false
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是隐藏属性不会改变,除非我反复重复该语句(在这种情况下为3次).我在进入动画关闭时发现了这一点,并发现该属性不会改变它的赋值.现在我注意到看似随机发生的同样问题.true如果相关,则第二个标签的默认值为.
我在这里缺少什么,或者这是一个错误?
更新:为了它的价值,我通过添加removeArrangedSubview()以及addArrangedSubview():
if value == 0 …Run Code Online (Sandbox Code Playgroud) 由于将我的项目升级到swift 3,我的自动布局约束动画无法正常工作; 更具体地说,他们正在抢购新职位而不是动画.
UIView.animate(withDuration: 0.1,
delay: 0.1,
options: UIViewAnimationOptions.curveEaseIn,
animations: { () -> Void in
constraint.constant = ButtonAnimationValues.YPosition.DefaultOut()
self.layoutIfNeeded()
}, completion: { (finished) -> Void in
// ....
})
Run Code Online (Sandbox Code Playgroud)
我知道他们增加了UIViewPropertyAnimator课程,但还没有尝试.
我正在尝试创建一个效果,我在更改帧大小时更改我的UICollectionView的布局
最初,collectionView布局在整个屏幕上呈现"缩略图"库样式.
在将框架尺寸调整为细条后 - 我想呈现"电影条"风格的布局
两种布局都可以独立工作,并且符合预期.
我尝试过类似的代码:
[UIView animateWithDuration:1
delay:0.0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
self.collectionview.frame = newFrame; // animate the frame size
}
completion:^(BOOL finished) {
[self.collectionView.collectionViewLayout invalidateLayout];
[self.collectionView setCollectionViewLayout:filmstriplayout animated:YES]; // now set the new layout
}];
Run Code Online (Sandbox Code Playgroud)
但它看起来非常不稳定,没有按预期调整大小.
有没有办法在动画更改的同时更改集合视图布局和帧大小?
我有一个包含两个UIButtons的UIview.
-(void)ViewDidLoad
{
geopointView = [[UIView alloc] initWithFrame:CGRectMake(0, 350, 120, 80)];
geopointView.backgroundColor = [UIColor greenColor];
UIButton *showGeoPointButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
showGeoPointButton.frame = CGRectMake(0, 0, 120, 40);
showGeoPointButton.titleLabel.font = [UIFont systemFontOfSize:13.0];
[showGeoPointButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[showGeoPointButton addTarget:self action:@selector(showPlaces:) forControlEvents:UIControlEventTouchUpInside];
UIButton *SaveButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain]
SaveButton.frame = CGRectMake(0, 40, 120, 40);
SaveButton.titleLabel.font = [UIFont systemFontOfSize: 15.0];
[SaveButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[SaveButton addTarget:self action:@selector(savePlacePopUp) forControlEvents:UIControlEventTouchUpInside];
[geopointView addSubview:showGeoPointButton];
[geopointView addSubview:SaveButton];
}
Run Code Online (Sandbox Code Playgroud)
我想在调用以下方法时为UIview中的幻灯片设置动画.
-(void) showAnimation
Run Code Online (Sandbox Code Playgroud)
我试着通过以下方式来做,但我看不到动画.我该怎么做?
-(void) showAnimation{
[UIView animateWithDuration:10.0 animations:^{
[self.view addSubview:geopointView]; …Run Code Online (Sandbox Code Playgroud) 我需要处理一个案例,你可以做一些有或没有动画的事情,而不是:
if (animation)
{
[UIView animateWithBlock:^(){...}];
}
else
{
...
}
Run Code Online (Sandbox Code Playgroud)
我想要做:
[UIView animateWithBlock:^(){...} duration:(animation ? duration : 0)]
Run Code Online (Sandbox Code Playgroud)
但不确定它是否有效,即使它确实如此,是否有使用它的开销而不是直接更改视图?
谢谢
在我的应用程序中,我有一个页面视图控制器,允许用户在应用程序的不同"部分"之间滑动,并在导航栏的顶部我将标题文本更改为用户通过刷过的新部分pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:.当动画完成时,它当前正在立即更改标题文本.我想通过一些动画改进这一点,一种微妙的淡入淡出效果.
我首先尝试实现[UIView animationWithDuration:...]动画更改标题文本,但它不动画,只是仍然立即更新.
然后我想知道是否有可能更新导航栏标题的alpha,因为用户根据他们滚动的距离水平滚动,当下一部分即将出现在屏幕上时达到0 alpha,然后我可以立即在文本处于0时更改文本,然后快速淡入1 alpha.但是UIPageViewControllerDelegate当滚动位置更新时,我没有看到调用方法.
如果可能的话,我不仅可以淡入淡出,而且可以在导航栏中移动标题文本位置,就像通过滑动手势从推送segue导航回来时发生的默认动画一样.当用户滚动并在另一侧提供下一部分标题时,我会将旧部分标题滑过,这样当转换完成时,前一部分标题不在屏幕上,新的标题完全居中,因此替换完成.但同样需要确切知道用户滚动页面视图控制器的程度.
是否可以实现任何所需的动画?
ios ×10
uiviewanimation ×10
objective-c ×3
swift ×3
uiview ×3
animation ×1
cocoa-touch ×1
iphone ×1
swift2 ×1
swift3 ×1
uibutton ×1
uiscrollview ×1
xcode ×1
xcode7 ×1