最近看一个app的源码,发现基本没有用第三方的开源组件,但是特效也做得不错,总结一下实现的思路
<!--more-->
简单的抽屉效果
效果如图:
这种抽屉效果很常见,开源组件也很多。但是一般开源组件都对Controller的结构有要求,有时候不是很方便。
原理主要是:主页面加侧边栏。当弹出侧边栏时,设置主页面的x为一个负数;当收回侧边栏时,将主页面的x设置为0。再加上一些动画和手势就可以了。
初始化侧边栏
func addSidePanelController() {
if (sidePanelController == nil) {
sidePanelController = UIStoryboard.deviceListPanelController() // 初始化侧边栏的controller,用storyboard或者代码不是核心
view.insertSubview(sidePanelController!.view, atIndex: 0) // 添加侧边栏view
sidePanelController!.view.frame = CGRectMake(
expandedOffset,
topLayoutGuide.length,
view.bounds.width - expandedOffset,
view.bounds.height - topLayoutGuide.length) // 设置侧边栏frame
addChildViewController(sidePanelController!) // 添加侧边栏controller为子controller
sidePanelController!.didMoveToParentViewController(self)
}
}
处理弹出和收回
func animatePanel(shouldExpand shouldExpand: Bool) {
if (shouldExpand) {
deviceListExpanded = true
animateCenterPanelXPosition(targetPosition:
-CGRectGetWidth(mainTabController.view.frame) + expandedOffset) { _ in
self.mainTabController.childViewEnabled = false
}
} else {
animateCenterPanelXPosition(targetPosition: 0) { _ in
self.deviceListExpanded = false
self.sidePanelController!.view.removeFromSuperview()
self.sidePanelController = nil
self.mainTabController.childViewEnabled = true
}
}
}
func animateCenterPanelXPosition(targetPosition targetPosition: CGFloat, completion: ((Bool) -> Void)! = nil) {
UIView.animateWithDuration(0.5,
delay: 0,
usingSpringWithDamping: 0.8,
initialSpringVelocity: 0,
options: .CurveEaseInOut,
animations: {
self.mainTabController.view.frame.origin.x = targetPosition
}, completion: completion)
}
UITableView行展开效果
效果如图:
这个效果的原理也很简单,不展开的时候row height是某个值,展开后是另一个值,在select row的时候做一个动画就可以了
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if (indexPath == tableView.indexPathForSelectedRow) {
return Compatibility.ProductCellHeight + 87
} else {
return Compatibility.ProductCellHeight
}
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.beginUpdates()
tableView.endUpdates()
}
override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
if indexPath == tableView.indexPathForSelectedRow {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
tableView.beginUpdates()
tableView.endUpdates()
return nil
}
return indexPath
}
隐藏static cell的某个section
总的来说,对于设置为static cell的UITableView,要想动态地隐藏部分section,通过heightForXXX没有用。即使设置成0,还是会出现在界面上,只是会挤压在一起
正确的做法是,用numberOfRows方法隐藏row,用titleForHeader和titleForFooter方法隐藏header和footer
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (section == monoPickerSection && hideMonoPicker) {
return 0
}
return super.tableView(tableView, numberOfRowsInSection: section)
}
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if (section == monoPickerSection && hideMonoPicker) {
return nil
}
return super.tableView(tableView, titleForHeaderInSection: section)
}
override func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? {
if (section == monoPickerSection && hideMonoPicker) {
return nil
}
return super.tableView(tableView, titleForFooterInSection: section)
}
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
在实现3D滚动效果的过程中,主要涉及以下几个关键步骤: 1. **自定义UICollectionViewFlowLayout**: 创建一个继承自UICollectionViewFlowLayout的新类,重写`layoutAttributesForItemAtIndexPath:`方法,计算每个...
为了帮助开发者更好地理解和掌握iOS游戏开发的技术要点,本文将基于“iPhone游戏源码集合”这一资源,详细介绍几个核心方面: 1. **游戏开发框架**:了解iOS游戏开发过程中常用的框架,如Cocos2d-x、Unity3D等。 2....
实现这个波浪动态效果主要涉及到以下几个关键知识点: 1. **Core Animation**:iOS中的Core Animation框架提供了强大的2D图形渲染和动画功能。在这个项目中,开发者利用Core Animation的CALayer来绘制波浪形状,并...
在源代码中,我们可以看到以下几个关键部分: 1. **游戏逻辑**:这部分代码定义了游戏规则和玩家的行为。例如,角色如何移动,敌人如何攻击,何时得分,何时失败等。这些逻辑通常会在GameplayKit或SpriteKit框架下...
源代码中的关键组件可能包括以下几个部分: 1. **GameScene**: 游戏的核心场景,包含游戏逻辑、玩家交互、对象更新和碰撞检测等功能。 2. **Sprites**: 游戏中的视觉元素,如角色、道具、环境等,由Cocos2D的精灵类...
源码中的关键组成部分可能包括以下几个方面: 1. **项目结构**:通常,一个iOS项目会有多个子目录,如"Classes"用于存放代码文件,"Resources"包含图片、音频、故事板文件等资源,"Info.plist"存储应用的元数据,...
在这款源码中,我们可以看到游戏的架构通常分为以下几个部分: 1. 初始化:游戏启动时进行资源加载、设置屏幕分辨率、初始化物理引擎等。 2. 场景管理:游戏包含多个场景,如主菜单、游戏关卡、得分界面等,每个场景...
源码分析可以从以下几个关键知识点入手: 1. **游戏框架**:《愤怒的小鸟》可能采用了Cocos2D或Unity等游戏引擎进行开发。Cocos2D是Objective-C的一个游戏开发库,它提供了丰富的2D图形渲染、动画和物理模拟功能。...
接下来,我们将深入探讨如何使用提供的教程来创建这个特效。教程通常会分为以下几个步骤: 1. **创建基础元素**:首先,我们需要在PPT中绘制出代表电池的形状,并设置适当的填充颜色和边框。然后,创建一个或多个小...
下面我们将深入探讨Cocos2dx中几个重要的EffectNodes及其使用方法。 1. **粒子系统(ParticleSystem)**:Cocos2dx中的粒子系统可以创建出火焰、烟雾、雪花等各种复杂的粒子效果。开发者可以通过调整粒子系统的属性...
从源码角度来看,游戏的实现主要分为以下几个关键模块: 1. **游戏逻辑**:三消游戏的核心算法是寻找并消除相邻的同色方块。在Quick-X中,这部分可能涉及到矩阵操作,通过遍历游戏棋盘,查找并交换满足条件的方块,...
在压缩包中,我们有以下几个文件: 1. **源码说明.htm**:这个文件很可能是对源码的详细解释,包括代码结构、主要类和函数的介绍,以及如何运行和测试的说明。 2. **安装说明.htm**:提供了安装和配置环境的步骤,...
图片裁剪控件在IT领域涉及到的知识点主要包括以下几个方面: 1. 图像处理:图像处理是计算机科学的一个分支,主要研究如何对数字图像进行操作和分析。在这个控件中,涉及到的主要操作包括裁剪、旋转、缩放等。这些...
通常,项目说明文档会包含以下几个部分: 1. **项目背景**:介绍为什么要做这样的功能,可能的应用场景,例如游戏、教育或艺术类应用。 2. **技术要点**:详细解释实现轨迹文字所用到的关键技术,如路径动画...
在这款游戏的源代码中,我们可以看到以下几个关键知识点: 1. **场景(Scene)与层(Layer)管理**:Cocos2d-x中的Scene是游戏的一个屏幕视图,而Layer则用于组织场景中的游戏元素。在这个拼图游戏中,每个关卡可能...
"简单的爱心动画"是一个专为直播场景设计的特效元素,它能够增加观众与主播之间的互动性,营造出温馨、友好的氛围。在这个主题下,我们将深入探讨爱心动画的设计原理、实现方式以及在直播平台中的应用。 首先,爱心...
跑酷游戏通常包含以下几个核心部分: 1. **角色控制**:在Unity中,角色控制通常通过Character Controller组件实现,它可以处理角色的移动、跳跃和碰撞检测。源码中可能包含了对角色输入的处理,如键盘或触摸屏事件...
cocos2d-x是一个跨平台的2D游戏开发框架,它基于C++,支持iOS、Android、Windows等多平台,并提供Python和Lua的绑定,方便不同背景的开发者使用。在2.2.6版本中,cocos2d-x已经具备了丰富的图形渲染、动画处理、物理...
接下来的几个章节分别讨论了游戏开发中更深入的主题,例如: - **游戏建筑模块**:介绍如何构建复杂的游戏场景和关卡。 - **深度探索精灵**:详细解释如何使用精灵来创建动态的游戏角色和环境元素。 - **滚动与乐趣*...
主要分为以下几个模块: - 主场景(Scene):游戏的核心场景,负责游戏的初始化、更新逻辑、渲染等。 - 游戏对象(GameObject):如飞机、子弹、敌人等,它们有自己的属性和行为,通常会继承自Cocos2d-x的Node类...