当前位置: 首页 > 编程日记 > 正文

如何轻松实现iOS9多任务管理器效果(iCarousel高级教程)

前言


iOS9系统下 为了我司APP的兼容性问题 特意把手上的iOS Mac XCode都升级到了最新的beta版 然后发现iOS9的多任务管理器风格大变 变成了下面这种样子

我忽然想起来之前的文章提到我最爱的UI控件iCarousel要实现类似这种效果其实是很简单的 一时兴起就花时间试验了一下 效果还不错 所以接下来我就介绍一下iCarousel的高级用法: 如何使用iCarousel的自定义方式来实现iOS9的多任务管理器效果

模型


首先来看一下iOS9的多任务管理器究竟是什么样子

然后我们简单的来建个模 这个步骤很重要 将会影响我们之后的计算 首先我们把东西摆正

然后按比例用线分割一下

这里可以看到 如果我们以正中间的卡片(设定序号为0)为参照物的话 最右边卡片(序号为1)的位移就是中心卡片宽度的4/5 最左边的卡片(序号为-2)的位移就是中心卡片的宽度的2/5 注意:这两个值的确定对我们非常重要

大小*的缩放 就按照线性放大**就行了 由于计算很简单 这里就不多赘述了

细心的人可能会注意到 其实iOS9中的中心卡片 并不是居中的 而是靠右的 那么我们再把整体布局调整一下

这样就差不多是iOS9的样子了

原理


接着我们来了解一下iCarousel的基本原理

iCarousel支持如下几种内置显示类型(没用过的同学请务必使用pod try iCarousel来运行一下demo)

  • iCarouselTypeLinear
  • iCarouselTypeRotary
  • iCarouselTypeInvertedRotary
  • iCarouselTypeCylinder
  • iCarouselTypeInvertedCylinder
  • iCarouselTypeWheel
  • iCarouselTypeInvertedWheel
  • iCarouselTypeCoverFlow
  • iCarouselTypeCoverFlow2
  • iCarouselTypeTimeMachine
  • iCarouselTypeInvertedTimeMachine

具体效果图可以在官方Github主页上看到 不过这几种类型虽然好 但是也无法满足我们现在的需求 没关系 iCarousel还支持自定义类型

  • iCarouselTypeCustom

这就是我们今天的主角

还是代码说话 我们先配置一个简单的iCarousel示例 并使用iCarouselTypeCustom作为其类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
@interface ViewController ()
<
iCarouselDelegate,
iCarouselDataSource
>

@property (nonatomic, strong) iCarousel *carousel;
@property (nonatomic, assign) CGSize cardSize;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

CGFloat cardWidth = [UIScreen mainScreen].bounds.size.width*5.0f/7.0f;
self.cardSize = CGSizeMake(cardWidth, cardWidth*16.0f/9.0f);
self.view.backgroundColor = [UIColor blackColor];

self.carousel = [[iCarousel alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.view addSubview:self.carousel];
self.carousel.delegate = self;
self.carousel.dataSource = self;
self.carousel.type = iCarouselTypeCustom;
self.carousel.bounceDistance = 0.2f;

}

- (NSInteger)numberOfItemsInCarousel:(iCarousel *)carousel
{
return 15;
}

- (CGFloat)carouselItemWidth:(iCarousel *)carousel
{
return self.cardSize.width;
}

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSInteger)index reusingView:(UIView *)view
{
UIView *cardView = view;

if ( !cardView )
{
cardView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.cardSize.width, self.cardSize.height)];

UIImageView *imageView = [[UIImageView alloc] initWithFrame:cardView.bounds];
[cardView addSubview:imageView];
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.backgroundColor = [UIColor whiteColor];

cardView.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:imageView.frame cornerRadius:5.0f].CGPath;
cardView.layer.shadowRadius = 3.0f;
cardView.layer.shadowColor = [UIColor blackColor].CGColor;
cardView.layer.shadowOpacity = 0.5f;
cardView.layer.shadowOffset = CGSizeMake(0, 0);

CAShapeLayer *layer = [CAShapeLayer layer];
layer.frame = imageView.bounds;
layer.path = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds cornerRadius:5.0f].CGPath;
imageView.layer.mask = layer;
}

return cardView;
}

当你运行这段代码的时候哦 你会发现显示出来是下面这个样子的 并且划也划不动(掀桌:这是什么鬼~(/‵Д′)/~ ╧╧)

这是因为我们有个最重要的delegate方法没有实现

1
- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset

这个函数也是整个iCarouselTypeCustom的灵魂所在

接下来我们要简单的说一下iCarousel的原理

  • iCarousel并不是一个UIScrollView 也并没有包含任何UIScrollView作为subView
  • iCarousel通过UIPanGestureRecognizer来计算和维护scrollOffset这个变量
  • iCarousel通过scrollOffset来驱动整个动画过程
  • iCarousel本身并不会改变itemView的位置 而是靠修改itemView的layer.transform来实现位移和形变

可能文字说得不太清楚 我们还是通过代码来看一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSInteger)index reusingView:(UIView *)view
{
UIView *cardView = view;

if ( !cardView )
{
cardView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.cardSize.width, self.cardSize.height)];

...
...

//添加一个lbl
UILabel *lbl = [[UILabel alloc] initWithFrame:cardView.bounds];
lbl.text = [@(index) stringValue];
[cardView addSubview:lbl];
lbl.font = [UIFont boldSystemFontOfSize:200];
lbl.textAlignment = NSTextAlignmentCenter;
}

return cardView;
}

- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform
{
NSLog(@"%f",offset);

return transform;
}

然后滑动的时候打出的日志是类似这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2015-07-28 16:53:22.330 DemoTaskTray[1834:485052] -2.999739
2015-07-28 16:53:22.331 DemoTaskTray[1834:485052] 2.000261
2015-07-28 16:53:22.331 DemoTaskTray[1834:485052] -1.999739
2015-07-28 16:53:22.331 DemoTaskTray[1834:485052] 3.000261
2015-07-28 16:53:22.331 DemoTaskTray[1834:485052] -0.999739
2015-07-28 16:53:22.332 DemoTaskTray[1834:485052] 0.000261
2015-07-28 16:53:22.332 DemoTaskTray[1834:485052] 1.000261

2015-07-28 16:53:22.346 DemoTaskTray[1834:485052] -3.000000
2015-07-28 16:53:22.347 DemoTaskTray[1834:485052] 2.000000
2015-07-28 16:53:22.347 DemoTaskTray[1834:485052] -2.000000
2015-07-28 16:53:22.348 DemoTaskTray[1834:485052] 3.000000
2015-07-28 16:53:22.348 DemoTaskTray[1834:485052] -1.000000
2015-07-28 16:53:22.348 DemoTaskTray[1834:485052] 0.000000
2015-07-28 16:53:22.348 DemoTaskTray[1834:485052] 1.000000

2015-07-28 16:53:22.363 DemoTaskTray[1834:485052] -3.000000
2015-07-28 16:53:22.363 DemoTaskTray[1834:485052] 2.000000
2015-07-28 16:53:22.363 DemoTaskTray[1834:485052] -2.000000
2015-07-28 16:53:22.363 DemoTaskTray[1834:485052] 3.000000
2015-07-28 16:53:22.364 DemoTaskTray[1834:485052] -1.000000
2015-07-28 16:53:22.364 DemoTaskTray[1834:485052] 0.0000002015-07-28 16:53:22.364 DemoTaskTray[1834:485052] 1.000000

可以看到 所有的itemView都是居中并且重叠在一起的 我们滑动的时候并不会改变itemView的位置 但是这个offset是会改变的 而且可以看到 所有的offset的相邻差值都为1.0

这就是iCarousel的一个重要的设计理念 iCarousel虽然跟UIScrollView一样都各自会维护自己的scrollOffset 但是UIScrollView在滑动的时候改变的是自己的ViewPort 就是说 UIScrollView上的itemView是真正被放置到了他被设置的位置上 只是UIScrollView通过移动显示的窗口 造成了滑动的感觉(如果不理解 请看这篇文章)

但是iCarousel并不是这样 iCarousel会把所有的itemView都居中重叠放置在一起 当scrollOffset变化时 iCarousel会计算每个itemView的offset 并通过- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform这个函数来对每个itemView进行形变 通过形变来造成滑动的效果

这个非常大胆和另类的想法着实很奇妙! 可能我解释得不够好(尽力了~~) 还是通过代码来解释比较好

我们修改一下函数的实现

1
2
3
4
5
6
- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform
{
NSLog(@"%f",offset);

return CATransform3DTranslate(transform, offset * self.cardSize.width, 0, 0);
}

效果如下

我们可以看到 已经可以滑动了 而且这个效果 就是类似iCarouselTypeLinear的效果
没错 其实iCarousel所有的内置类型也都是通过这种方式来实现的 只是分别根据offset进行了不同的形变 就造成了各种不同的效果
要说明的是 函数仅提供offset作为参数 并没有提供index来指明对应的是哪一个itemView 这样的好处是可以让人只关注于具体的形变计算 而无需计算与currentItemView之间的距离之类的

注意的是offset是元单位(就是说 offset是不包含宽度的 仅仅是用来说明itemView的偏移系数) 下图简单说明了一下

当没有滑动的时候 offset是这样的

当滑动的时候 offset是这样的

怎么样 知道了原理之后 是不是有种跃跃欲试的感觉? 接下来我们就回到主题上 看看如何一步步实现我们想要的效果

计算


通过刚才原理的介绍 可以知道 接下来的重点就是关于offset的计算

我们首先来确定一下函数的曲线图 通过观察iOS9的实例效果我们可以知道 itemView从左向右滑的时候是越来越快的
所以这个曲线大概是这个样子的

考验你高中数学知识的时候到了 怎么找到这种函数?
有种叫直角双曲线的函数 大概公式是这个样子

其曲线图是这样的

可以看到 位于第二象限的曲线就是我们要的样子 但是我们还要调整一下才能得到最终的结果

由于offset为0的时候 本身是不形变的 所以可以知道曲线是过原点(0,0)的 那么我们可以得到函数的一般式

而在文章开头我们得到了这样两组数据

  • 最右边卡片(序号为1)的位移就是中心卡片宽度的4/5
  • 最左边的卡片(序号为-2)的位移就是中心卡片的宽度的2/5

那么代入上面的一般式中 我们可以得到两个公式

计算可以得到

a=5/4
b=5/8

然后我们就可以得到我们最终想要的公式

看看曲线图

然后我们修改一下程序代码(这段代码其实就是本文的关键所在)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform
{
CGFloat scale = [self scaleByOffset:offset];
CGFloat translation = [self translationByOffset:offset];

return CATransform3DScale(CATransform3DTranslate(transform, translation * self.cardSize.width, 0, 0), scale, scale, 1.0f);
}

- (void)carouselDidScroll:(iCarousel *)carousel
{
for ( UIView *view in carousel.visibleItemViews)
{
CGFloat offset = [carousel offsetForItemAtIndex:[carousel indexOfItemView:view]];

if ( offset < -3.0 )
{
view.alpha = 0.0f;
}
else if ( offset < -2.0f)
{
view.alpha = offset + 3.0f;
}
else
{
view.alpha = 1.0f;
}
}
}

//形变是线性的就ok了
- (CGFloat)scaleByOffset:(CGFloat)offset
{
return offset*0.04f + 1.0f;
}

//位移通过得到的公式来计算
- (CGFloat)translationByOffset:(CGFloat)offset
{
CGFloat z = 5.0f/4.0f;
CGFloat n = 5.0f/8.0f;

//z/n是临界值 >=这个值时 我们就把itemView放到比较远的地方不让他显示在屏幕上就可以了
if ( offset >= z/n )
{
return 2.0f;
}

return 1/(z-n*offset)-1/z;
}

再看看效果

看上去已经是我们想要的效果了

不过 滑动一下就会发现问题

原来虽然itemView的大小和位移都按照我们的预期变化了 但是层级出现了问题 那么iCarousel是如何调整itemView的层级的呢? 查看源码我们可以知道

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
NSComparisonResult compareViewDepth(UIView *view1, UIView *view2, iCarousel *self)
{
//compare depths
CATransform3D t1 = view1.superview.layer.transform;
CATransform3D t2 = view2.superview.layer.transform;
CGFloat z1 = t1.m13 + t1.m23 + t1.m33 + t1.m43;
CGFloat z2 = t2.m13 + t2.m23 + t2.m33 + t2.m43;
CGFloat difference = z1 - z2;

//if depths are equal, compare distance from current view
if (difference == 0.0)
{
CATransform3D t3 = [self currentItemView].superview.layer.transform;
if (self.vertical)
{
CGFloat y1 = t1.m12 + t1.m22 + t1.m32 + t1.m42;
CGFloat y2 = t2.m12 + t2.m22 + t2.m32 + t2.m42;
CGFloat y3 = t3.m12 + t3.m22 + t3.m32 + t3.m42;
difference = fabs(y2 - y3) - fabs(y1 - y3);
}
else
{
CGFloat x1 = t1.m11 + t1.m21 + t1.m31 + t1.m41;
CGFloat x2 = t2.m11 + t2.m21 + t2.m31 + t2.m41;
CGFloat x3 = t3.m11 + t3.m21 + t3.m31 + t3.m41;
difference = fabs(x2 - x3) - fabs(x1 - x3);
}
}
return (difference < 0.0)? NSOrderedAscending: NSOrderedDescending;
}

- (void)depthSortViews
{
for (UIView *view in [[_itemViews allValues] sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))compareViewDepth context:(__bridge void *)self])
{
[_contentView bringSubviewToFront:view.superview];
}
}

主要就是这个compareViewDepth的比较函数起作用 而这个函数中比较的就是CATransform3D的各个属性值

我们来看一下CATransform3D的各个属性各代表什么

1
2
3
4
5
6
7
8
9
10
struct CATransform3D
{
CGFloat m11(x缩放), m12(y切变), m13(旋转), m14();

CGFloat m21(x切变), m22(y缩放), m23(), m24();

CGFloat m31(旋转), m32( ), m33(), m34(透视);

CGFloat m41(x平移), m42(y平移), m43(z平移), m44();
};

而所有CATransform3D开头的函数(比如CATransform3DScale CATransform3DTranslate) 改变的也就是这些值而已

回到整体 我们发现这个函数先比较的是t1.m13 + t1.m23 + t1.m33 + t1.m43; 而m13代表的是旋转 m23和m33暂时并没有含义 而m43代表的是z平移 那么我们只要改变m43就可以了 而改变m43最简单的办法就是

1
CATransform3D CATransform3DTranslate (CATransform3D t, CGFloat tx,CGFloat ty, CGFloat tz)

最后一个参数就是用来改变m43的

那么我们把之前iCarousel的delegate方法稍微改动一下 将当前的offset设置给最后一个参数即可(因为offset就是按顺序传进来的)

1

return CATransform3DScale(CATransform3DTranslate(transform, translation * self.cardSize.width, 0, offset), scale, scale, 1.0f);

再看看效果

Bang!
我们已经得到了一个简单的copycat

小结


文中的demo可以在这里找到

可以看到 使用iCarousel 我们仅用不到100行就实现了一个非常不错的效果(关键代码不到50行) 而无需做很多额外的工作(当然大家就不要揪细节了 比如以渐隐代替模糊 最后一张卡片居中等问题 毕竟这不是个轮子 只是教大家一种方法)

如果大家真正读懂了这篇文章(可能我写得不是很清楚 建议看demo 同时读iCarousel的源码来理解) 那么只要遇到类似卡片滑动的组件 都可以轻松应对了

说到这里 我个人是非常不喜欢重复造轮子的 能用最少的代码达到所需的要求是我一直以来的准则 而且很多经典的轮子库(比如iCarousel)也值得你去深入探索和学习 了解作者的想法和思路(站在巨人的肩膀)是一种非常不错的学习方法和开阔视野的途径

另外 文中所用到的数学公式曲线图生成网站是Desmos Graphing Calculator(从@KITTEN-YANG那瞄到的) 数学公式生成网站是Sciweaver(直接把前者的公式复制到后者的输入框里就可以了 因为前者复制出来就是latex格式的公式了) 有需要的同学可以研究一下如何使用 (打算研究一下Matlab的用法 可能更方便)

转载于:https://www.cnblogs.com/jgCho/p/5275408.html

相关文章:

linux并发控制之自旋锁

自旋锁是一种对临界资源进行互斥访问的典型手段&#xff0c;其名来源于它的工作方式。通俗的讲&#xff0c;自旋锁就是一个变量&#xff0c;该变量把一个临界区标记为“我当前在运行&#xff0c;请等待”或者标记为“我当前不在运行&#xff0c;可以被使用”&#xff0c; 如果A…

半透明遮罩层覆盖整个可视区域

我们经常会遇到点击一个按钮弹出一个对话框和一个变暗的遮罩层&#xff0c;简单的写法只能让遮罩层覆盖浏览器的大小&#xff0c;那么怎么让遮罩层覆盖全部区域呢&#xff1f; css代码如下&#xff1a; 1 html,body {2 height: 100%;3 margin: 0;4 padding: 0;5 }6…

观察内核linux行为,Linux 学习:基于proc观察Linux行为

内容简介本篇博文的主要内容是通过/proc文件&#xff0c;对Linux系统管理有一个初步的认识。在Linux中&#xff0c;proc文件系统提供了一套在用户态检查内核状态和系统特征的机制。proc文件系统将进程的地址空间、系统的硬件信息、系统相关机制(中断、I/O)等内容全部设置为虚拟…

对数据库表中的某一字段去重分组排序

1、问题背景 某数据库t_tab_ab中有两个字段a和b&#xff0c;例如以下所看到的&#xff1a; 查询前&#xff1a; 查询后&#xff1a; a b a b 1 2 1 2 1 3 2 3 1 4 …

设置应用图标badge(徽章)

// 图标右上角的数字[UIApplication sharedApplication].applicationIconBadgeNumber msgCount result.status result.follower; 转载于:https://www.cnblogs.com/pretty-guy/articles/4106529.html

hdu - 1087 - Super Jumping! Jumping! Jumping!

题意&#xff1a;求最大升序和。 题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1087 ——>>设d[i]表示以第i个数为终点的最大升序和&#xff0c;然后从第1个数到第i-1个数为终点的最大升序和进行检查&#xff0c;向后递推即可。 #include <iostrea…

linux 读取大量图片 内存,10 张图帮你搞定 TensorFlow 数据读取机制

导读在学习tensorflow的过程中&#xff0c;有很多小伙伴反映读取数据这一块很难理解。确实这一块官方的教程比较简略&#xff0c;网上也找不到什么合适的学习材料。今天这篇文章就以图片的形式&#xff0c;用最简单的语言&#xff0c;为大家详细解释一下tensorflow的数据读取机…

安卓真机测试安装时报错

在将程序发布到手机上时提示该错误&#xff1a; INSTALL_FAILED_INSUFFICIENT_STORAGE 手机内存满了...删除程序... 就可以安装了转载于:https://www.cnblogs.com/H-K-Home/p/5279819.html

C#学习笔记——捕获当前屏幕

编程思路&#xff08;API 编程&#xff09;&#xff1a; 先调用 GetForegroundWindow 获取当前活动程序窗口句柄&#xff0c;然后调用 GetWindowDC 获取窗口的设备句柄&#xff08;或 GetDC 函数&#xff09;&#xff0c;调用 BitBlt 位图传输函数将位图拷贝到兼容的设备场景中…

Exception loading sessions from persistent storage

严重: Exception loading sessions from persistent storage java.io.EOFException 删除Tomcat里面的work/Catalina/localhost下的内容即可解决 Tomcat在启动时出现如下异常问题&#xff1a; 严重: IOException while loading persisted sessions: java.io.EOFException严重: E…

linux独立应用程序开发,Linux应用程序开发(一)

Linux应用程序开发(一)---移植thttpdSqlite3PHP5到arm linux(4)移植环境(红色粗字体字为修改后内容&#xff0c;蓝色粗体字为特别注意内容)1&#xff0c;主机环境&#xff1a;VMare下CentOS 5.5 &#xff0c;1G内存。2&#xff0c;集成开发环境&#xff1a;Elipse IDE3&#xf…

面向过程(结构化)分析方法与面向对象分析方法的区别

面向过程是从问题的总体目标开始&#xff0c;抽象底层的细节&#xff0c;先专心构造高层的结构&#xff0c;然后再一层一层地分解合细化。 面向对象则是运用对象、类、继承、封装、聚合、消息传递、多态性等概念来构造系统的方法。 面向过程着重于解决问题的从粗略到详尽的方法…

eclipse.ini内存设置

-vmargs -Xms128M -Xmx512M -XX:PermSize64M -XX:MaxPermSize128M 这里有几个问题&#xff1a;1. 各个参数的含义什么&#xff1f;2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动&#xff0c;而有些机器无法启动&#xff1f;3. 为何将上面的参数写…

如何运用下载来的模板

&#xff08;1&#xff09;在相应的网址下载模块文件 例如&#xff1a;https://github.com/yagitoshiro/ImageAsResized &#xff08;2&#xff09;把下载的模块包解压放到C:\Users\Administrator\AppData\Roaming\Titanium\modules\android 目录结构如下所示&#xff1a; 而这…

红旗linux桌面版反应慢,红旗Linux6.0桌面版使用感受

1.红旗Linux6.0桌面版中文支持比较好&#xff0c;毕竟是国人出的发行版&#xff1b;输入法很不错&#xff1b;自动挂载win分区(好像Ubuntu、OpenSUSE、Fedora等这些流行发行版的新版都支持了)&#xff0c;自动安装网络&#xff0c;用路由的话可以直接上网了。2.处处向windows靠…

device.cpp

Java代码 #include "device.h" #include <math.h> //Class Timer member function implementation int Timer::createTimer() { _start 0; _clocks 0; #ifdef _WIN32 QueryPerformanceFrequency((LARGE_INTEGER* )&_freq); #else _freq (long long)1.0E…

简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他...

函数式编程 Lambda exec&#xff0c;eval和assert语句&#xff0c;repr函数 lambda语句 用来创建简短的单行匿名函数 print_assign lambda name, value: name str(value)等同于def print_assign(name, value): return name str(value) lambda需要一个参数&#xf…

防止重复提交订单-(转)

防止重复提交 Button1.Attributes.Add("onclick", "this.value正在提交中&#xff0c;请等待……;this.disabledtrue;" this.GetPostBackEventReference(Button1)); 于是根据这个写了个只能提交一次的控件&#xff1a; publicclassButtonSubmitOn…

linux pps 包 网卡,linux下安装PPS

到官方下载FEDORA版RPM包。[talenliangshan Downloads]$ sudo yum localinstall PPStream.rpm已加载插件&#xff1a;axelget, fastestmirror, presto, priorities, refresh-packagekit, remove-with-leaves设置本地安装进程诊断 PPStream.rpm: PPStream-1.0.2-11.i386PPStream…

C#设置本地网络(DNS、网关、子网掩码、IP)

如今网络在我们的生活工作中所起的作用越来越大&#xff0c;可以说离开了网络我们就无法正常的工作和生活。作为程序员我们写的程序大多数也会跟网络相关&#xff0c;而想要使用网络首先要将机器的网络配置设置好。而手动设置的方法显然很不可取&#xff0c;所以我们要让程序帮…

Dynamics CRM2016 Web API之创建记录

前篇介绍了通过primary key来查询记录&#xff0c;那query的知识点里面还有很多需要学习的&#xff0c;这个有待后面挖掘&#xff0c;本篇来简单介绍下用web api的创建记录。 直接上代码&#xff0c;这里的entity的属性我列了几个比较典型的&#xff0c;和原来相比有区别的是选…

bootstrap轮播如何支持移动端滑动手势

1.下载滑动手势 js 插件&#xff1a;hammer.js //cdn.bootcss.com/hammer.js/2.0.8/hammer.min.js 2.写一个javascript命令调用hammer.js中的swipe功能 <script>$(function(){//添加移动端滑动var myElement document.getElementById(myCarousel)//id为轮播的idvar hmnew…

linux程序计数器,如何在C中打印程序计数器的确切值

小编典典您应该能够使用ARM编译器工具链中的__current_pc()内在函数来确定PC(ARM编译器支持许多与GCC相同的扩展)。*这是ARM特有的&#xff1a;int main () {printf("%#x\n", __current_pc());printf("%#x\n", __current_pc());printf("%#x\n", …

『转载』Debussy快速上手(Verdi相似)

『转载』Debussy快速上手&#xff08;Verdi相似&#xff09; Debussy 是NOVAS Software, Inc(思源科技)发展的HDL Debug & Analysis tool&#xff0c;这套软体主要不是用来跑模拟或看波形&#xff0c;它最强大的功能是&#xff1a;能够在HDL source code、schematic diagra…

大家好,新年快乐。

刚申请了个博客&#xff0c;祝大家新年快乐。 &#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d; So many children are playing zhu zhu pets at home.This t…

maven项目找不到pom.xml配置的dependency jar中的类问题解决方法

成功创建一个web项目后&#xff0c;假如我们在web.xml文件中&#xff0c;配置了spring的listener&#xff0c;在pom.xml中也已经作了依赖配置。部署 完项目后&#xff0c;启动项目&#xff0c;发现找不到spring配置的listner 类&#xff1a;org.springframework.web.context.Co…

红旗linux yum,更换红旗Linux: Asianux的yum源为网易源

测试环境&#xff1a;Linux系统版本Asianux4_x64&#xff1a;Linux localhost.localdomain 2.6.32-279.2.1.el6.x86_64 #1 SMP Tue Aug 14 11:42:24 CST 2012 x86_64 x86_64 x86_64 GNU/Linux本质上Asianux4_x64就是基于Redhat6企业版的。出现问题&#xff1a;安装完系统之后&a…

Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...

此人博客挺好的&#xff0c;推荐一个&#xff01; 一个基于Java Socket协议之上文件传输的完整示例&#xff0c;基于TCP通信完成。 除了基于TCP的二进制文件传输&#xff0c;还演示了JAVA Swing的一些编程技巧&#xff0c;Demo程序 实现主要功能有以下几点&#xff1a; 1. …

SuSE下VNCVIEWER没有出现界面,只有shell窗口的问题

首先正确配置&#xff0c;打开vncserver &#xff1a;1&#xff0c;实际上有三个服务&#xff0c;vnc1&#xff0c;vnc2&#xff0c;vnc3&#xff0c;对应着三个服务&#xff0c;先打开。 可以直接在shell下输入 #vncserver :1.也可以使用界面打开Network Service (xinetd),将服…

docker容器互联

link方式 http://blog.csdn.net/halcyonbaby/article/details/42112325 通过link方式创建容器&#xff0c;然后我们可以使用被link容器的别名进行访问。从而解除应用对IP的依赖。不幸的是,link方式只能解决单机容器间的互联。多机情况下&#xff0c;容器的互联需要其他的方式。…