在iOS中,有一个非常简单和强大的工具来动画添加和删除UITableView行,这里是来自youtube视频的剪辑,显示默认动画.请注意周围行如何折叠到已删除的行上.此动画可帮助用户跟踪列表中的更改以及数据更改时列表中的位置.
自从我在Android上开发以来,我发现没有相同的工具来动画TableView中的各个行.调用notifyDataSetChanged()我的适配器会导致ListView立即使用新信息更新其内容.我希望在数据发生变化时显示一个新行推入或滑出的简单动画,但我找不到任何记录的方法来执行此操作.看起来LayoutAnimationController可能包含一个键来使其工作,但是当我在ListView上设置LayoutAnimationController(类似于ApiDemo的LayoutAnimation2)并在列表显示后从我的适配器中删除元素时,元素立即消失而不是被动画化.
我还尝试过以下内容来删除单个项目时的动画:
@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {
Animation animation = new ScaleAnimation(1, 1, 1, 0);
animation.setDuration(100);
getListView().getChildAt(position).startAnimation(animation);
l.postDelayed(new Runnable() {
public void run() {
mStringList.remove(position);
mAdapter.notifyDataSetChanged();
}
}, 100);
}
Run Code Online (Sandbox Code Playgroud)
但是,动画行周围的行不会移动位置,直到它们在notifyDataSetChanged()调用时跳转到新位置.一旦放置了元素,ListView就不会更新它的布局.
虽然编写我自己的ListView实现/分支已经超出了我的想法,但这看起来似乎不应该那么困难.
谢谢!
在XCode中运行我的项目时,我的测试给出了以下错误:
target specifies product type 'com.apple.product-type.bundle.unit-test', but there's no such product type for the 'iphoneos' platform
Run Code Online (Sandbox Code Playgroud)
它发生在几次XCode更新之后.有谁知道如何解决这一问题?
作为一个学习练习,我试图实现一个子类,SKShapeNode它提供了一个新的便利初始化器,它接受一个数字并构造一个ShapeNode,它是一个数字宽度和高度的正方形.
根据Swift Book:
规则1
如果您的子类没有定义任何指定的初始值设定项,它会自动继承其所有超类指定的初始值设定项.
规则2
如果您的子类提供了所有超类指定初始化程序的实现 - 通过按照规则1继承它们,或者通过提供自定义实现作为其定义的一部分 - 那么它会自动继承所有超类便利初始化程序.
但是,以下类不起作用:
class MyShapeNode : SKShapeNode {
convenience init(squareOfSize value: CGFloat) {
self.init(rectOfSize: CGSizeMake(value, value))
}
}
Run Code Online (Sandbox Code Playgroud)
相反,我得到:
Playground execution failed: error: <REPL>:34:9: error: use of 'self' in delegating initializer before self.init is called
self.init(rectOfSize: CGSizeMake(value, value))
^
<REPL>:34:14: error: use of 'self' in delegating initializer before self.init is called
self.init(rectOfSize: CGSizeMake(value, value))
^
<REPL>:35:5: error: self.init isn't called on all paths in delegating initializer
} …Run Code Online (Sandbox Code Playgroud) 由于压倒性的用户投诉,我决定尝试允许我的Android应用程序的用户根据官方文档将其移动到SD卡.但是,我的应用程序的核心功能要求后台服务持续运行.如果有人将我的应用程序移动到SD卡上,无论出于何种原因都会安装SD卡,我的后台服务将被终止.
只要我能在第一个可用的机会重启服务,那对我来说一切都好.不幸的是,尽管安装位置指南声称我可以使用广播意图ACTION_EXTERNAL_APPLICATIONS_AVAILABLE来检测SD卡何时在本地重新安装,该标志本身的文档,此新闻组讨论以及我自己的测试表明此广播未传送到应用程序哪些可用.只有尚未移动到SD卡的应用才能获得广播意图.
有没有办法重新启动我的后台服务而不等待用户在重新安装SD卡后打开我的应用程序?
既然我们在Objective-C中有编译器支持的NSNumber文字,是否有一种比较NSNumber与已知整数值的首选方法?
旧的方式是
[myNumber integerValue] == 5
现在我们可以做[myNumber isEqualToNumber:@5]甚至[myNumber isEqualToNumber:@(someVariable)].
该isEqualToNumber:方法是否有优势,或者我们应该坚持使用integerValue,除非要比较的值已经是NSNumber?
我可以看到的一个优点是,如果someVariable从NSInteger变为CGFloat,则新方法不需要更改代码.
ios ×3
android ×2
objective-c ×2
animation ×1
cocoa ×1
listview ×1
sd-card ×1
sprite-kit ×1
swift ×1
unit-testing ×1
xcode ×1
xcode6 ×1