小编Llo*_*d18的帖子

如何正确设置UIScrollView contentOffset的动画

我有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)

但是,现在它只在动画开始时执行一次.

我怎么解决这个问题?

cocoa-touch uiscrollview uiview uiviewanimation ios

18
推荐指数
3
解决办法
2万
查看次数

clipToBounds和masksToBounds性能问题

我有UIScrollView和其中包含UIImageViews的对象数量(UIView组合).一些UIImageViews有圆形边框(我用myImageView.layer.masksToBounds = YES;它).其他有矩形边框和图像的一部分(我Clip subviews在Interface Builder中使用属性).

问题是我发现剪辑属性在滚动时会对性能产生很大影响:

对于iPod touch(第4代)分析结果:

  • 启用剪辑属性(两者或其中之一)滚动时我有大约30帧/秒
  • 使用禁用的剪辑属性我在滚动时拥有所有60 fps

我真的需要将一些图像剪辑为圆形边界,将其他图像剪切为矩形边界(以显示图像的一部分).所以,这是我的问题:有什么方法可以提高性能?可能有低级别的方法(drawRect:或其他),或者可能是有用的围绕阿尔法掩蔽或我只是做错了什么?

performance cocoa-touch objective-c uiview ios

9
推荐指数
1
解决办法
7538
查看次数

在滚动时通过UIScrollView的子视图处理点击事件

我有自定义UIScrollView子类,里面有一些内容视图.在其中一些我有UITapGestureRecogniser.滚动视图不滚动时,一切正常.但是当它滚动内容视图时,不会收到点按动作.当滚动视图滚动时,通过子视图处理点击操作的最简单的解决方案是什么?

细节:

MyScrollView水平滚动.它包含许多内容视图(例如MyContentView).每个MyContentView宽度约为MyScrollView宽度的三分之一.因此,目前大约有3-4个可见MyContentView元素.主要的行为MyScrollView是1)确保在滚动之后,其中一个MyContentView元素将位于屏幕的中心,2)滚动到中心,MyContentView如果用户点击它.因此,主要答案,我希望得到的是如何"正确"贯彻在自来水行动处理MyContentViewMyScrollView减速.

我发现了一些相同的问题和答案,但没有一个让我满意.最好的是实现gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:UITapGestureRecogniser委托.但在这种情况下,我有时候(当我点击时,制作smaaaal拖动和释放手指,因此水龙头是钢可识别的(让我们称之为准水龙头))同时具有点击和滚动事件,即使滚动视图不滚动也会导致错误当我开始点击.当用户进行准点击时,我的应用程序尝试滚动到tapped MyContentView元素,然后立即处理正常滚动.由于在处理tap之后开始执行一些其他功能(它在正常滚动时不能执行),这似乎更加可怕.

我需要解决方案,其中滚动视图等待足以决定它不是点击事件,然后才滚动.否则,如果已识别出tap事件,则不得发生滚动.

cocoa-touch objective-c uiscrollview uigesturerecognizer ios

8
推荐指数
2
解决办法
5037
查看次数

KVO:我可以从具体物体中移除所有观察者

我正在使用键值观察.我有object_1(NSManagedObject)和其他一些对象观察者.当我从托管对象上下文中删除object_1时,我的程序崩溃了.

CoreData:错误:严重的应用程序错误.在Core Data更改处理期间捕获到异常.这通常是NSManagedObjectContextObjectsDidChangeNotification的观察者中的错误.

我可以将一些东西放到dealloc方法(或其他地方)来删除object_1的所有观察者吗?或者唯一合适的决定是在我即将从托管对象上下文中删除object_1并通过其他对象监听此通知(从object_1的观察者中删除自己)时发送通知?

cocoa objective-c key-value-observing

7
推荐指数
1
解决办法
7640
查看次数

beginSheet方法对我不起作用

我有saveWindowController(NSWindowController子类对象).我使用initWithWindowNibName:方法来初始化控制器.
我在xib中设置了File的所有者SaveWindowController.我在xib文件中连接delegate(从窗口)到File的所有者和window(从控制器)到NSWindow.

[NSApp beginSheet:[self.saveWindowController window] 
   modalForWindow:[self window]
    modalDelegate:nil didEndSelector:nil contextInfo:nil];
Run Code Online (Sandbox Code Playgroud)

执行此方法后,我看到没有标题栏的模态窗口,它看起来不像普通表.它只出现在第一个窗口的左下角.

你能帮帮我吗,我做错了什么?

macos cocoa nswindow cocoa-sheet

6
推荐指数
1
解决办法
1861
查看次数

如何将图像缩放到全屏模式?

我有UIScrollView图像分页.我想在一些手势上实现图像的动画缩放到全屏.另一个动画将图像缩放回滚动视图.就像在iPad上的照片应用程序或Safari中的视频一样.

当然它不会是UIImageView.它将是一些包含图像的包装类.主要问题是如何呈现全屏视图.是否必须是模态视图.

任何帮助表示赞赏.

iphone animation objective-c zooming ios

1
推荐指数
1
解决办法
7132
查看次数

NSFontManager setTarget:不适用于模态窗口

我有模态窗口.在它的控制器中我这样做:

[[NSFontManager sharedFontManager] orderFrontFontPanel:self];
Run Code Online (Sandbox Code Playgroud)

它工作正常.字体管理器changeFont:在我的控制器中调用方法

但是,如果我写这个代码:

[[NSFontManager sharedFontManager] setTarget:self];
[[NSFontManager sharedFontManager] setAction:@selector(qwe:)];
[[NSFontManager sharedFontManager] orderFrontFontPanel:self];
Run Code Online (Sandbox Code Playgroud)

它不起作用.当我在字体面板中选择字体时,它不会调用qwe:method.

原因是窗口是模态的(当我显示没有模态会话的窗口时,一切正常).问题是为什么目标 - 动作变体不适用于模态窗口?

感谢帮助.

xcode cocoa objective-c

0
推荐指数
1
解决办法
683
查看次数