废话不多说了,下面通过一段代码给大家介绍iOS 加载Bundle文件的方法,具体代码如下所示:- (NSString *)loadJsFile:(NSString *)fileName Type:(NSString *)type{ NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:type]; NSString *string1 = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; NSString *string1 = [NSString stringWithContentsOfURL:[NSURL URLWithString:path] encoding:NSUTF8StringEncoding error:nil]; return jsScript;}以上所述是小编给大家介绍的iOS 加载Bundle文件的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

直播的采集由采集的设备(摄像头、话筒)不同分为视频采集和音频采集,本篇文章会分别介绍。1.采集步骤 创建捕捉会话(AVCaptureSession),iOS调用相机和话筒之前都需要创建捕捉对话,把输入输出设备添加进对话中。 往会话中添加视频输入对象(AVCaptureDeviceInput)。 往会话中添加音频输入对象(AVCaptureDeviceInput)。 往会话中添加视频输出对象(AVCaptureVideoDataOutput)。 往会话中添加音频输出对象(AVCaptureAudioDataOutput)。 添加视屏预览图层(AVCaptureVideoPreviewLayer)。 开启会话。 推流(以后讲)。2.效果图这是后置摄像头采集的,直播一般用前置摄像头的,但是我实在没勇气放出我的自拍😂。3.代码演示// 采集- (void)setupCaputureVideo { // 1.创建捕获对话,必须要强引用,否则会释放 _captureSession = [[AVCaptureSession alloc] init]; // 2.捕获摄像头设备,默认前置摄像头 AVCaptureDevice *videoDevice = [self getVideoDevice:AVCaptureDevicePositionFront]; // 3.获取声音设备 AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; // 4.创建对应视频设备输入对象 _currentVideoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil]; // 5.创建对应音频设备输入对象 AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil]; // 6.添加到会话中 注意:最好要判断是否能添加输入,会话不能添加空的 // 6.1 添加视频 if ([_captureSession canAddInput:_currentVideoDeviceInput]) { [_captureSession addInput:_currentVideoDeviceInput]; } // 6.2 添加音频 if ([_captureSession canAddInput:audioDeviceInput]) { [_captureSession addInput:audioDeviceInput]; } // 7.捕获视频数据输出设备 AVCaptureVideoDataOutput *videoOutput = [[AVCaptureVideoDataOutput alloc] init]; //7.1 设置代理, 捕获视频样品数据 dispatch_queue_t videoQueue = dispatch_queue_create("Video Capure Queue", DISPATCH_QUEUE_SERIAL); [videoOutput setSampleBufferDelegate: self queue:videoQueue]; // 8.设置音频数据输出设备 AVCaptureAudioDataOutput *audioOutput = [[AVCaptureAudioDataOutput alloc] init]; // 8.1 设置代理,捕获音频样品数据 注意:必须是串行队列才能捕获到数据,而且不能为空 dispatch_queue_t audioQueue = dispatch_queue_create("Audio Capure Queue", DISPATCH_QUEUE_SERIAL); [audioOutput setSampleBufferDelegate:self queue:audioQueue]; // 9.添加到会话中 注意:最好要判断是否能添加输入,会话不能添加空的 if ([_captureSession canAddOutput:videoOutput]) { [_captureSession addOutput:videoOutput]; } if ([_captureSession canAddOutput:audioOutput]) { [_captureSession addOutput:audioOutput]; } // 10.获取视屏输入与输出连接,用于分辨音视频数据 _videoConnection = [videoOutput connectionWithMediaType:AVMediaTypeVideo]; // 11.添加视屏预览图层 _previewdLayer = [AVCaptureVideoPreviewLayer layerWithSession:_captureSession]; _previewdLayer.frame = [UIScreen mainScreen].bounds; [self.view.layer insertSublayer:_previewdLayer atIndex:0]; // 12.开启会话 [_captureSession startRunning];}// 根据摄像头方向获取摄像头- (AVCaptureDevice *)getVideoDevice: (AVCaptureDevicePosition)position { NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; for (AVCaptureDevice *device in devices) { if (device.position == position) { return device; } } return nil;}分析:(1)摄像头:每个手机都有且仅有两个摄像头,前置摄像头和后置摄像头,包括iPhone 7 Plus,它后面的两个摄像头统称为后置摄像头。所以获取的是摄像头数组,我们根据摄像头的方向获取指定的摄像头。对话里只能有一个摄像头设备。(2)摄像头方向(AVCaptureDevicePosition):是一个枚举,有三个值可选择。不过如果选择AVCaptureDevicePositionUnspecified,那么是不能调用摄像头的。typedef NS_ENUM(NSInteger, AVCaptureDevicePosition) { AVCaptureDevicePositionUnspecified = 0, // 不指定 AVCaptureDevicePositionBack = 1, //后置 AVCaptureDevicePositionFront = 2 // 前置}(3)代理:AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate,分别为视频和音频输出设备对象的代理,两个代理都有下面的方法:// 获取输出设备数据,有可能是音频,有可能是视频- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { if (_videoConnection == connection) { NSLog(@"采集到视屏数据"); }else { NSLog(@"采集到音频数据"); }}4.切换摄像头#pragma mark - 切换摄像头- (IBAction)toggleCapture:(id)sender { // 1.获取当前设备方向 AVCaptureDevicePosition cureentPosition = _currentVideoDeviceInput.device.position; // 2.获取需要改变的方向 AVCaptureDevicePosition togglePosition = (cureentPosition == AVCaptureDevicePositionFront ? AVCaptureDevicePositionBack : AVCaptureDevicePositionFront); // 3.获取需要改变的摄像头设备 AVCaptureDevice *toggleDevice = [self getVideoDevice:togglePosition]; // 4.获取需要改变的摄像头输入设备 AVCaptureDeviceInput *toggleDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:toggleDevice error:nil]; // 5.停止会话,否则会有一瞬间的白屏 [_captureSession stopRunning]; // 6.移除之前的摄像头输入设备,否则会崩溃,因为会话里只能有一个摄像头设备 [_captureSession removeInput:_currentVideoDeviceInput]; // 7.添加新的摄像头输入设备 [_captureSession addInput:toggleDeviceInput]; // 8.重新开始会话 [_captureSession startRunning]; // 记录当前摄像头输入设备 //9.重新开始 _currentVideoDeviceInput = toggleDeviceInput;}demo里还有其他的功能,但是感觉没什么太大用处,就不讲了,有兴趣的可以去我的GitHub上下载看看。demo下载demo下载地址。下载下来运行,发现报错。那是因为我没有在工程里上传ijkplayer视屏直播框架,我能上传上去,但下载太慢了,什么原因大家都懂得。我把ijkplayer视屏直播框架放到百度云上了,没有密码,下载下来之后,放到LiveAppDemo-master文件夹里,重新打开就可以运行了。以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

效果图实现思路要实现绘图,通常需要自定义一个UIView的子类,重写父类的- (void)drawRect:(CGRect)rect方法,在该方法中实现绘图操作若想显示下载进度,只需要实例化自定义子类的对象(若是storyboard中控件,只需修改控件的class属性为自定义子类的类名即可)效果图所示的效果其实是绘制一个圆弧,动态的改变终点的位置,最终达到一个封闭的圆中间的文字是一个UILabel控件,根据进度动态改变文字的现实实现步骤自定义一个UIView的子类//提供一个成员属性,接收下载进度值@property (nonatomic, assign) CGFloat progress;重写成员属性progress的setter//每次改变成员属性progress的值,就会调用它的setter- (void)setProgress:(CGFloat)progress{ _progress = progress; //当下载进度改变时,手动调用重绘方法 [self setNeedsDisplay];}重写- (void)drawRect:(CGRect)rect(核心)- (void)drawRect:(CGRect)rect{ //设置圆弧的半径 CGFloat radius = rect.size.width * 0.5; //设置圆弧的圆心 CGPoint center = CGPointMake(radius, radius); //设置圆弧的开始的角度(弧度制) CGFloat startAngle = - M_PI_2; //设置圆弧的终止角度 CGFloat endAngle = - M_PI_2 + 2 * M_PI * self.progress; //使用UIBezierPath类绘制圆弧 UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius - 5 startAngle:startAngle endAngle:endAngle clockwise:

前几天app注册被人攻击了,从网上找了这个先保存下。。。。用于ios本地动态生成验证码,效果如下: 导入CoreGraphics.framework用于绘制图形 封装UIView,便捷使用,代码如下:AuthcodeView.h#import <UIKit/UIKit.h>@interface AuthcodeView : [email protected] (strong, nonatomic) NSArray *dataArray;//字符素材数组@property (strong, nonatomic) NSMutableString *authCodeStr;//验证码字符串@endAuthcodeView.m#import "AuthcodeView.h"#define kRandomColor [UIColor colorWithRed:arc4random() % 256 / 256.0 green:arc4random() % 256 / 256.0 blue:arc4random() % 256 / 256.0 alpha:1.0];#define kLineCount 6#define kLineWidth 1.0#define kCharCount 6#define kFontSize [UIFont systemFontOfSize:arc4random() % 5 + 15]@implementation AuthcodeView/*// Only override drawRect: if you perform custom drawing.// An empty implementation adversely affects performance during animation.- (void)drawRect:(CGRect)rect { // Drawing code}*/- (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { self.layer.cornerRadius = 5.0f; self.layer.masksToBounds = YES; self.backgroundColor = kRandomColor; [self getAuthcode];//获得随机验证码 } return self;}#pragma mark 获得随机验证码- (void)getAuthcode{ //字符串素材 _dataArray = [[NSArray alloc] initWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",@"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",@"i",@"j",@"k",@"l",@"m",@"n",@"o",@"p",@"q",@"r",@"s",@"t",@"u",@"v",@"w",@"x",@"y",@"z",nil]; _authCodeStr = [[NSMutableString alloc] initWithCapacity:kCharCount]; //随机从数组中选取需要个数的字符串,拼接为验证码字符串 for (int i = 0; i < kCharCount; i++) { NSInteger index = arc4random() % (_dataArray.count-1); NSString *tempStr = [_dataArray objectAtIndex:index]; _authCodeStr = (NSMutableString *)[_authCodeStr stringByAppendingString:tempStr]; }}#pragma mark 点击界面切换验证码- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [self getAuthcode]; //setNeedsDisplay调用drawRect方法来实现view的绘制 [self setNeedsDisplay];}- (void)drawRect:(CGRect)rect{ [super drawRect:rect]; //设置随机背景颜色 self.backgroundColor = kRandomColor; //根据要显示的验证码字符串,根据长度,计算每个字符串显示的位置 NSString *text = [NSString stringWithFormat:@"%@",_authCodeStr]; CGSize cSize = [@"A" sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20]}]; int width = rect.size.width/text.length - cSize.width; int height = rect.size.height - cSize.height; CGPoint point; //依次绘制每一个字符,可以设置显示的每个字符的字体大小、颜色、样式等 float pX,pY; for ( int i = 0; i<text.length; i++) { pX = arc4random() % width + rect.size.width/text.length * i; pY = arc4random() % height; point = CGPointMake(pX, pY); unichar c = [text characterAtIndex:i]; NSString *textC = [NSString stringWithFormat:@"%C", c]; [textC drawAtPoint:point withAttributes:@{NSFontAttributeName:kFontSize}]; } //调用drawRect:之前,系统会向栈中压入一个CGContextRef,调用UIGraphicsGetCurrentContext()会取栈顶的CGContextRef CGContextRef context = UIGraphicsGetCurrentContext(); //设置线条宽度 CGContextSetLineWidth(context, kLineWidth); //绘制干扰线 for (int i = 0; i < kLineCount; i++) { UIColor *color = kRandomColor; CGContextSetStrokeColorWithColor(context, color.CGColor);//设置线条填充色 //设置线的起点 pX = arc4random() % (int)rect.size.width; pY = arc4random() % (int)rect.size.height; CGContextMoveToPoint(context, pX, pY); //设置线终点 pX = arc4random() % (int)rect.size.width; pY = arc4random() % (int)rect.size.height; CGContextAddLineToPoint(context, pX, pY); //画线 CGContextStrokePath(context); }}@end 界面添加验证码@interface AuthCodeViewController ()<UITextFieldDelegate, UIAlertViewDelegate>{ AuthcodeView *authCodeView; UITextField *_input;}@[email protected] AuthCodeViewController- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor whiteColor]; //显示验证码界面 authCodeView = [[AuthcodeView alloc] initWithFrame:CGRectMake(30, 100, self.view.frame.size.width-60, 40)]; [self.view addSubview:authCodeView]; //提示文字 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 160, self.view.frame.size.width-100, 40)]; label.text = @"点击图片换验证码"; label.font = [UIFont systemFontOfSize:12]; label.textColor = [UIColor grayColor]; [self.view addSubview:label]; //添加输入框 _input = [[UITextField alloc] initWithFrame:CGRectMake(30, 220, self.view.frame.size.width-60, 40)]; _input.layer.borderColor = [UIColor lightGrayColor].CGColor; _input.layer.borderWidth = 2.0; _input.layer.cornerRadius = 5.0; _input.font = [UIFont systemFontOfSize:21]; _input.placeholder = @"请输入验证码!"; _input.clearButtonMode = UITextFieldViewModeWhileEditing; _input.backgroundColor = [UIColor clearColor]; _input.textAlignment = NSTextAlignmentCenter; _input.returnKeyType = UIReturnKeyDone; _input.delegate = self; [self.view addSubview:_input];}#pragma mark 输入框代理,点击return 按钮- (BOOL)textFieldShouldReturn:(UITextField *)textField{ //判断输入的是否为验证图片中显示的验证码 if ([_input.text isEqualToString:authCodeView.authCodeStr]) { //正确弹出警告款提示正确 UIAlertView *alview = [[UIAlertView alloc] initWithTitle:@"恭喜您 ^o^" message:@"验证成功" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alview show]; } else { //验证不匹配,验证码和输入框抖动 CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.x"]; anim.repeatCount = 1; anim.values = @[@-20,@20,@-20];// [authCodeView.layer addAnimation:anim forKey:nil]; [_input.layer addAnimation:anim forKey:nil]; } return YES;}#pragma mark 警告框中方法-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ //清空输入框内容,收回键盘 if (buttonIndex==0) { _input.text = @""; [_input resignFirstResponder]; }}以上所述是小编给大家介绍的iOS本地动态生成验证码的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

本文实例讲述了Android编程之ListView和EditText发布帖子隐藏软键盘功能。分享给大家供大家参考,具体如下:在Android开发中,手动调用软件盘的隐藏和显示有时候也是非常常见的需求。EditText控件实现了点击打开软键盘输入功能,but why ? 为什么EditText可以点击弹出keyboard,而TextView却不可以,EditText继承TextView做了哪些修改呢?关于这些问题得查看相关具体代码如何实现可以参考,看似简单的控件其实系统封装实现的很复杂。这里告诫和我一样一路自学android的开发者善于思考事件背后的本质,共勉。开发有个布局是最外层是FrameLayout,包裹了ListView,bottom底部是个edit输入框,当点输入框打开keyboard时候,需要下滑listView隐藏keyboard,但上滑继续滑动listView。刚开始,我尝试了给listview设置clickListener,设置onScrollListener,重写它的onTouchEvent方法,但是发现并不能达到自己满意的效果(发现code有段时间了,自己都有种修改代码不修改自己满意为止不罢休的纠结感)。为什么不满意,因为每次listview滑动的时候调用hide keyboard会导致listview闪一下重影现象,因为listview正在滑动调用了hide keyboard,并且Activity设置的是adjustResize会重新onLayout整个布局。(PS:之前也纠结过这个问题,adjustResize属性导致底部的Edit没有跟着keyboard移动,而是等keyboard打开后Edit在layout到合适的位置了。最后总结出的问题是需要调整布局,并且用adjustPan属性,相信类似微信聊天界面肯定也是这样做的,有更好的办法欢迎留言探讨!)重新了最外层的FrameLayout的onInterceptTouchEvent拦截touch方法。直接贴代码了@Override public boolean onInterceptTouchEvent(MotionEvent ev) { //键盘开 && 第一个scroll dy》0 if(showSoftInput) { if(mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(ev); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: downY = (int) ev.getY(); showDispatchTouch = true; break; case MotionEvent.ACTION_MOVE: if(downY > ev.getY()) { showDispatchTouch = true; } else { showDispatchTouch = false; mVelocityTracker.computeCurrentVelocity(1000); if(mVelocityTracker.getYVelocity() > 200 && mContext instanceof ActivityReplyDetail) { ((ActivityReplyDetail)mContext).hideSoftInput(); } } break; default: break; } } return !showDispatchTouch || isAnimating || super.onInterceptTouchEvent(ev); }当然这里只有当keyboard弹出的时候才能拦截touch方法了,所以就要检测keyboard是否已弹出。如何检测mReplyEditLayout.addOnLayoutChangeListener(new OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { if(!mOrientationChanged) { if(top > oldTop) { if(!mEditTouchedFlag) setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); //键盘隐藏 mSoftInputShow = false; mPullToNextLayout.setDispatchTouch(true); mPullToNextLayout.setIsShowSoftInput(false); } else if (top < oldTop) { //键盘显示 mSoftInputShow = true; mPullToNextLayout.setIsShowSoftInput(true); } mEditTouchedFlag = false; } } });OnLayoutChangeListener监听到控件的layout的变化。View还有个监听getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener()这个监听方法被调用的时机据我测试时在上面监听之后回调的。这里还有实现横竖屏切换,横屏是点击输入框得先回到竖屏再弹出keyboard,就用到了上面两个listener,还有个onConfigurationChanged。so当一步步根据自己的调试终于达到自己的满意了。EditText收起keyboard其实更简单,直接重写[email protected] boolean onTouchEvent(MotionEvent event) { if(mSoftInputShow) { switch (event.getAction()) { case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: imm.hideSoftInputFromWindow(getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); return true; } } return super.onTouchEvent(event);}InputMethodManager.HIDE_NOT_ALWAYS这个参数是告诉我们多次调用hideSoft不会一直调用,哈哈哈。其实Edit是个很高的Edit,这种方法,会导致跟listview一样,edit在滑动时同时收起了keyboard导致重影,因为是adjustResize和布局的原因。所以其实这里如果系统能给我们封装好方法,点击show keyboard,再点 hide keyboard并且不会滑动Edit就好了,所以想修改代码,必须得了解edit为什么能实现点击show keyboard的功能。更多关于Android相关内容感兴趣的读者可查看本站专题:《Android控件用法总结》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android数据库操作技巧总结》及《Android资源操作技巧汇总》希望本文所述对大家Android程序设计有所帮助。

分类:365bet娱乐城官网

时间:2016-11-25 06:11:03