我有一个数组数组,我正用于表视图的数据源.在一个时间实例中,我可能不得不对此数据结构进行一些复杂的修改.(例如,我可能需要做的一系列操作是:在这里删除一行,在那里插入一行,在此处插入一个部分,删除另一行,插入另一行,删除另一行,插入另一部分 - 你得到如果对于序列中的每个操作,我只更新数据源,然后立即对表视图执行相应的更新,这很容易做到.换句话说,伪代码看起来像:
[arrayOfArrays updateForOperation1];
[tableView updateForOperation1];
[arrayOfArrays updateForOperation2];
[tableView updateForOperation2];
[arrayOfArrays updateForOperation3];
[tableView updateForOperation3];
[arrayOfArrays updateForOperation4];
[tableView updateForOperation4];
// Etc.
Run Code Online (Sandbox Code Playgroud)
但是,如果我在beginUpdates/endUpdates"块"中包含这些操作,则此代码不再起作用.要了解原因,请先从空表视图开始,然后在第一部分的开头依次插入四行.这是伪代码:
[tableView beginUpdates];
[arrayOfArrays insertRowAtIndex:0];
[tableView insertRowAtIndexPath:[row 0, section 0]];
[arrayOfArrays insertRowAtIndex:0];
[tableView insertRowAtIndexPath:[row 0, section 0]];
[arrayOfArrays insertRowAtIndex:0];
[tableView insertRowAtIndexPath:[row 0, section 0]];
[arrayOfArrays insertRowAtIndex:0];
[tableView insertRowAtIndexPath:[row 0, section 0]];
[tableView endUpdates];
Run Code Online (Sandbox Code Playgroud)
当调用endUpdates时,表视图发现您正在插入所有在第0行发生冲突的四行!
如果我们真的想保留beginUpdates/endUpdates代码的一部分,我们必须做一些复杂的事情.(1)我们在不更新表视图的情况下对数据源进行所有更新.(2)我们弄清楚在所有更新之前数据源的各部分如何在所有更新之后映射到数据源的各个部分,以确定我们需要为表视图执行哪些更新.(3)最后,更新表视图.伪代码看起来像这样,以完成我们在前面的例子中尝试做的事情:
oldArrayOfArrays = [self recordStateOfArrayOfArrays];
// Step 1:
[arrayOfArrays insertRowAtIndex:0];
[arrayOfArrays insertRowAtIndex:0];
[arrayOfArrays insertRowAtIndex:0];
[arrayOfArrays insertRowAtIndex:0];
// Step 2:
// Comparing the old and new …
Run Code Online (Sandbox Code Playgroud) 在视图的UIView动画中,您可以通过包含在options参数中来为其布局的子视图设置动画.然而,当它们不是某个视图的背衬层时,我无法找到一种方法来设置其子层的动画.他们只是跳到位以匹配视图的新界限.因为我正在使用图层而不是视图,所以我似乎必须使用Core Animation而不是UIView动画,但我不知道如何(以及何时)这样做,使得图层动画与视图匹配动画.UIViewAnimationOptionLayoutSubviews
[UIView animateWithDuration:delay:options:animations:completion:]
这是我的基本问题.如果你想知道我想要完成的具体事情,请阅读更多内容.
我通过向视图的图层添加CAShapeLayer创建了一个带有虚线边框的视图(请参阅此stackoverflow问题:UIView周围的虚线边框).我调整CAShapeLayer的路径以匹配视图的边界layoutSubviews
.
这是有效的,但有一个美容问题:当视图的边界在UIView动画中动画时(如旋转期间),虚线边框跳转到视图的新边界,而不是在视图动画其边界时平滑地动画.也就是说,当视图动画时,虚线边框的右边部分和底部部分不会分别保持与视图的右边部分和底部部分紧密相连.我怎样才能从CAShapeLayer中获取虚线边框,以便在视图动画边界时为视图设置动画?
到目前为止我正在做的是将CABasicAnimation附加到CAShapeLayer:
- (void)layoutSubviews
{
[super layoutSubviews];
self.borderLayer.path = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
self.borderLayer.frame = self.bounds;
CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
[self.borderLayer addAnimation:pathAnimation forKey:nil];
}
Run Code Online (Sandbox Code Playgroud)
这确实会使虚线边框生成动画,但它没有正确的计时功能和动画持续时间来匹配视图动画.此外,有时候,我们不希望虚线边框有动画,例如,当视图首先进行布局时,边框不应该从一些旧路径动画到新的正确路径; 它应该出现.
我遇到了一个错误,其中表视图可能会丢失对标题标题的跟踪,并在其位置创建新的标题标题.(请参见下图;右侧屏幕截图显示丢失的标题.)
虽然我不知道确切原因,但是当我以编程方式滚动表视图并通过调用"beginUpdates"和"endUpdates"同时更新它时,似乎会发生这种情况.任何人都可以解释为什么表视图失去了节标题的跟踪?什么时候发生这种情况?
下面,我提供了一个演示此问题的视图控制器的代码.代码显示一个表视图,其数据模型是一个字符串数组的数组.按下添加按钮时,会向表中添加一个新行并滚动到视图中.在添加一小段时间后,新行比其他单元格更高,以显示它是新添加的单元格.要重现该错误,请按几次"添加"按钮,然后滚动到顶部.(我在4英寸64位iPhone模拟器中对此进行了测试.)
可能导致错误的代码位于" pressedAddButton: "方法中,因为它是在那里我同时滚动和更新表视图.(编辑:许多其他代码只是用于设置数据模型并为表视图提供数据源和委托方法的样板.)
注意:要使代码运行,请将视图控制器放在UINavigationController中并显示导航控制器:
ABCTestViewController * testViewController = [[ABCTestViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController * navigationController = [[UINavigationController alloc] initWithRootViewController:testViewController];
// Now show the navigation controller.
Run Code Online (Sandbox Code Playgroud)
在ABCTestViewController.h中:
#import <UIKit/UIKit.h>
@interface ABCTestViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property (weak, nonatomic) UITableView * tableView;
// The data model is an array of arrays of strings.
@property (strong, nonatomic) NSMutableArray * dataModel;
// The special row will be shown as being taller than the other rows.
@property (strong, nonatomic) …
Run Code Online (Sandbox Code Playgroud) 当浏览AngularJS的开发人员指南时,我注意到当使用后退按钮导航回页面时,我不会回到上一个滚动位置.相反,我回到了顶端.由于开发人员指南是使用AngularJS构建的,我担心,当我使用AngularJS构建自己的Web应用程序时,如果他们有相同的体验,它会使我的用户烦恼.为什么会发生这种情况,如何解决?我是否需要以某种方式使用HTML5的历史记录API?
转到开发人员指南并亲自查看此行为:http://docs.angularjs.org/guide/directive
在iOS 7中,我能够处理自定义呈现视图控制器的布局,还通过添加约束来考虑调用状态栏,其中呈现的视图控制器具有与呈现视图控制器相同的中心和相同的宽度和高度.这对于宽度和高度使用自动调整大小是优选的,否则,当呼叫状态栏消失时,由于某种原因,呈现的视图控制器将保持从顶部向下推20点.
然而,在iOS 8中,这个技巧不再起作用了.首先,我通过实验发现,呈现视图控制器似乎不一定在容器视图中,因此我无法将这些约束添加到容器视图中.(2014年WWDC视频中的"A Look Inside Presentation Controllers"的示例代码没有将呈现视图控制器放在那里.)似乎让所呈现的视图控制器使用自动布局或自动调整大小来填充容器视图将起作用,但我发现当呼叫状态栏消失时,容器视图本身可能会被按下20分(在iOS 7中不是这种情况).
我一直在使用"A Look Inside Presentation Controllers"示例代码,但即使这段代码也无法正确处理通话状态栏.(UIPresentationController
顺便说一句,我仍然试图处理新的API.)
我有一个视图控制器呈现另一个视图控制器modalPresentationStyle = UIModalPresentationCustom
.设置的内容使得呈现视图控制器视图的一部分显示在呈现的视图控制器视图下方.在此状态下,呈现视图控制器仍然可以正确处理自动旋转,并使用autolayout处理呈现的视图控制器的旋转.
我现在正尝试使用iOS 7的自定义视图控制器转换API以交互方式实现解除呈现的视图控制器.它的工作原理除外,当取消交互式解雇时,自动旋转的处理停止工作.(它会在稍后解除所呈现的视图控制器之后再次工作.)为什么会发生这种情况,我该如何解决这个问题?
编辑:这是您可以运行以演示问题的代码.从下面弹出一个视图,您可以通过向下滑动来消除它.如果通过不完全向下滑动来取消解雇,则呈现视图控制器的视图不再响应旋转,并且呈现的视图控制器的视图具有混乱的布局.
编辑:以下是作为Xcode项目的代码链接:https://drive.google.com/file/d/0BwcBqUuDfCG2YlhVWE1QekhUWlk/edit? usp =sharing
对于大规模的代码转储感到抱歉,但我不知道我做错了什么.这是一个正在发生的事情的草图:ViewController1
礼物ViewController2
.ViewController1
实现UIViewControllerTransitioningDelegate
,因此它返回动画/交互控制器的转换.ViewController2
有一个平移手势识别器,驱动互动解雇; 它实现UIViewControllerInteractiveTransitioning
了作为解雇的交互式控制器.如果用户将视图拖得足够远,它还会保留对动画控制器的引用以解除转换以完成转换.最后,有两个动画控制器对象.PresentAnimationController
设置autolayout约束以处理呈现的视图控制器视图的旋转,并DismissAnimationController
完成解雇.
ViewController1.h
#import <UIKit/UIKit.h>
@interface ViewController1 : UIViewController <UIViewControllerTransitioningDelegate>
@end
Run Code Online (Sandbox Code Playgroud)
ViewController1.m
#import "ViewController1.h"
#import "ViewController2.h"
#import "PresentAnimationController.h"
#import "DismissAnimationController.h"
@implementation ViewController1
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = @"View 1";
self.navigationItem.prompt = @"Press “Present” and then swipe …
Run Code Online (Sandbox Code Playgroud) 给定[UIView animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:]中使用的spring参数:
时间与位置图的数学方程是什么?
(我试图在iOS 7中处理新的弹簧动画API,但是我没有得到好的结果,实验花了太长时间.我的目标是尽可能接近我的动画曲线如果我使用Core Animation而不是UIView的块对象动画,我会指定使用CAMediaTimingFunction.)
animation equation uiviewanimation uiviewanimation-curve ios7
ios ×5
ios7 ×3
iphone ×3
objective-c ×2
uitableview ×2
angularjs ×1
animation ×1
calayer ×1
cocoa-touch ×1
equation ×1
ios8 ×1
uiview ×1