iOS_26PopoverController簡單使用

來源:互聯網
上載者:User

iOS_26PopoverController簡單使用

最終:



UIImage分類,Point2Color:<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KPHA+PHByZSBjbGFzcz0="brush:java;">//// UIImage+Point2Color.h// 26_popOverCtrl//// Created by beyond on 14-8-31.// Copyright (c) 2014年 com.beyond. All rights reserved.//#import @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, 0}, {225, 250}}// 將位元影像寫入(渲染)已經建立好的  上下文工作空間CGContextDrawImage(contexRef, rect, inImage);// 得到位元影像上下文 記憶體資料區塊的首地址,用指標記住,作為基地址unsigned char* dataPoint = CGBitmapContextGetData (contexRef);    NSLog(@"----首地址,指標%p",dataPoint);    // ----首地址,指標0x8b3f000if (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 @protocol ColorPickerDelegate;@interface ColorPickerController : UIViewController// 成員:代理,到時個通知該代理,選擇的顏色是啥~@property (weak, nonatomic) id 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 @class ColorPickerController;@protocol ColorPickerDelegate @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,彈出Nana控制器#import "NanaViewController.h"// 點擊中間的按鈕,彈出顏色選擇控制器#import "ColorPickerController.h"// 代理方法#import "ColorPickerDelegate.h"@interface BeyondViewController ()- (IBAction)menuClick:(UIBarButtonItem *)sender;- (IBAction)colorButtonClick:(UIButton *)sender;// UIPopoverController  不能是局部變數,必須是成員變數@property (nonatomic, strong) UIPopoverController *menuPopover;// UIPopoverController  不能是局部變數,必須是成員變數@property (nonatomic, 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 - 監聽按鈕點擊/** *  點擊菜單,在指定位置,彈出popOver */- (IBAction)menuClick:(UIBarButtonItem *)sender{    // 顯示到哪個位置    [self.menuPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];}/** *  點擊了顏色按鈕,在指定位置,彈出popOver */- (IBAction)colorButtonClick:(UIButton *)sender{    [self.colorPopover presentPopoverFromRect:sender.bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];}@end













聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.