澳门新葡萄京官网首页 18

Markdown简单介绍

本文实例讲述了js实现YouKu的漂亮搜索框效果。分享给大家供大家参考。具体如下:

最近群里有人私信我关于iOS物理引擎的知识,虽然UIDynamic在iOS7就引入了,但项目中还真没用到过,就简单研究了下。由于本demo很简单,就没有上传GitHub,想要源码的可以进文章底部的技术群获取。

Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。

运行效果如下图所示:

UIDynamic可以为继承UIView的控件添加物理行为。可以看下这些API
  • Dynamic Animator
    动画者,为动力学元素提供物理学相关的能力及动画,同时为这些元素提供相关的上下文,是动力学元素与底层iOS物理引擎之间的中介,将Behavior对象添加到Animator即可实现动力仿真

  • Dynamic Animator
    Item:动力学元素,是任何遵守了UIDynamic协议的对象,从iOS7开始,UIView和UICollectionViewLayoutAttributes默认实现协议,如果自定义对象实现了该协议,即可通过Dynamic
    Animator实现物理仿真。

  • UIDynamicBehavior:仿真行为,是动力学行为的父类,基本的动力学行为类包括:

    • UIGravityBehavior 重力行为
    • UICollisionBehavior 碰撞行为
    • UIAttachmentBehavior 吸附行为
    • UISnapBehavior 迅猛移动弹跳摆动行为
    • UIPushBehavior 推动行为

宗旨是易读易写,具有轻量、简单、通用的特点

在线演示地址如下:

具体实现步骤:

1、创建一个仿真者[UIDynamicAnimator]
用来仿真所有的物理行为2、创建具体的物理仿真行为[如重力UIGravityBehavior]3、将物理仿真行为添加给仿真者实现仿真效果。

我这里简单写几个行为事例,其他创建方法基本和这一样,可以自己尝试:

// 创建一个仿真者[UIDynamicAnimator] 用来仿真物理行为 UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; // 创建重力的物理仿真行为,并设置具体的items(需要仿真的view) UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[view]]; // 将重力仿真行为添加给仿真者实现仿真效果,开始仿真 [animator addBehavior:gravity];

具体效果:

澳门新葡萄京官网首页 1Untitled.gif

是不是很简单,咱们再来一个碰撞效果:

// 碰撞检测UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[view]];// 设置不要出边界,碰到边界会被反弹collision.translatesReferenceBoundsIntoBoundary = YES;// 开始仿真[animator addBehavior:collision];

具体效果:

澳门新葡萄京官网首页 2碰撞效果

// 创建震动行为,snapPoint是它的作用点 self.snap = [[UISnapBehavior alloc] initWithItem:view snapToPoint:view.center];// 开始仿真[animator addBehavior:collision];

具体效果:

澳门新葡萄京官网首页 3摆动效果

单效果创建都差不多,这里只写几个简单的,其他的可以看我参考的这篇文章

把单效果稍微组合一下:

// 创建一个仿真者[UIDynamicAnimator] 用来仿真物理行为 UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; // 创建重力的物理仿真行为,并设置具体的items(需要仿真的view) _gravity = [[UIGravityBehavior alloc] init]; _collision = [[UICollisionBehavior alloc] init]; _collision.translatesReferenceBoundsIntoBoundary = YES; // 将重力仿真行为添加给仿真者实现仿真效果,开始仿真 [self.animator addBehavior:_gravity]; [self.animator addBehavior:_collision]; // 为view添加重力效果 [self.gravity addItem:view]; // 为view添加碰撞效果 [self.collision addItem:view];

具体效果:

澳门新葡萄京官网首页 4重力加碰撞

 // 动态媒介 UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; [self.animators addObject:animator]; // 重力 UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[square]]; [animator addBehavior:gravity]; // 碰撞 UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[square]]; collision.collisionDelegate = self; [collision addBoundaryWithIdentifier:@"barrier" forPath:[UIBezierPath bezierPathWithRect:self.view.bounds]]; collision.translatesReferenceBoundsIntoBoundary = YES; [animator addBehavior:collision]; // 动力学属性 UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[square]]; itemBehavior.elasticity = 1; [animator addBehavior:itemBehavior];

澳门新葡萄京官网首页,具体效果:

澳门新葡萄京官网首页 5重力加弹跳,酷炫吧?

一些大厂在利用这些效果,比如苹果的iMessage消息滚动视觉差效果、百度外卖重力感应(这个用到了重力感应)、摩拜单车贴纸效果,接下来咱们就逐个实现一下这些效果:

这里参考了著名开发者王维@onevcat重的一篇文章

// 自定义UICollectionViewFlowLayout@interface WZBCollectionViewLayout : UICollectionViewFlowLayout// 重写prepareLayout方法- prepareLayout{ [super prepareLayout]; if (!_animator) { // 创建一个仿真者[UIDynamicAnimator] 用来仿真物理行为 _animator = [[UIDynamicAnimator alloc] initWithCollectionViewLayout:self]; CGSize contentSize = [self collectionViewContentSize]; NSArray *items = [super layoutAttributesForElementsInRect:CGRectMake(0, 0, contentSize.width, contentSize.height)]; for (UICollectionViewLayoutAttributes *item in items) { // 创建一个吸附行为 UIAttachmentBehavior *spring = [[UIAttachmentBehavior alloc] initWithItem:item attachedToAnchor:item.center]; spring.length = 0; spring.damping = .8; spring.frequency = .5; [_animator addBehavior:spring]; } }} // 重写这个方法刷新布局- shouldInvalidateLayoutForBoundsChange:newBounds { UIScrollView *scrollView = self.collectionView; CGFloat scrollDeltaY = newBounds.origin.y - scrollView.bounds.origin.y; CGFloat scrollDeltaX = newBounds.origin.x - scrollView.bounds.origin.x; CGPoint touchLocation = [scrollView.panGestureRecognizer locationInView:scrollView]; for (UIAttachmentBehavior *spring in _animator.behaviors) { CGPoint anchorPoint = spring.anchorPoint; CGFloat distanceFromTouch = fabs(touchLocation.y - anchorPoint.y); CGFloat scrollResistance = distanceFromTouch / 2000; UICollectionViewLayoutAttributes *item = [spring.items firstObject]; CGPoint center = item.center; center.y += (scrollDeltaY > 0) ? MIN(scrollDeltaY, scrollDeltaY * scrollResistance) : MAX(scrollDeltaY, scrollDeltaY * scrollResistance); CGFloat distanceFromTouchX = fabs(touchLocation.x - anchorPoint.x); center.x += (scrollDeltaX > 0) ? MIN(scrollDeltaX, scrollDeltaX * distanceFromTouchX / 2000) : MAX(scrollDeltaX, scrollDeltaX * distanceFromTouchX / 2000); item.center = center; [_animator updateItemUsingCurrentState:item]; } return NO;}

具体效果:

澳门新葡萄京官网首页 6防iMessage滚动效果

// 这里需要创建一个监听运动的管理者用来监听重力,然后实时改变重力方向 _motionManager = [[CMMotionManager alloc] init]; // 设备状态更新帧率 _motionManager.deviceMotionUpdateInterval = 0.01; // 创建view for (NSInteger i = 0; i < 40; i++) { UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MobikeTest"]]; imageView.frame = CGRectMake(100, 0, 50, 50); imageView.layer.masksToBounds = YES; imageView.layer.cornerRadius = 25; [self.view addSubview:imageView]; // 添加重力效果 [self.gravity addItem:imageView]; // 碰撞效果 [self.collision addItem:imageView]; self.dynamicItem.elasticity = .7; // 添加动力学属性 [self.dynamicItem addItem:imageView]; } // 开始监听 [self.motionManager startDeviceMotionUpdatesToQueue:NSOperationQueue.mainQueue withHandler:^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error) { // 设置重力方向 self.gravity.gravityDirection = CGVectorMake(motion.gravity.x * 3, -motion.gravity.y * 3); }];

具体效果:

澳门新葡萄京官网首页 7防摩拜单车贴纸效果

 // 这里需要创建一个监听运动的管理者用来监听重力方向,然后实时改变UI _motionManager = [[CMMotionManager alloc] init]; // 加速计更新频率,我这里设置每隔0.06s更新一次,也就是说,每隔0.06s会调用一次下边这个监听的block self.motionManager.accelerometerUpdateInterval = 0.06; // 开始监听 [self.motionManager startAccelerometerUpdatesToQueue:NSOperationQueue.mainQueue withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) { // 获取加速计在x方向上的加速度 CGFloat x = accelerometerData.acceleration.x; // collectionView的偏移量 CGFloat offSetX = self.collectionView.contentOffset.x; CGFloat offSetY = self.collectionView.contentOffset.y; // 动态修改偏移量 offSetX -= 15 * x; CGFloat maxOffset = self.collectionView.contentSize.width + 15 - self.view.frame.size.width; // 判断最大和最小的偏移量 if (offSetX > maxOffset) { offSetX = maxOffset; } else if (offSetX < -15) { offSetX = -15; } // 动画修改collectionView的偏移量 [UIView animateWithDuration:0.06 animations:^{ [self.collectionView setContentOffset:CGPointMake(offSetX, offSetY) animated:NO]; }]; }];

具体效果:

澳门新葡萄京官网首页 8防百度外卖首页重力感应

  • 本篇文章参考了
    • iOS中UIDynamic物理仿真详解
    • 王巍的技术博客
  • 最后几个效果图有点失真,具体效果可以找我要demo看
  • 最近急着招人,平时能挤出的时间也不多,所以这篇文章写的比较粗糙,有任何疑问都可以私信我
  • 喜欢就点个赞吧

我的更多文章:老司机带你飞

请不要吝惜,随手点个喜欢或者关注一下吧!您的支持是我最大的动力😊!您可以关注我以便及时查看我的最新文章,如果您对本篇文章有任何疑问,请随时私信我,您还可以加入我们的群,大家庭期待您的加入!

澳门新葡萄京官网首页 9我们的社区

标题

在行首插入 1 到 6 个 # ,对应到标题 1 到 6 阶。

具体写法:

澳门新葡萄京官网首页 10

效果展示:

具体代码如下:

一级标题

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"""html xmlns=""HTMLHEADmeta "Content-Type" content="text/html; charset=utf-8" /TITLE搜索条/TITLEstyle/*basic*/*{padding:0;margin:0;color:#000;font:12px/20px Arial,Sans-serif,"宋体";}/*elements*/.clear{clear:both;height:0px;overflow:hidden;}ul,li,ol{list-style-type:none;list-style-position:outside;}button,.btnNormal{height:22px;line-height:18px;padding:0 9px!important;padding:0 5px;}a{color:#0042ff;text-decoration:underline;}a,a *{cursor:pointer;}a img{border:0;}.searchTool{float:left;width:520px;}.searchTool .searchExtend{float:left;line-height:24px;_padding-top:5px;}.searchTool .radio{vertical-align:middle;margin-left:10px;margin-right:2px;*margin-right:0;}.searchTool .txtSearch{float:left;width:232px;padding:2px 2px 0 2px;height:20px;line-height:20px;vertical-align:bottom;border:1px solid #3e99d4;}.searchTool .selSearch{float:left;width:60px;background:#fff;height:22px;line-height:22px;border:1px solid #3e99d4;border-left:0;}.searchTool .nowSearch{float:left;width:40px;height:20px;line-height:22px;overflow:hidden;padding-left:4px;}.searchTool .btnSel{float:right;border-left:1px solid #3e99d4;width:14px;height:22px;}.searchTool .btnSel a{background:url(images/btn_sel.gif) no-repeat center center;display:block;width:14px;height:22px;}.searchTool .btnSel a:hover{background:url(images/btn_sel_over.gif) no-repeat center center;border:1px solid #fff;width:12px;height:20px;}.searchTool .selOption{z-index:9999;position:absolute;margin-left:-1px;width:60px;background:#fff;border:1px solid #3e99d4;}.searchTool .selOption a{display:block;height:21px;padding-left:5px;line-height:21px;color:#000;text-decoration:none;}.searchTool .selOption a:hover{color:#fff;background:#95d5f1;}.searchTool .btnSearch{float:left;margin-left:10px;width:58px;height:22px;line-height:22px;border:1px solid #3e99d4;overflow:hidden;}.searchTool .btnSearch a{background:url(images/bg_nav_option.gif) repeat-x center -6px;display:block;text-decoration:none;height:22px;line-height:22px;overflow:hidden;}.searchTool .btnSearch a:hover{background:url(images/bg_nav_option_over.gif) repeat-x center center;border:1px solid #fff;height:20px;line-height:20px;}.searchTool .btnSearch .lbl{cursor:pointer;display:block;width:40px;padding-left:5px;letter-spacing:5px;text-align:center;height:18px;padding-top:1px;margin:0 auto;filter:progid:DXImageTransform.Microsoft.DropShadow(color=#daeefa,offX=1,offY=1,positives=true);}.searchTool .btnSearch a:hover .lbl{padding-top:0px;}/stylescriptfunction drop_mouseover(pos){ try{window.clearTimeout(timer);}catch(e){}}function drop_mouseout(pos){ var posSel=document.getElementById(pos+"Sel").style.display; if(posSel=="block"){ timer = setTimeout("drop_hide('"+pos+"')", 1000); }}function drop_hide(pos){ document.getElementById(pos+"Sel").style.display="none";}function search_show(pos,searchType,href){ document.getElementById(pos+"SearchType").value=searchType; document.getElementById(pos+"Sel").style.display="none"; document.getElementById(pos+"Slected").innerHTML=href.innerHTML; document.getElementById(pos+'q').focus(); var sE = document.getElementById("searchExtend"); if(sE != undefined && searchType == "bar"){ sE.style.display="block"; }else if(sE != undefined){ sE.style.display="none"; } try{window.clearTimeout(timer);}catch(e){} return false;}/script/HEADBODYdiv form method="get" action="_playlist" name="headSearchForm" onsubmit="return dosearch(this);" input name="q" type="text" value="闯关东" / input name="searchdomain" type="hidden" value="" input name="searchType" type="hidden" value="playlist" div  div onclick="if(document.getElementById('headSel').style.display=='none'){document.getElementById('headSel').style.display='block';}else {document.getElementById('headSel').style.display='none';};return false;" onmouseout="drop_mouseout('head');"专辑/div div a href="#" onclick="if(document.getElementById('headSel').style.display=='none'){document.getElementById('headSel').style.display='block';}else {document.getElementById('headSel').style.display='none';};return false;" onmouseout="drop_mouseout('head');"/a/div div /div ul  lia href="#" onclick="return search_show('head','video',this)" onmouseover="drop_mouseover('head');" onmouseout="drop_mouseout('head');"视频/a/li lia href="#" onclick="return search_show('head','playlist',this)" onmouseover="drop_mouseover('head');" onmouseout="drop_mouseout('head');"专辑/a/li lia href="#" onclick="return search_show('head','user',this)" onmouseover="drop_mouseover('head');" onmouseout="drop_mouseout('head');"会员/a/li lia href="#" onclick="return search_show('head','bar',this)" onmouseover="drop_mouseover('head');" onmouseout="drop_mouseout('head');"看吧/a/li lia href="#" onclick="return search_show('head','pk',this)" onmouseover="drop_mouseover('head');" onmouseout="drop_mouseout('head');"PK擂台/a/li /ul /div div  a href="#" onclick="javascript:return dosearch(document.getElementById('headSearchForm'));"span 搜索/span/a /div div name="searchExtend"  input type="radio" name="sbt" value="post" onclick="csbt(this,this.form.sbts);" /搜贴子input type="radio" name="sbt" value="user" onclick="csbt(this,this.form.sbts);" /按作者搜input type="hidden" name="sbts" value="bar" /div div /div /form /div div /div /div /div/BODY/HTML

二级标题

希望本文所述对大家的javascript程序设计有所帮助。

三级标题

四级标题

五级标题
六级标题

段落

前面有回车,后面有换行符就可以。

列表

无序列表

“-”+“空格”(这里“+”、“-”、“*”都可以),表示无序列表

具体写法:

澳门新葡萄京官网首页 11

效果展示:

  • 无序列表
  • 无序列表
  • 无序列表

有序列表

“数字”+“英文句点”+“空格”,表示有序列表

具体写法:

澳门新葡萄京官网首页 12

效果展示:

  1. 有序列表
  2. 有序列表
  3. 有序列表

修辞和强调

用“星号”注释在文本两侧,表示强调。
具体写法:

澳门新葡萄京官网首页 13

效果展示:

此处是需要强调部分

代码展示

行内展示代码,可以使用反引号 ` 来标记代码区段;
代码区块表示,只要简单地缩进 4 个空格或是 1 个制表符Tab就可以。

链接图片

链接

具体写法:

澳门新葡萄京官网首页 14

效果展示:

简书

图片

![](具体链接)

具体写法:

澳门新葡萄京官网首页 15

效果展示:

澳门新葡萄京官网首页 16

Markdown

引用

在每行的最前面加上“ >“即可

澳门新葡萄京官网首页 17

效果展示:

这是一级引用

这是二级引用

表格

具体写法:

澳门新葡萄京官网首页 18

效果展示:

表头 表头 表头
内容 内容 内容
内容 内容 内容

发表评论

电子邮件地址不会被公开。 必填项已用*标注