当前位置: 首页 > news >正文

网站反链接是什么意思郑州网站建设代理

网站反链接是什么意思,郑州网站建设代理,网站后台基本功能,shopkeeper wordpress转#xff1a;http://blog.sina.com.cn/s/blog_8988732e01012eaf.html iPhoneOS中的触摸事件基于多点触摸模型。用户不是通过鼠标和键盘#xff0c;而是通过触摸设备的屏幕来操作对象、输入数据、以及指示自己的意图。iPhoneOS将一个或多个和屏幕接触的手指识别为多点触摸序列… 转http://blog.sina.com.cn/s/blog_8988732e01012eaf.html iPhoneOS中的触摸事件基于多点触摸模型。用户不是通过鼠标和键盘而是通过触摸设备的屏幕来操作对象、输入数据、以及指示自己的意图。iPhoneOS将一个或多个和屏幕接触的手指识别为多点触摸序列的一部分该序列从第一个手指碰到屏幕开始直到最后一个手指离开屏幕结束。iPhoneOS通过一个多点触摸序列来跟踪与屏幕接触的手指记录每个手指的触摸特征包括手指在屏幕上的位置和发生触摸的时间。应用程序通常将特定组合的触摸识别为手势并以用户直觉的方式来进行响应比如对收缩双指距离的手势程序的响应是缩小显示的内容对轻拂屏幕的手势则响应为滚动显示内容。 请注意手指在屏幕上能达到的精度和鼠标指针有很大的不同。当用户触击屏幕时接触区域实际上是椭圆形的而且比用户想像的位置更靠下一点。根据触摸屏幕的手指、手指的尺寸、手指接触屏幕的力量、手指的方向、以及其它因素的不同其“接触部位”的尺寸和形状也有所不同。底层的多点触摸系统会分析所有的这些信息为您计算出单一的触点。 很多UIKit类对多点触摸事件的处理方式不同于它的对象实例特别是像UIButton和UISlider这样的UIControl的子类。这些子类的对象—被称为控件对象—只接收特定类型的手势比如触击或向特定方向拖拽。控件对象在正确配置之后会在某种手势发生后将动作消息发送给目标对象。其它的UIKit类则在其它的上下文中处理手势比如UIScrollView可以为表格视图和具有很大内容区域的文本视图提供滚动行为。 某些应用程序可能不需要直接处理事件它们可以依赖UIKit类实现的行为。但是如果您创建了UIView的定制子类—这是iPhoneOS系统开发的常见模式—且希望该视图响应特定的触摸事件就需要实现处理该事件所需要的代码。而且如果您希望一个UIKit对象以不同的方式响应事件就必须创建框架类的子类并重载相应的事件处理方法。 事件和触摸 在iPhone OS中触摸动作是指手指碰到屏幕或在屏幕上移动它是一个多点触摸序列的一部分。比如一个pinch-close手势就包含两个触摸动作即屏幕上的两个手指从相反方向靠近对方。一些单指手势则比较简单比如触击、双击、或轻拂即用户快速碰擦屏幕。应用程序也可以识别更为复杂的手势举例来说如果一个应用程序使用具有转盘形状的定制控件用户就需要用多个手指来“转动”转盘以便进行某种精调。 事件是当用户手指触击屏幕及在屏幕上移动时系统不断发送给应用程序的对象。事件对象为一个多点触摸序列中所有触摸动作提供一个快照其中最重要的是特定视图中新发生或有变化的触摸动作。一个多点触摸序列从第一个手指碰到屏幕开始其它手指随后也可能触碰屏幕所有手指都可能在屏幕上移动。当最后一个手指离开屏幕时序列就结束了。在触摸的每个阶段应用程序都会收到事件对象。 触摸信息有时间和空间两方面时间方面的信息称为阶段phrase表示触摸是否刚刚开始、是否正在移动或处于静止状态以及何时结束—也就是手指何时从屏幕举起参见图3-1。触摸信息还包括当前在视图或窗口中的位置信息以及之前的位置信息如果有的话。当一个手指接触屏幕时触摸就和某个窗口或视图关联在一起这个关联在事件的整个生命周期都会得到维护。如果有多个触摸同时发生则只有和同一个视图相关联的触摸会被一起处理。类似地如果两个触摸事件发生的间隔时间很短也只有当它们和同一个视图相关联时才会被处理为多触击事件。 图3-1 多点触摸序列和触摸阶段 在iPhone OS中一个UITouch对象表示一个触摸一个UIEvent对象表示一个事件。事件对象中包含与当前多点触摸序列相对应的所有触摸对象还可以提供与特定视图或窗口相关联的触摸对象参见图3-2。在一个触摸序列发生的过程中对应于特定手指的触摸对象是持久的在跟踪手指运动的过程中UIKit会对其进行修改。发生改变的触摸属性变量有触摸阶段、触摸在视图中的位置、发生变化之前的位置、以及时间戳。事件处理代码通过检查这些属性的值来确定如何响应事件。 图3-2 UIEvent对象及其UITouch对象间的关系 系统可能随时取消多点触摸序列进行事件处理的应用程序必须做好正确响应的准备。事件的取消可能是由于重载系统事件引起的电话呼入就是这样的例子。 事件的传递 系统将事件按照特定的路径传递给可以对其进行处理的对象。如“核心应用程序架构”部分描述的那样当用户触摸设备屏幕时iPhoneOS会将它识别为一组触摸对象并将它们封装在一个UIEvent对象中放入当前应用程序的事件队列中。事件对象将特定时刻的多点触摸序列封装为一些触摸对象。负责管理应用程序的UIApplication单件对象将事件从队列的顶部取出然后派发给其它对象进行处理。典型情况下它会将事件发送给应用程序的键盘焦点窗口—即拥有当前用户事件焦点的窗口然后代表该窗口的UIWindow对象再将它发送给第一响应者进行处理第一响应者在 “响应者对象和响应者链”部分中描述。 应用程序通过触碰测试hit-testing来寻找事件的第一响应者即通过递归调用视图层次中视图对象的hitTest:withEvent:方法来确认发生触摸的子视图。触摸对象的整个生命周期都和该视图互相关联即使触摸动作最终移动到该视图区域之外也是如此。“事件处理技巧”部分对触碰测试在编程方面的一些隐含意义进行讨论。 UIApplication对象和每个UIWindow对象都在sendEvent:方法两个类都声明了这个方法中派发事件。由于这些方法是事件进入应用程序的通道所以您可以从UIApplication或UIWindow派生出子类重载其sendEvent:方法实现对事件的监控或执行特殊的事件处理。但是大多数应用程序都不需要这样做。 响应者对象和响应者链 响应者对象是可以响应事件并对其进行处理的对象。UIResponder是所有响应者对象的基类它不仅为事件处理而且也为常见的响应者行为定义编程接口。UIApplication、UIView、和所有从UIView派生出来的UIKit类包括UIWindow都直接或间接地继承自UIResponder类。 第一响应者是应用程序中当前负责接收触摸事件的响应者对象通常是一个UIView对象。UIWindow对象以消息的形式将事件发送给第一响应者使其有机会首先处理事件。如果第一响应者没有进行处理系统就将事件通过消息传递给响应者链中的下一个响应者看看它是否可以进行处理。 响应者链是一系列链接在一起的响应者对象它允许响应者对象将处理事件的责任传递给其它更高级别的对象。随着应用程序寻找能够处理事件的对象事件就在响应者链中向上传递。响应者链由一系列“下一个响应者”组成其顺序如下 第一响应者将事件传递给它的视图控制器如果有的话然后是它的父视图。 类似地视图层次中的每个后续视图都首先传递给它的视图控制器如果有的话然后是它的父视图。 最上层的容器视图将事件传递给UIWindow对象。 UIWindow对象将事件传递给UIApplication单件对象。 如果应用程序找不到能够处理事件的响应者对象则丢弃该事件。 响应者链中的所有响应者对象都可以实现UIResponder的某个事件处理方法因此也都可以接收事件消息。但是它们可能不愿处理或只是部分处理某些事件。如果是那样的话它们可以将事件消息转送给下一个响应者方法大致如下 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {UITouch* touch [touches anyObject];NSUInteger numTaps [touch tapCount];if (numTaps 2) {[self.nextResponder touchesBegan:touches withEvent:event];} else {[self handleDoubleTap:touch];}}请注意如果一个响应者对象将一个多点触摸序列的初始阶段的事件处理消息转发给下一个响应者在touchesBegan:withEvent:方法中,就应该同样转发该序列的其它事件处理消息。 动作消息的处理也使用响应者链。当用户对诸如按键或分页控件这样的UIControl对象进行操作时控件对象如果正确配置的话会向目标对象发送动作消息。但是如果目标对象被指定为nil应用程序就会像处理事件消息那样把该动作消息路由给第一响应者。如果第一响应者没有进行处理再发送给其下一个响应者以此类推将消息沿着响应者链向上传递。 调整事件的传递 UIKit为应用程序提供了一些简化事件处理、甚至完全关闭事件流的编程接口。下面对这些方法进行总结 关闭事件的传递。缺省情况下视图会接收触摸事件。但是您可以将其userInteractionEnabled属性声明设置为NO关闭事件传递的功能。隐藏或透明的视图也不能接收事件。 在一定的时间内关闭事件的传递。应用程序可以调用UIApplication的beginIgnoringInteractionEvents方法并在随后调用endIgnoringInteractionEvents方法来实现这个目的。前一个方法使应用程序完全停止接收触摸事件消息第二个方法则重启消息的接收。某些时候当您的代码正在执行动画时可能希望关闭事件的传递。 打开多点触摸的传递。 缺省情况下视图只接收多点触摸序列的第一个触摸事件而忽略所有其它事件。如果您希望视图处理多点触摸就必须使它启用这个功能。在代码或InterfaceBuilder的查看器窗口中将视图的multipleTouchEnabled属性设置为YES就可以实现这个目标。 将事件传递限制在某个单独的视图上。 缺省情况下视图的exclusiveTouch属性被设置为NO。将这个属性设置为YES会使相应的视图具有这样的特性即当该视图正在跟踪触摸动作时窗口中的其它视图无法同时进行跟踪它们不能接收到那些触摸事件。然而一个标识为“独占触摸”的视图不能接收与同一窗口中其它视图相关联的触摸事件。如果一个手指接触到一个独占触摸的视图则仅当该视图是窗口中唯一一个跟踪手指的视图时触摸事件才会被传递。如果一个手指接触到一个非独占触摸的视图则仅当窗口中没有其它独占触摸视图跟踪手指时该触摸事件才会被传递。 将事件传递限制在子视图上。一个定制的UIView类可以通过重载hitTest:withEvent:方法来将多点触摸事件的传递限制在它的子视图上。这个技巧的讨论请参见“事件处理技巧”部分。 处理多点触摸事件 为了处理多点触摸事件UIView的定制子类比较不常见的还有UIApplication或UIWindow的定制子类必须至少实现一个UIResponder的事件处理方法。本文的下面部分将对这些方法进行描述讨论处理常见手势的方法并展示一个处理复杂多点触摸事件的响应者对象实例以及就事件处理的某些技术提出建议。 事件处理方法 在一个多点触摸序列发生的过程中应用程序会发出一系列事件消息。为了接收和处理这些消息响应者对象的类必须至少实现下面这些由UIResponder类声明的方法之一 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event在给定的触摸阶段中如果发生新的触摸动作或已有的触摸动作发生变化应用程序就会发送这些消息 当一个或多个手指触碰屏幕时发送touchesBegan:withEvent:消息。 当一个或多个手指在屏幕上移动时发送touchesMoved:withEvent:消息。 当一个或多个手指离开屏幕时发送touchesEnded:withEvent:消息。 当触摸序列被诸如电话呼入这样的系统事件所取消时发送touchesCancelled:withEvent:消息。 上面这些方法都和特定的触摸阶段比如UITouchPhaseBegan相关联该信息存在于UITouch对象的phase属性声明中。 每个与事件处理方法相关联的消息都有两个参数。第一个参数是一个UITouch对象的集合表示给定阶段中新的或者发生变化的触摸动作第二个参数是一个UIEvent对象表示这个特定的事件。您可以通过这个事件对象得到与之相关联的所有触摸对象allTouches或者发生在特定的视图或窗口上的触摸对象子集。其中的某些触摸对象表示自上次事件消息以来没有发生变化或虽然发生变化但处于不同阶段的触摸动作。 为了处理给定阶段的事件响应者对象常常从传入的集合参数中取得一或多个UITouch对象然后考察这些对象的属性或取得它们的位置如果需要处理所有触摸对象可以向该NSSet对象发送anyObject消息。UITouch类中有一个名为locationInView:的重要方法如果传入self参数值它会给出触摸动作在响应者坐标系统中的位置假定该响应者是一个UIView对象且传入的视图参数不为nil。另外还有一个与之平行的方法可以给出触摸动作之前位置previousLocationInView:。UITouch实例的属性还可以给出发生多少次触碰tapCount、触摸对象的创建或最后一次变化发生在什么时间timestamp、以及触摸处于什么阶段phase。 响应者类并不是必须实现上面列出的所有三个事件方法。举例来说如果它只对手指离开屏幕感兴趣则只需要实现touchesEnded:withEvent:方法就可以了。 在一个多点触摸序列中如果响应者在处理事件时创建了某些持久对象则应该实现touchesCancelled:withEvent:方法以便当系统取消该序列的时候对其进行清理。多点触摸序列的取消常常发生在应用程序的事件处理遭到外部事件—比如电话呼入—破坏的时候。请注意响应者对象同样应该在收到多点触摸序列的touchesEnded:withEvent:消息时清理之前创建的对象“事件处理技巧”部分讨论了如何确定一个序列中的最后一个touch-up事件。 处理单个和多个触碰手势 iPhone应用程序中一个很常见的手势是触击即用户用手指触碰一个对象。响应者对象可以以一种方式响应单击而以另外一种方式响应双击甚至可能以第三种方式响应三次触击。您可以通过考察UITouch对象的tapCount属性声明值来确定用户在一个响应者对象上的触击次数 取得这个值的最好地方是touchesBegan:withEvent:和touchesEnded:withEvent:方法。在很多情况下我们更倾向于后者因为它与用户手指离开屏幕的阶段相对应。在触摸结束阶段UITouchPhaseEnded考察触击的次数可以确定手指是真的触击而不是其它动作比如手指接触屏幕后拖动的动作。 程序清单3-1展示了如何检测某个视图上是否发生双击。 程序清单3-1  检测双击手势 - (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event{UITouch *touch [touches anyObject];if ([touch tapCount] 2) {CGPoint tapPoint [theTouch locationInView:self];// Process a double-tap gesture}}当一个响应者对象希望以不同的方式响应单击和双击事件时就会出现复杂的情况。举例来说单击的结果可能是选定一个对象而双击则可能是显示一个编辑视图用于编辑被双击的对象。那么响应者对象如何知道一个单击不是另一个双击的起始部分呢我们接下来解释响应者对象如何借助上文刚刚描述的事件处理方法来处理这种情况 在touchesEnded:withEvent:方法中当触击次数为一时响应者对象就向自身发送一个performSelector:withObject:afterDelay:消息其中的选择器标识由响应者对象实现的、用于处理单击手势的方法第二个参数是一个NSValue或NSDictionary对象用于保存相关的UITouch对象时延参数则表示单击和双击手势之间的合理时间间隔。 请注意使用一个NSValue对象或字典来保存触摸对象是因为它们会保持传入的对象。然而您自己在进行事件处理时不应该对UITouch对象进行保持。 在touchesBegan:withEvent:方法中如果触击次数为二响应者对象会向自身发送一个cancelPreviousPerformRequestsWithTarget:消息取消当前被挂起和延期执行的调用。如果触碰次数不为二则在指定的延时之后先前步骤中由选择器标识的方法就会被调用以处理单击手势。 在touchesEnded:withEvent:方法中如果触碰次数为二响应者会执行处理双击手势的代码。 检测碰擦手势 水平和垂直的碰擦Swipe是简单的手势类型您可以简单地在自己的代码中进行跟踪并通过它们执行某些动作。为了检测碰擦手势您需要跟踪用户手指在期望的坐标轴方向上的运动。碰擦手势如何形成是由您自己来决定的也就是说您需要确定用户手指移动的距离是否足够长移动的轨迹是否足够直还有移动的速度是否足够快。您可以保存初始的触碰位置并将它和后续的touch-moved事件报告的位置进行比较进而做出这些判断。 程序清单3-2展示了一些基本的跟踪方法可以用于检测某个视图上发生的水平碰擦。在这个例子中视图将触摸的初始位置存储在名为startTouchPosition的成员变量中。随着用户手指的移动清单中的代码将当前的触摸位置和起始位置进行比较确定是否为碰擦手势。如果触摸在垂直方向上移动得太远就会被认为不是碰擦手势并以不同的方式进行处理。但是如果手指继续在水平方向上移动代码就继续将它作为碰擦手势来处理。一旦碰擦手势在水平方向移动得足够远以至于可以认为是完整的手势时处理例程就会触发相应的动作。检测垂直方向上的碰擦手势可以用类似的代码只是把x和y方向的计算互换一下就可以了。 程序清单3-2  在视图中跟踪碰擦手势 #define HORIZ_SWIPE_DRAG_MIN 12#define VERT_SWIPE_DRAG_MAX 4- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{UITouch *touch [touches anyObject];startTouchPosition [touch locationInView:self];}- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{UITouch *touch [touches anyObject];CGPoint currentTouchPosition [touch locationInView:self];// If the swipe tracks correctly.if (fabsf(startTouchPosition.x - currentTouchPosition.x) HORIZ_SWIPE_DRAG_MIN fabsf(startTouchPosition.y - currentTouchPosition.y) VERT_SWIPE_DRAG_MAX){// It appears to be a swipe.if (startTouchPosition.x currentTouchPosition.x)[self myProcessRightSwipe:touches withEvent:event];else[self myProcessLeftSwipe:touches withEvent:event];}else{// Process a non-swipe event.}}处理复杂的多点触摸序列 触击和碰擦是简单的手势。如何处理更为复杂的多点触摸序列—实际上是解析应用程序特有的手势—取决于应用程序希望完成的具体目标。您可以跟踪所有阶段的所有触摸动作记录触摸对象中发生变化的属性变量并正确地改变内部的状态。 说明如何处理复杂的多点触摸序列的最好方法是通过实例。程序清单3-3展示一个定制的UIView对象如何通过在屏幕上动画移动“Welcome”标语牌来响应用户手指的移动以及如何通过改变欢迎标语的语言来响应用户的双击手势例子中的代码来自一个名为MoveMe的示例工程进一步考察该工程可以更好地理解事件处理的上下文。 程序清单3-3  处理复杂的多点触摸序列 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{UITouch *touch [[event allTouches] anyObject];// Only move the placard view if the touch was in the placard viewif ([touch view] ! placardView) {// On double tap outside placard view, update placards display stringif ([touch tapCount] 2) {[placardView setupNextDisplayString];}return;}// Pulse the placard view by scaling up then down// Use UIViews built-in animation[UIView beginAnimations:nil context:NULL];[UIView setAnimationDuration:0.5];CGAffineTransform transform CGAffineTransformMakeScale(1.2, 1.2);placardView.transform transform;[UIView commitAnimations];[UIView beginAnimations:nil context:NULL];[UIView setAnimationDuration:0.5];transform CGAffineTransformMakeScale(1.1, 1.1);placardView.transform transform;[UIView commitAnimations];// Move the placardView to under the touch[UIView beginAnimations:nil context:NULL];[UIView setAnimationDuration:0.25];placardView.center [self convertPoint:[touch locationInView:self] fromView:placardView];[UIView commitAnimations];}- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{UITouch *touch [[event allTouches] anyObject];// If the touch was in the placardView, move the placardView to its locationif ([touch view] placardView) {CGPoint location [touch locationInView:self];location [self convertPoint:location fromView:placardView];placardView.center location;return;}}- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{UITouch *touch [[event allTouches] anyObject];// If the touch was in the placardView, bounce it back to the centerif ([touch view] placardView) {// Disable user interaction so subsequent touches dont interfere with animationself.userInteractionEnabled NO;[self animatePlacardViewToCenter];return;}}请注意对于通过描画自身的外观来响应事件的定制视图在事件处理方法中通常应该只是设置描画状态而在drawRect:方法中执行所有的描画操作。如果需要了解更多关于描画视图内容的方法请参见“图形和描画”部分。   事件处理技巧 下面是一些事件处理技巧您可以在自己的代码中使用。 跟踪UITouch对象的变化 在事件处理代码中您可以将触摸状态的相关位置保存下来以便在必要时和变化之后的UITouch实例进行比较。作为例子假定您希望将每个触摸对象的最后位置和其初始位置进行比较则在touchesBegan:withEvent:方法中您可以通过locationInView:方法得到每个触摸对象的初始位置并以UITouch对象的地址作为键将它们存储在CFDictionaryRef封装类型中然后在touchesEnded:withEvent:方法中可以通过传入UITouch对象的地址取得该对象的初始位置并将它和当前位置进行比较您应该使用CFDictionaryRef类型而不是NSDictionary对象因为后者需要对其存储的项目进行拷贝而UITouch类并不采纳NSCopying协议该协议在对象拷贝过程中是必须的。 对子视图或层上的触摸动作进行触碰测试 定制视图可以用UIView的hitTest:withEvent:方法或CALayer的hitTest:方法来寻找接收触摸事件的子视图或层进而正确地处理事件。下面的例子用于检测定制视图的层中的“Info”图像是否被触碰。 - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {CGPoint location [[touches anyObject] locationInView:self];CALayer *hitLayer [[self layer] hitTest:[self convertPoint:location fromView:nil]];if (hitLayer infoImage) {[self displayInfo];}}如果您有一个携带子视图的定制视图就需要明确自己是希望在子视图的级别上处理触摸事件还是在父视图的级别上进行处理。如果子视图没有实现touchesBegan:withEvent:、touchesEnded:withEvent:、或者touchesMoved:withEvent:方法则这些消息就会沿着响应者链被传播到父视图。然而由于多次触碰和多点触摸事件与发生这些动作所在的子视图是互相关联的所以父视图不会接收到这些事件。为了保证能接收到所有的触摸事件父视图必须重载hitTest:withEvent:方法并在其中返回其本身而不是它的子视图。 确定多点触摸序列中最后一个手指何时离开 当您希望知道一个多点触摸序列中的最后一个手指何时从视图离开时可以将传入的集合参数中包含的UITouch对象数量和UIEvent参数对象中与该视图关联的触摸对象数量相比较。请看下面的例子 - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {if ([touches count] [[event touchesForView:self] count]) {// last finger has lifted....}}看完文档我们也许还不能完全掌握ios触摸事件下面我们结合一个实例来继续学习。 新建一个项目SwitchByGesture添加一个UIViewController命名为SecondViewController。 在ViewController.m中添加下面代码   我们实现了touchBegan方法在该方法中我们记住触摸事件其实坐标在touchEnded方法中我们获取手势结束时的坐标接着判断是否符合我们的条件即水平向左滑动且上下滑动不超过10如果符合切换视图。 接着同样我们要在SecondViewController.m中实现上述两个方法只不过判断条件不同如下 即水平向右滑动切换原来的视图。编译运行如果不出意外的话会出现下面的效果   向左滑动   向右滑动   好了就写这么多有什么问题请留言大家一起学习交流 转载于:https://www.cnblogs.com/jackljf/archive/2012/09/11/3589303.html
http://www.zqtcl.cn/news/935408/

相关文章:

  • 电子商务网站免费模板展示型网站与营销型网站
  • 除了红动中国还有哪些设计网站宁波建网站哪家
  • 网站的建设费用预算策划书wdcp网站备份
  • 济南制作公司网站网站设计的实例
  • 网站建设需要的文案一个网站的后台怎么做
  • 电影网站建设模板营销方式都有哪些
  • 书店商城网站建设方案未央免费做网站
  • 北京房产网北京二手房企业网站seo方案案例
  • 大连品牌官网建站二级建造师最好的网站
  • python开发工具搜索引擎优化的英语简称
  • 做产品代理上哪个网站好东莞公司网上推广
  • 专业制作网站公司上海广告公司联系方式
  • 古交市网站建设公司四川省建设厅电子政务网站
  • 清河网站建设费用50万做网站
  • 怎么找网站的根目录平台类网站营销方案
  • 网站关键词 价格生成山西建设工程备案网站
  • 网站开发入哪个会计科目设计师自己的网站
  • php做网站界面代码定制网页设计报价
  • 重庆智能模板建站wordpress+widget+开发
  • vps网站空间时尚网站首页设计
  • 美容行业网站建设方案网站建设需求背景
  • 贵阳做网站找哪家好长沙部分风险区域调整
  • 设计网站 常用微信网站建设口碑好
  • 网站建设加盟列举网络推广的方式
  • 大连博硕网站建设dw做网站背景音乐
  • 江苏省建设执业网站北京做胃镜哪好德胜门网站I
  • 南京网站开发南京乐识好郑州宣传片制作多少钱
  • 昆明网站制作方案定制wordpress图片广告
  • 宜宾seo网站建设辽宁专业网站建设大全
  • 同一产品做多个网站网页打不开的解决方法