2015-06-08 22:56:40 lee824528524 阅读数 1879
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    7969 人正在学习 去看看 秦子恒

     总:分享可以说是每一个app的必备元素,当前第三方分享平台也很多:

                 百度:暂时不支持64位,已弃之,但是封装的很简单。

                 shareSDK:老牌分享SDK,实现效果好,据说的,没有尝试过。

                友盟:文档详细,并且可根据不同平台做进一步分享操作,缺点是文档繁杂,不容易找到重点。可自定制分享界面。


             在这里做了一个友盟分享的粗略Demo,可以帮找到重点,节省很多开发时间。


    操作:   1 、选择相应分享平台,下载SDK,仅选择使用的平台即可,防止包过大

                  2、 按照指示导入SDK,并添加相应地 .a 静态库 。

                  3、根据demo即可实现简单分享功能,进一步开发详见友盟文档。


   


    Demo地址:  https://github.com/yuanjilee/LeeUmengShare

2016-07-11 12:51:27 han63504 阅读数 253
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    7969 人正在学习 去看看 秦子恒

IOS图片水印(文字+图片+裁剪)demo下载地址:

IOS图片加水印demo下载

2016-06-19 19:03:52 yangmeng13930719363 阅读数 5022
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    7969 人正在学习 去看看 秦子恒

效果图

效果图
效果图-新增

一、环境设置

1.开发环境:Xocode 7.3.1

2.模拟器环境:iOS 9.3

3.iOS 9 之后不能直接使用 HTTP 进行请求,需要在 Info.plist 新增一段用于控制 ATS 的配置:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

也即:

ATS配置

注:
bitcode 是 xcode 7 之后新增的配置选项,默认为 YES,我们提交程序到 App store 上时,Xcode 会将程序编译为一个中间表现形式(bitcode)。然后 App store 会再将这个 bitcode 编译为可执行的 64 位或 32 位程序。

在这个 Demo 里不需要使用 bitcode 功能,所以设置为了 NO
bitcode设置为NO

4.导入百度地图 SDK

百度地图提供了两种导入方式,可以直接把 SDK 拖入到工程,也可以使用 CocoaPods ,这里我是用后面一种方式导入百度地图 SDK。

编辑 Podfile 内容如下:

pod 'BaiduMapKit' #百度地图SDK

在 Podfile 所在的文件夹下输入命令:

pod install

但是无论是执行 pod install 还是 pod update 都卡在了 Analyzing dependencies 不动.

如果之前安装过 CocoaPods,在安装和更新第三方类库的时候建议使用下面的语句,这样不用等太多时间:

pod install --verbose --no-repo-update
pod update --verbose --no-repo-update
pod install --no-repo-update

手动配置.framework形式开发包

第一步、根据需要导入 .framework包

百度地图 iOS SDK 采用分包的形式提供 .framework包,请广大开发者使用时确保各分包的版本保持一致。其中BaiduMapAPI_Base.framework 为基础包,使用 SDK 任何功能都需导入,其他分包可按需导入。
将所需的 BaiduMapAPI_XX.framework 拷贝到工程所在文件夹下。
在 TARGETS->Build Phases-> Link Binary With Libaries 中点击“+”按钮,在弹出的窗口中点击 “Add Other” 按钮,选择 BaiduMapAPI_XX.framework 添加到工程中。
注: 静态库中采用 Objective-C++ 实现,因此需要您保证您工程中至少有一个 .mm 后缀的源文件(您可以将任意一个 .m 后缀的文件改名为.mm),或者在工程属性中指定编译方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并将其设置为 “Objective-C++”

第二步、引入所需的系统库

百度地图SDK中提供了定位功能和动画效果,v2.0.0版本开始使用OpenGL渲染,因此您需要在您的 Xcode 工程中引入CoreLocation.framework和QuartzCore.framework、OpenGLES.framework、SystemConfiguration.framework、CoreGraphics.framework、Security.framework、libsqlite3.0.tbd(xcode7以前为 libsqlite3.0.dylib)、CoreTelephony.framework 、libstdc++.6.0.9.tbd(xcode7以前为libstdc++.6.0.9.dylib)。
(注:红色标识的系统库为v2.9.0新增的系统库,使用v2.9.0及以上版本的地图SDK,务必增加导入这3个系统库。)
添加方式:在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加这几个系统库即可。

第三步、环境配置

在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC。

第四步、引入mapapi.bundle资源文件

如果使用了基础地图功能,需要添加该资源,否则地图不能正常显示 mapapi.bundle 中存储了定位、默认大头针标注View及路线关键点的资源图片,还存储了矢量地图绘制必需的资源文件。如果您不需要使用内置的图片显示功能,则可以删除 bundle 文件中的 image 文件夹。您也可以根据具体需求任意替换或删除该 bundle 中 image 文件夹的图片文件。
方法:选中工程名,在右键菜单中选择 Add Files to “工程名”…,从BaiduMapAPI_Map.framework||Resources 文件中选择 mapapi.bundle 文件,并勾选 “Copy items if needed” 复选框,单击 “Add” 按钮,将资源文件添加到工程中。

使用 cocoaPods 导入的百度地图,运行之后可能会报错:
错误1.png
这时需要进入
解决错误1
将所有的百度地图 framework 导入到工程中:
AddOther
然后再运行,错误解决,会出现下面的错误:
这里写图片描述
这时进入 info.plist 添加 Bundle display name,如下图:
这里写图片描述
配置百度地图资源文件:
这里写图片描述
mapapi_bundle.png
再次运行,控制台会输出『设置成功』则说明设置成功了。
这里写图片描述

二、代码

代码结构:

  • Classess
    • 百度地图&路径规划
    • 覆盖物
      • YMAnnotationViewController - 自定义标注拖动控制器
      • YMAnnotationController - 系统标注拖动控制器
    • 主控制器
      • YMTableViewController - 刚进入程序的控制器
        • Controller
          • YMMapViewController - 百度地图控制器
          • YMPoiDetailViewController - 店铺详情控制器
          • YMRouteAnnotationController - 路径规划控制器
        • Model
          • YMPoi - 店铺模型
          • YMPointAnnotation - 标注模型
        • View
          • YMAnnotationView - 标注视图
          • YMPaopaoView - 点击标注弹出自定义的泡泡
    • Category
      • UIImage+Rotate - 路径规划界面 image 的扩展

注意:
1. 需要把 AppDelegate.m 改成 AppDelegate.mm 文件
2. 需要把路径规划控制也写成 .mm 后缀,即YMRouteAnnotationController.mm。

新增功能:


2016 年 7 月 5 日

新增两个控制器,分别是 YMAnnotationViewControllerYMAnnotationController,可以对自定义的标注和系统的标注进行拖动操作。

百度地图提供了下面的代理方法:

/**
 *拖动annotation view时,若view的状态发生变化,会调用此函数。ios3.2以后支持
 *@param mapView 地图View
 *@param view annotation view
 *@param newState 新状态
 *@param oldState 旧状态
 */
- (void)mapView:(BMKMapView *)mapView annotationView:(BMKAnnotationView *)view didChangeDragState:(BMKAnnotationViewDragState)newState
   fromOldState:(BMKAnnotationViewDragState)oldState;

但是我进行设置的时候上面的方法并不起作用,可能使用的方式不对…

所以我使用了下面的方法:

/**
 *当选中一个annotation views时,调用此接口
 *@param mapView 地图View
 *@param views 选中的annotation views
 */
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view;

/**
 *当取消选中一个annotation views时,调用此接口
 *@param mapView 地图View
 *@param views 取消选中的annotation views
 */
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view;

这样设置之后,每次在当我点击的时候大头针的时候,大头针处于选中状态,这次设置大头针为开始拖动状态,然后拖动地图,取消选中的时候,设置大头针为结束拖动状态。

如下代码:

/**
 *当选中一个annotation views时,调用此接口
 *@param mapView 地图View
 *@param views 选中的annotation views
 */
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view {
    // 当选中标注的之后,设置开始拖动状态
    view.dragState = BMKAnnotationViewDragStateStarting;
}

/**
 *当取消选中一个annotation views时,调用此接口
 *@param mapView 地图View
 *@param views 取消选中的annotation views
 */
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)annotationView {
    // 取消选中标注后,停止拖动状态
    annotationView.dragState = BMKAnnotationViewDragStateEnding;
    // 设置转换的坐标会有一些偏差,具体可以再调节坐标的 (x, y) 值
    CGPoint dropPoint = CGPointMake(annotationView.center.x, CGRectGetMaxY(annotationView.frame));
    CLLocationCoordinate2D newCoordinate = [_mapView convertPoint:dropPoint toCoordinateFromView:annotationView.superview];
    [annotationView.annotation setCoordinate:newCoordinate];
    /// geo检索信息类,获取当前城市数据
    BMKReverseGeoCodeOption *reverseGeoCodeOption = [[BMKReverseGeoCodeOption alloc] init];
    reverseGeoCodeOption.reverseGeoPoint = newCoordinate;
    [_geoSearch reverseGeoCode:reverseGeoCodeOption];
}

说明:

1.在 AppDelegate.mm 的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中设置百度地图管理者,需要在百度地图 API 控制台设置 AppKey:

NSString *mapKey = @"x5EHcRvWZm8uzkt3HUpGBQU3";
    _mapManager = [[BMKMapManager alloc]init];
    // 如果要关注网络及授权验证事件,请设定generalDelegate参数
    BOOL ret = [_mapManager start:mapKey generalDelegate:nil];
    if (ret) {
        NSLog(@"设置成功!");
    }

2.使用 cocoaPods 可能会遇到下面的问题
这里写图片描述
解决办法如下:
这里写图片描述

再次运行就不会报错了。

3.说明:地图上的标注抓取的是美团的数据。

说明:
这只是一个简单的 demo,写的比较粗糙,大家可以给我留言,需要完成什么样的功能,如果有时间,我会尽力加上需要的功能,后面我还会继续更新。谢谢大家的支持!如果你觉得我写的 demo 对你有所帮助,请在 github 上下载的时候顺手给个 star,不胜感激!

下面是 demo 下载地址:

github 下载地址

2019-04-10 20:07:01 lovechris00 阅读数 3453
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    7969 人正在学习 去看看 秦子恒


#Demo下载地址
http://download.csdn.net/detail/lovechris00/9873031

Demo 说明

  • 本代码参考 杨淑园 的 YSHYClipViewController;
  • 可裁剪圆形、正方形、长方形(自己设置尺寸);
  • 界面都搭建好,拿来即用;

由于mardown处理图片尺寸很麻烦,所以效果图见文章最下方。如有问题,欢迎反馈留言~!


基本功能描述

  • 进入剪裁界面,图片适配剪裁框宽高。(根据尺寸比例,让图片的宽等于剪裁框宽度,或者高与之相等)。
  • 为图片添加手势,和手势的代理。根据拖拽、捏合手势,来处理图片的放大、移动。
  • 拖拽、捏合时,让图片处于裁剪范围内。暂时没有做旋转。
  • 点击确定时,根据图片比例和位置,复制图片内容到画布,并输出画布。
  • 通过代理,输出结果到调用的控制器。

剪裁界面布局

用贝塞尔绘制半透明蒙版


#pragma mark - 绘制裁剪框
-(void)drawClipPath
{
    UIBezierPath *path= [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, self.view.mj_w, self.view.mj_h)];
    CAShapeLayer *layer = [CAShapeLayer layer];
    
    UIBezierPath *clipPath;
    
    if (self.clipType == SQUARECLIP) {//方形
        clipPath = [UIBezierPath bezierPathWithRect:self.clipFrame];
    }else{
       
        clipPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(CGRectGetMidX(self.clipFrame), CGRectGetMidY(self.clipFrame)) radius:_clipW * 0.5 startAngle:0 endAngle:2*M_PI clockwise:NO];
    }
    [path appendPath:clipPath];
    
    [path setUsesEvenOddFillRule:YES];
    layer.path = path.CGPath;
    layer.fillRule = kCAFillRuleEvenOdd;
    
    layer.fillColor = [[UIColor blackColor] CGColor];
    layer.opacity = 0.5;
    
    [_overView.layer addSublayer:layer];
    
    //添加白线
    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    shapeLayer.frame = _overView.bounds;
    shapeLayer.path = clipPath.CGPath;
    shapeLayer.fillColor = [UIColor clearColor].CGColor;
    shapeLayer.lineWidth = 1.0f;
    shapeLayer.strokeColor = [UIColor whiteColor].CGColor;
    
    [_overView.layer addSublayer:shapeLayer];
}

拖拽捏合图片

根据拖拽中 [panGesture translationInView:view.superview];改变图片位置

根据捏合中的 pinGesture.scale 改变图片大小。

##考虑事项:
###捏合后,图片宽、高,小于裁剪框的宽高
处理方式:如果图片宽度imgW 小于裁剪框的宽 clipW,则让图片 imgW = clipW; 如果处理后 图片高度imgH 小于裁剪框高度 clipH , 则让 imgH = clipH。
针对不同尺寸的裁剪框,我们要让图片宽高中的最小项,大于裁剪框宽高中的最大项。所以可以根据宽高比来方便判断。
重新设置尺寸的方法如下:

#pragma mark -- 处理图片大小
-(CGSize )handleScale
{
    CGFloat oriRate = _image.size.width / _image.size.height;
    CGFloat clipRate = _clipW / _clipH;
    
    CGSize resultSize;
    
    if (oriRate > clipRate) {
        resultSize.height = _clipH;
        resultSize.width = oriRate * _clipH;
    }else{
        resultSize.width = _clipW;
        resultSize.height = _clipW / oriRate;
    }
    
    return  resultSize;
}

###移动后、缩小后,图片四角不在裁剪框内;

经过上述操作,图片尺寸不会小于裁剪框尺寸。所以只需要判断四角的x,y值。
如果左上角在框内,则让x = clipX,同理亦然。具体代码如下:

#pragma mark -- 缩放结束后 确保图片在裁剪框内
-(CGRect )handlePosition:(UIView *)view
{
    
    // 图片.top < 裁剪框.top
    if(view.frame.origin.y > self.clipFrame.origin.y)
    {
        CGRect viewFrame = view.frame;
        viewFrame.origin.y = self.clipFrame.origin.y;
        view.frame = viewFrame;
    }
    // 图片.left < 裁剪框.left
    if(view.frame.origin.x > self.clipFrame.origin.x)
    {
        CGRect viewFrame = view.frame;
        viewFrame.origin.x = self.clipFrame.origin.x;
        view.frame = viewFrame;
    }
    
    // 图片.right < 裁剪框.right
    if(CGRectGetMaxX(view.frame)< CGRectGetMaxX(self.clipFrame))
    {
        CGFloat right =CGRectGetMaxX(view.frame);
        CGRect viewFrame = view.frame;
        CGFloat space = CGRectGetMaxX(self.clipFrame) - right;
        viewFrame.origin.x+=space;
        view.frame = viewFrame;
    }
    
    // 图片.bottom < 裁剪框.bottom
    if(CGRectGetMaxY(view.frame) < CGRectGetMaxY(self.clipFrame))
    {
        CGRect viewFrame = view.frame;
        CGFloat space = CGRectGetMaxY(self.clipFrame) - (CGRectGetMaxY(view.frame));
        viewFrame.origin.y +=space;
        view.frame = viewFrame;
    }
    
    return view.frame;
}

剪裁方法

#pragma mark - 裁剪获取图片
-(UIImage *)getClippedImage
{
    CGFloat rationScale = (_imageView.mj_w /_image.size.width);
    
    CGFloat origX = (self.clipFrame.origin.x - _imageView.frame.origin.x) / rationScale;
    CGFloat origY = (self.clipFrame.origin.y - _imageView.frame.origin.y) / rationScale;
    
    CGFloat oriWidth = _clipW / rationScale;
    CGFloat oriHeight = _clipH / rationScale;
    
    CGRect myRect = CGRectMake(origX, origY, oriWidth, oriHeight);
    CGImageRef  imageRef = CGImageCreateWithImageInRect(_image.CGImage, myRect);
    UIGraphicsBeginImageContext(myRect.size);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, myRect, imageRef);
    UIImage * clipImage = [UIImage imageWithCGImage:imageRef];
    UIGraphicsEndImageContext();
    
    if(self.clipType == CIRCULARCLIP){
        return  [self clipCircularImage:clipImage];
    }
    return clipImage;
}

#pragma mark -- 裁剪图片为圆形效果
-(UIImage *)clipCircularImage:(UIImage *)image
{
    CGFloat arcCenterX = image.size.width/ 2;
    CGFloat arcCenterY = image.size.height / 2;
    
    UIGraphicsBeginImageContext(image.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextBeginPath(context);
    CGContextAddArc(context, arcCenterX , arcCenterY, image.size.width/ 2 , 0.0, 2*M_PI, NO);
    CGContextClip(context);
    CGRect myRect = CGRectMake(0 , 0, image.size.width ,  image.size.height);
    [image drawInRect:myRect];
    
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return  newImage;
}


效果如下:
这里写图片描述

这里写图片描述

这里写图片描述


2019-05-27 14:37:10 ITzhongzi 阅读数 65
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    7969 人正在学习 去看看 秦子恒

运行效果
在这里插入图片描述

#import "ViewController.h"
#import <MobileCoreServices/MobileCoreServices.h>
#import <AVKit/AVKit.h>
#import <AVFoundation/AVFoundation.h>
//两个协议 一个 采集图片 另一个是 显示图片
@interface ViewController ()<UIImagePickerControllerDelegate, UINavigationControllerDelegate>

@property(strong, nonatomic) UIImagePickerController *imagePickerCon;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController
//懒加载
- (UIImagePickerController *) imagePickerCon {
    if(!_imagePickerCon) {
        _imagePickerCon = [[UIImagePickerController alloc] init];
        
        //采集源类型
        _imagePickerCon.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        
        //媒体类型
        _imagePickerCon.mediaTypes = [NSArray arrayWithObject:(__bridge NSString *)kUTTypeImage];
        
        //设置代理
        _imagePickerCon.delegate = self;
       
    }
     return _imagePickerCon;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
}
- (IBAction)buttonClick:(id)sender {
    //通过摄像头采集,并检测摄像头是否可用
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
        self.imagePickerCon.sourceType = UIImagePickerControllerSourceTypeCamera;
    } else {
         //通过图片库采集
        self.imagePickerCon.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    }
    
    [self presentViewController:self.imagePickerCon animated:YES completion:nil];
    
   
}

//完成采集图片的会调
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info{
    //获取媒体类型 从info中
    NSString *type = info[UIImagePickerControllerMediaType];
    //判断是否是图片类型
    if([type isEqualToString:(__bridge NSString *)kUTTypeImage]){
        //采集到的图片
        UIImage *image = info[UIImagePickerControllerOriginalImage];
        //显示到UI界面
        self.imageView.image = image;
    }
    
    [self dismissViewControllerAnimated:YES completion:nil];
}

//取消采集图片的处理
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    NSLog(@"取消采集图片");
    [self dismissViewControllerAnimated:YES completion: nil];
}

@end

iOS framework demo

阅读数 238

Appium之IOS第一个demo

阅读数 2900

没有更多推荐了,返回首页