效果图如上,实现的是一个二维码扫描界面。

下面我贴出线条上下移动的代码,至于二维码的代码是用的第三方库。

首先是整体的结构:

注意下面的库文件一个都不能少,否则会报错。

TLTiltHighlightView是划线的类。

#import <QuartzCore/QuartzCore.h>
#import <CoreMotion/CoreMotion.h> #import "TLTiltHighlightView.h" // Private properties.
@interface TLTiltHighlightView () // Our gradient layer.
@property (nonatomic, strong) CAGradientLayer *gradientLayer;
// Our motion manager.
@property (nonatomic, strong) CMMotionManager *motionManager; @end @implementation TLTiltHighlightView #pragma mark - Public Initializers // Allows support for using instances loaded from nibs or storyboards.
-(id)initWithCoder:(NSCoder *)aCoder
{
if (!(self = [super initWithCoder:aCoder])) return nil; [self setup]; return self;
} // Allows support for using instances instantiated programatically.
- (id)initWithFrame:(CGRect)frame
{
if (!(self = [super initWithFrame:frame])) return nil; [self setup]; return self;
} // We need to stop our motionManager from continuing to update once our instance is deallocated.
-(void)dealloc
{
[self.motionManager stopAccelerometerUpdates];
} #pragma mark - Private methods // Sets up the initial state of the view.
-(void)setup
{
// Set up the gradient
[self setupGradient];
// Set up our motion updates
[self setupMotionDetection];
} // Creates the gradient and sets up some default properties
-(void)setupGradient
{
NSAssert(self.gradientLayer == nil, @"Gradient layer being set up more than once."); self.backgroundColor = [UIColor colorWithWhite:1.0f alpha:0.18f];
self.highlightColor = [UIColor colorWithWhite:1.0f alpha:0.36f]; // Create a new, clear gradient layer and add it to our layer hierarchy.
self.gradientLayer = [CAGradientLayer layer];
[self.layer addSublayer:self.gradientLayer];
self.gradientLayer.backgroundColor = [[UIColor clearColor] CGColor];
// Make the layer gradient horizontal
self.gradientLayer.startPoint = CGPointMake(, 0.5);
self.gradientLayer.endPoint = CGPointMake(, 0.5); // Set up the colours and position
[self updateGradientColours];
[self updateGradientLayerPosition];
} // Starts the
-(void)setupMotionDetection
{
NSAssert(self.motionManager == nil, @"Motion manager being set up more than once."); // Set up a motion manager and start motion updates, calling deviceMotionDidUpdate: when updated.
self.motionManager = [[CMMotionManager alloc] init]; __weak __typeof(self) weakSelf = self;
[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
if (error)
{
[weakSelf.motionManager stopDeviceMotionUpdates];
return;
} [weakSelf deviceMotionDidUpdate:motion];
}];
} // Updates the gradient layer to fill our bounds.
-(void)updateGradientLayerPosition
{
if ([[UIScreen mainScreen] scale] > )
{
// Running on a retina device
// self.gradientLayer.frame = CGRectMake(0, CGRectGetHeight(self.bounds) - 1.5f, CGRectGetWidth(self.bounds), 1.5f);
self.gradientLayer.frame = CGRectMake(, CGRectGetHeight(self.bounds) - 1.5f, CGRectGetWidth(self.bounds), );
}
else
{
// Running on a non-Retina device
// self.gradientLayer.frame = CGRectMake(0, CGRectGetHeight(self.bounds) - 1, CGRectGetWidth(self.bounds), 1);
self.gradientLayer.frame = CGRectMake(, CGRectGetHeight(self.bounds) - 1.5f, CGRectGetWidth(self.bounds), ); }
} // Updates the gradient's colours.
-(void)updateGradientColours
{
self.gradientLayer.colors = @[(id)[[UIColor clearColor] CGColor],
(id)[self.highlightColor CGColor],
(id)[[UIColor clearColor] CGColor]];
} #pragma mark CoreMotion Methods -(void)deviceMotionDidUpdate:(CMDeviceMotion *)deviceMotion
{
// Called when the deviceMotion property of our CMMotionManger updates.
// Recalculates the gradient locations. // Ration from the center which the centre of the gradient is permitted to move.
// (ie: the centre of the gradient may be 1/4 the distance of the view from the centre.)
const CGFloat maxDistanceRatioFromCenter = 4.0f; // We need to account for the interface's orientation when calculating the relative roll.
CGFloat roll = 0.0f;
switch ([[UIApplication sharedApplication] statusBarOrientation]) {
case UIInterfaceOrientationPortrait:
roll = deviceMotion.attitude.roll;
break;
case UIInterfaceOrientationPortraitUpsideDown:
roll = -deviceMotion.attitude.roll;
break;
case UIInterfaceOrientationLandscapeLeft:
roll = -deviceMotion.attitude.pitch;
break;
case UIInterfaceOrientationLandscapeRight:
roll = deviceMotion.attitude.pitch;
break;
} // This will give us an interpolated value [-0.4 ... 0.4].
CGFloat interpolatedValue = sinf(roll) / maxDistanceRatioFromCenter; // We need to convert our ration to a decimal (0.4, in this case).
CGFloat maxDistanceDecimalFromCenter = maxDistanceRatioFromCenter / 10.0f; // Find the middle position for our gradient. This needs to be in the range of [0 ... 1].
CGFloat gradientMiddlePosition = (interpolatedValue + maxDistanceDecimalFromCenter) / (maxDistanceDecimalFromCenter * 2.0f); // Finally, update our gradient layer.
self.gradientLayer.locations = @[@(), @(gradientMiddlePosition), @()];
} #pragma mark Overridden Methods -(void)setFrame:(CGRect)frame
{
[super setFrame:frame]; [self updateGradientLayerPosition];
} -(void)setBounds:(CGRect)bounds
{
[super setBounds:bounds]; [self updateGradientLayerPosition];
} #pragma mark - Overridden Properties -(void)setHighlightColor:(UIColor *)highlightColor
{
_highlightColor = highlightColor; [self updateGradientColours];
} @end
#import "ViewController.h"
#import "TLTiltHighlightView.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. UIImageView *hbImageview=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"saomiao.png"]] autorelease];
CGRect hbImagerect=CGRectMake(, , , );
[hbImageview setFrame:hbImagerect];
[self.view addSubview:hbImageview]; } - (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} - (IBAction)saomiao:(id)sender { //上下扫描线
TLTiltHighlightView *highlightView = [[TLTiltHighlightView alloc] initWithFrame:CGRectMake(, , , )];
highlightView.highlightColor = [UIColor greenColor];
highlightView.backgroundColor = [UIColor clearColor];
highlightView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
[self.view addSubview:highlightView];
while () {
[ViewController moveDown:highlightView andAnimationDuration:2.0 andWait:YES andLength:90.0];
[ViewController moveUp:highlightView andAnimationDuration:2.0 andWait:YES andLength:90.0];
} } + (void) moveUp: (UIView *)view andAnimationDuration: (float) duration andWait:(BOOL) wait andLength:(float) length
{
__block BOOL done = wait; //wait = YES wait to finish animation
[UIView animateWithDuration:duration animations:^{
view.center = CGPointMake(view.center.x, view.center.y-length); } completion:^(BOOL finished) {
done = NO;
}];
// wait for animation to finish
while (done == YES)
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
} + (void) moveDown: (UIView *)view andAnimationDuration: (float) duration andWait:(BOOL) wait andLength:(float) length{
__block BOOL done = wait; //wait = YES wait to finish animation
[UIView animateWithDuration:duration animations:^{
view.center = CGPointMake(view.center.x, view.center.y + length); } completion:^(BOOL finished) {
done = NO;
}];
// wait for animation to finish
while (done == YES)
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
} @end

然后是ViewController

主要实现的是两个类方法,实现上下移动。

+ (void) moveUp: (UIView *)view andAnimationDuration: (float) duration andWait:(BOOL) wait andLength:(float) length
{
__block BOOL done = wait; //wait = YES wait to finish animation
[UIView animateWithDuration:duration animations:^{
view.center = CGPointMake(view.center.x, view.center.y-length); } completion:^(BOOL finished) {
done = NO;
}];
// wait for animation to finish
while (done == YES)
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
} + (void) moveDown: (UIView *)view andAnimationDuration: (float) duration andWait:(BOOL) wait andLength:(float) length{
__block BOOL done = wait; //wait = YES wait to finish animation
[UIView animateWithDuration:duration animations:^{
view.center = CGPointMake(view.center.x, view.center.y + length); } completion:^(BOOL finished) {
done = NO;
}];
// wait for animation to finish
while (done == YES)
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
}

代码下载

IOS开发小功能2:二维码扫描界面的设计(横线上下移动)的更多相关文章

  1. iOS中 基于LBXScan库二维码扫描 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 首先声明这个二维码扫描是借助于zxing. 功能模块都完全封装好了,不过界面合你口味,直接使用就好,如果不合口味,后 ...

  2. IOS开发技巧快速生成二维码

    随着移动互联网的发展,二维码应用非常普遍,各大商场,饭店,水果店 基本都有二维码的身影,那么ios中怎么生成二维码呢? 下面的的程序演示了快速生成二维码的方法: 在ios里面要生成二维码,需要借助一个 ...

  3. iOS开发——高级技术&生成二维码

      生成二维码 因为项目里需要新增个功能,该功能用到了二维码技术.于是我便查阅了资料,先学习了二维码的生成. 我们使用libqrencode库来生成二维码.下载地址http://download.cs ...

  4. iOS开发——生成条形码,二维码

    - (void)viewDidLoad { [super viewDidLoad]; self.imageView.image = [self generateBarCode:@"15248 ...

  5. iOS 简单易用的二维码扫描及生成二维码三方控件LFQRCode,可灵活自定义UI

    一.扫码 扫描的控件是一个view,使用者只需贴在自己的控制器内即可.其他UI用户可在自己控制器随便添加.代码如下 - (void)viewDidLoad { [super viewDidLoad]; ...

  6. iOS 原生库(AVFoundation)实现二维码扫描,封装的工具类,不依赖第三方库,可高度自定义扫描动画及界面(Swift 4.0)

    Create QRScanner.swift file // // QRScanner.swift // NativeQR // // Created by Harvey on 2017/10/24. ...

  7. 自定义ZXing二维码扫描界面并解决取景框拉伸等问题

    先看效果 扫描内容是下面这张,二维码是用zxing库生成的 由于改了好几个类,还是去年的事都忘得差不多了,所以只能上这个类的代码了,主要就是改了这个CaptureActivity.java packa ...

  8. 二维码框架ZBarSDK的使用和自己定义二维码扫描界面方法

    假设你不知道ZBarSDK怎么用,请下载demo http://download.csdn.net/detail/u013686641/7858917 假设你已经配置好ZBarSDK .那么以下这个类 ...

  9. react-native 扫一扫功能(二维码扫描)功能开发

    1.安装插件 yarn add react-native-smart-barcode 2.关联 react-native link react-native-smart-barcode 3.修改 an ...

随机推荐

  1. Hadoop 2.2.0 HA构造

    在这篇文章中<Ubuntu和CentOS分布式配置Hadoop-2.2.0>介绍hadoop 2.2.0最主要的配置.hadoop 2.2.0中提供了HA的功能,本文在前文的基础上介绍ha ...

  2. MySQL 服务器变量 数据操作DML-视图

    原文:MySQL 服务器变量 数据操作DML-视图 SQL语言的组成部分 常见分类: DDL:数据定义语言 DCL:数据控制语言,如授权 DML:数据操作语言 其它分类: 完整性定义语言: DDL的一 ...

  3. 利用BBED恢复UPDATE改动前的值

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/30615151 实验步骤例如以下: 1.创建表guo_test1 gyj@PROD> ...

  4. crawler_httpclient代理访问

    public String getDocumentByProxy(String url) throws ClientProtocolException, IOException { DefaultHt ...

  5. Python - 安全替换字符串模板(safe_substitute) 详细解释

    安全替换字符串模板(safe_substitute) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27057339 字 ...

  6. 【高德地图API】如何获得行政区域?如何制作行政规划图?

    原文:[高德地图API]如何获得行政区域?如何制作行政规划图? 什么是行政规划图?如何获得每个行政区域的边界轮廓图?举例:重庆市 江北区.如图: 官方类参考:http://developer.amap ...

  7. ENode 2.0

    ENode 2.0 - 介绍一下关于ENode中对Command的调度设计 摘要: CQRS架构,C端的职责是处理从上层发送过来的command.对于单台机器来说,我们如何尽快的处理command呢? ...

  8. Linux内核源代码情景分析-中断半

    一.中断初始化 1.中断向量表IDT初始化 void __init init_IRQ(void) { int i; #ifndef CONFIG_X86_VISWS_APIC init_ISA_irq ...

  9. 给Notepad++ 6.7 加右键菜单带图标

    使用的是Notepad++ 6.7,下载 NppShell64.dll 和 NppShell.dll方法:将BAT文件和下载的NppShell64.dll 和 NppShell.dll放置Notepa ...

  10. Cocos2d-x3.0之路--02(引擎文件夹分析和一些细节)

    关于怎么搭建好开发环境的我就不写了,网上非常多. 那么 我们来看看 引擎文件的文件夹 所谓知己知彼 百战不殆嘛 先说一下setup.py 这个文件是有关配置的python文件,比方我们在进行andro ...