iOS_26PopoverController简单使用

iOS_26PopoverController简单使用,第1张

概述最终效果图: UIImage分类,Point2Color: //// UIImage+Point2Color.h// 26_popOverCtrl//// Created by beyond on 14-8-31.// Copyright (c) 2014年 com.beyond. All rights reserved.//#import <UIKit/UIKit.h>

最终效果图:



UIImage分类,Point2color:

////  UIImage+Point2color.h//  26_popOverCtrl////  Created by beyond on 14-8-31.//  copyright (c) 2014年 com.beyond. All rights reserved.//#import <UIKit/UIKit.h>@interface UIImage (Point2color)// 传入 一个点坐标,返回图片上该点的颜色对象- (UIcolor *)colorFromPoint:(CGPoint)point;@end




////  UIImage+Point2color.m//  26_popOverCtrl////  Created by beyond on 14-8-31.//  copyright (c) 2014年 com.beyond. All rights reserved.//  分类,传入一个point,获取该点的颜色#import "UIImage+Point2color.h"@implementation UIImage (Point2color)// 传入 一个点坐标,返回图片上该点的颜色对象// 将图片写入内存,再依据【点】中取颜色- (UIcolor *)colorFromPoint:(CGPoint)point{	UIcolor *color = nil;    // 得到取色图片的引用	CGImageRef inImage = self.CGImage;    // 调用自定义方法:从_imgVIEw里面的image的引用,创建并返回对应的上下文	CGContextRef contexRef = [self ARGBBitmapContextFromImage:inImage];    // 如果创建该图片对应的上下文失败	if (contexRef == NulL){        NSLog(@"取色图片--创建对应的上下文失败~");        return nil;    }	// 准备将【取色图片】写入刚才创建出来的上下文    size_t w = CGImageGetWIDth(inImage);	size_t h = CGImageGetHeight(inImage);	CGRect rect = {{0,0},{w,h}};    // 调试输出rect:--{{0,{225,250}}		// 将位图写入(渲染)已经创建好的  上下文工作空间	CGContextDrawImage(contexRef,rect,inImage);		// 得到位图上下文 内存数据块的首地址,用指针记住,作为基地址	unsigned char* dataPoint = CGBitmapContextGetData (contexRef);    NSLog(@"----首地址,指针%p",dataPoint);    // ----首地址,指针0x8b3f000	if (dataPoint != NulL) {		//offset 即:根据触摸点的xy,定位到位图内存空间中的一个特定像素        //4 的意思是每一个像素点,占4个字节        // w是每一行所有点的总数        // 根据所在行,所在列,算出在内存块中的偏移地址,然后乘以4,因为每一个点在内存中占四个字节		int offset = 4*((w*round(point.y))+round(point.x));        // Alpha 为内存基地址+偏移地址		int Alpha =  dataPoint[offset];        // red 为内存基地址+偏移地址+1   其他类似		int red = dataPoint[offset+1];		int green = dataPoint[offset+2];		int blue = dataPoint[offset+3];        NSLog(@"偏移地址: %i colors: RGBA %i %i %i  %i",offset,red,green,blue,Alpha);        // offset: 150908 colors: RGB A 255 0 254  255        // 根据RGBA 生成颜色对象		color = [UIcolor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) Alpha:(Alpha/255.0f)];	}		//  *** 作完成后,释放上下文对象	CGContextRelease(contexRef);	// 从内存中释放掉 加载到内存的图像数据	if (dataPoint) { free(dataPoint); }    // 返回图片上该点对应的颜色	return color;}// 自定义方法2:通过_imgVIEw里面的image的引用,创建并返回对应的上下文,即根据CGImageRef来创建一个ARGBBitmapContext- (CGContextRef)ARGBBitmapContextFromImage:(CGImageRef) inImage{    // 要创建的上下文	CGContextRef    context = NulL;    // 色彩空间	CGcolorSpaceRef colorSpace;    // 位图数据在内存空间的首地址	voID *          bitmapData;    // 每一行的字节数	int             bitmapBytesPerRow;    // 图片总的占的字节数    int             bitmapByteCount;		// 得到图片的宽度和高度,将要使用整个图片,创建上下文	size_t pixelsWIDe = CGImageGetWIDth(inImage);	size_t pixelsHigh = CGImageGetHeight(inImage);		// 每一行占多少字节. 本取色图片中的每一个像素点占4个字节;    // 红 绿 蓝 透明度 各占一个字节(8位  取值范围0~255)    // 每一行的字节数,因为每一个像素点占4个字节(包含RGBA)(其中一个R就是一个字节,占8位,取值是2的8次方 0~255)	bitmapBytesPerRow   = (pixelsWIDe * 4);    // 图片总的占的字节数	bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);		// 使用指定的 色彩空间(RGB)	colorSpace = CGcolorSpaceCreateDeviceRGB();	if (colorSpace == NulL)	{		fprintf(stderr,"创建并分配色彩空间 出错\n");		return NulL;	}		// 为取色图片数据  分配所有的内存空间    // 所有画到取色图片上下文的 *** 作,都将被渲染到此内存空间	bitmapData = malloc( bitmapByteCount );	if (bitmapData == NulL)	{		fprintf (stderr,"内存空间分配失败~");		CGcolorSpaceRelease( colorSpace );		return NulL;	}		// 创建位图上下文. 使用 pre-multiplIEd ARGB,ARGB中的每一个成员都占8个bit位,即一字节,一个像素共占4个字节    // 无论原取色图片的格式是什么(CMYK或Grayscale),都将通过CGBitmapContextCreate方法,转成指定的ARGB格式	context = CGBitmapContextCreate (bitmapData,pixelsWIDe,pixelsHigh,8,// bits per component									 bitmapBytesPerRow,colorSpace,(CGBitmAPInfo)kCGImageAlphaPremultiplIEdFirst);	if (context == NulL)	{		free (bitmapData);		fprintf (stderr,"位图上下文创建失败~");	}		// 在返回上下文之前 必须记得释放 色彩空间  	CGcolorSpaceRelease( colorSpace );		return context;}@end


colorPicker控制器及其代理

////  colorPickerController.h//  26_popOverCtrl////  Created by beyond on 14-8-31.//  copyright (c) 2014年 com.beyond. All rights reserved.//#import <UIKit/UIKit.h>@protocol colorPickerDelegate;@interface colorPickerController : UIVIEwController// 成员:代理,到时个通知该代理,选择的颜色是啥~@property (weak,nonatomic) ID<colorPickerDelegate> delegate;@end




////  colorPickerController.m//  26_popOverCtrl////  Created by beyond on 14-8-31.//  copyright (c) 2014年 com.beyond. All rights reserved.//#import "colorPickerController.h"// 分类#import "UIImage+Point2color.h"// 颜色选择完毕,通知代理#import "colorPickerDelegate.h"@interface colorPickerController ()@property (weak,nonatomic) IBOutlet UIImageVIEw *imageVIEw;@end@implementation colorPickerController#pragma mark - 生命周期方法- (voID)vIEwDIDLoad{    [super vIEwDIDLoad];        // 重要~~~指定 当前控制器在popover中显示的大小(跟 图片 一样)    self.preferredContentSize = self.imageVIEw.image.size;}// 触摸结束时,获取点击的坐标,调用UIImage分类方法,获取图片上该点的颜色- (voID)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{    // 有人需要该点的颜色,才进行取色    if ([self.delegate respondsToSelector:@selector(colorPickerController:dIDSelectedcolor:)]) {        // 获得触摸点        UItouch *touch = [touches anyObject];        CGPoint point = [touch locationInVIEw:touch.vIEw];                // 获得颜色        UIcolor *color = [self.imageVIEw.image colorFromPoint:point];        // 告诉代理,该点对应的颜色        [self.delegate colorPickerController:self dIDSelectedcolor:color];    }}@end


////  colorPickerDelegate.h//  26_popOverCtrl////  Created by beyond on 14-8-31.//  copyright (c) 2014年 com.beyond. All rights reserved.//  颜色选择控制器的代理,当它解码出用户点击处的颜色时,通知代理#import <Foundation/Foundation.h>@class colorPickerController;@protocol colorPickerDelegate <NSObject>@optional- (voID)colorPickerController:(colorPickerController *)ctrl dIDSelectedcolor:(UIcolor *)color;@end



主控制器

////  BeyondVIEwController.m//  26_popOverCtrl////  Created by beyond on 14-8-31.//  copyright (c) 2014年 com.beyond. All rights reserved.// 00000000// 99999999#import "BeyondVIEwController.h"// 点击左边Item,d出Nana控制器#import "NanaVIEwController.h"// 点击中间的按钮,d出颜色选择控制器#import "colorPickerController.h"// 代理方法#import "colorPickerDelegate.h"@interface BeyondVIEwController ()<colorPickerDelegate>- (IBAction)menuClick:(UIbarbuttonItem *)sender;- (IBAction)colorbuttonClick:(UIbutton *)sender;// UIPopoverController  不能是局部变量,必须是成员变量@property (nonatomic,strong) UIPopoverController *menuPopover;// UIPopoverController  不能是局部变量,strong) UIPopoverController *colorPopover;@end@implementation BeyondVIEwController#pragma mark - 懒加载 getter方法- (UIPopoverController *)menuPopover{    if (_menuPopover == nil) {        // 1.创建内容控制器        NanaVIEwController *nana = [[NanaVIEwController alloc] init];        UINavigationController *nav = [[UINavigationController alloc] initWithRootVIEwController:nana];                // 2.创建popover        self.menuPopover = [[UIPopoverController alloc] initWithContentVIEwController:nav];    }    // 返回popOver    return _menuPopover;}- (UIPopoverController *)colorPopover{    if (_colorPopover == nil) {        // 1.创建内容控制器        colorPickerController *cpvc = [[colorPickerController alloc] init];        cpvc.delegate = self;                // 2.创建popover        self.colorPopover = [[UIPopoverController alloc] initWithContentVIEwController:cpvc];        // 重要~~~点击popOver之外的阴影,使点击事件可以穿透...        // self.colorPopover.passthroughVIEws = @[self.colorbutton];    }    return _colorPopover;}#pragma mark - 颜色选择控制器的代理方法- (voID)colorPickerController:(colorPickerController *)cpvc dIDSelectedcolor:(UIcolor *)color{    self.vIEw.backgroundcolor = color;}#pragma mark - 监听按钮点击/** *  点击菜单,在指定位置,d出popOver */- (IBAction)menuClick:(UIbarbuttonItem *)sender{    // 显示到哪个位置    [self.menuPopover presentPopoverFrombarbuttonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];}/** *  点击了颜色按钮,d出popOver */- (IBAction)colorbuttonClick:(UIbutton *)sender{    [self.colorPopover presentPopoverFromrect:sender.bounds inVIEw:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];}@end
总结

以上是内存溢出为你收集整理的iOS_26PopoverController简单使用全部内容,希望文章能够帮你解决iOS_26PopoverController简单使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1088669.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)