iOS 에서 클립보드 관리 하 는 UIPasteboard 붙 여 넣 기

8455 단어 iOSUIPasteboard
1.자체 클립보드 작업 의 네 이 티 브 UI 컨트롤
iOS 의 UI 시스템 에 서 는 UITextField,UITextView,UIWebView 등 3 개의 컨트롤 이 자체 클립보드 로 작 동 합 니 다.이 컨트롤 들 의 문자 상호작용 에서 제스처 를 길 게 누 르 면 화면 보기에 서 시스템 의 클립보드 컨트롤 을 불 러 올 수 있 고 사용 자 는 복사,붙 여 넣 기,잘라 내기 등 을 할 수 있 으 며 그 효 과 는 다음 그림 과 같다.
201661893404792.png (300×533)
UITextField 의 텍스트 동작
201661893437177.png (300×533)
UITextView 의 텍스트 동작
201661893503118.png (300×533)
2.시스템 클립보드 관리 류 UIPasteboard
실제로 사용자 가 위의 공간 을 통 해 복사,편집 등 작업 을 할 때 선택 한 내용 은 시스템 의 클립보드 에 저 장 됩 니 다.또한 이 클립보드 에는 문자열 데이터 만 저장 할 수 있 는 것 이 아니 라 이미지 데이터 와 URL 데 이 터 를 저장 할 수 있 습 니 다.이 클립보드 가 UIPasteboard 클래스 로 개발 자가 직접 데 이 터 를 조작 하여 응용 프로그램 이나 응용 프로그램 간 의 값 을 전달 할 수 있 습 니 다.
UIPasteboard 클래스 는 다음 과 같은 3 가지 초기 화 방법 이 있 습 니 다.

//          
+ (UIPasteboard *)generalPasteboard;
//            name           create                       
+ (nullable UIPasteboard *)pasteboardWithName:(NSString *)pasteboardName create:(BOOL)create;
//             
+ (UIPasteboard *)pasteboardWithUniqueName;
위의 세 가지 초기 화 방법 은 각각 3 개의 등급 이 다른 클립보드 를 가 져 오 거나 만 듭 니 다.시스템 등급 의 클립보드 가 전체 장치 에서 공유 되 고 있 습 니 다.즉,응용 프로그램 이 삭제 되 었 고 시스템 급 클립보드 에 기 록 된 데 이 터 는 여전히 있 습 니 다.사용자 정의 클립보드 는 특정한 이름 문자열 을 통 해 만 듭 니 다.프로그램 이나 같은 개발 자가 개발 한 다른 프로그램 에서 데이터 공 유 를 할 수 있 습 니 다.세 번 째 방법 으로 만 든 클립보드 등 가 는 두 번 째 방법 으로 만 든 클립보드 입 니 다.이름 문자열 만 nil 이 고 현재 응용 내부 에 사 용 됩 니 다.
메모:세 번 째 방법 으로 만 든 클립보드 의 기본 값 은 데이터 가 오래 지속 되 지 않 으 며,프로그램 이 종료 되면 클립보드 의 내용 은 지 워 지지 않 습 니 다.지구 화 를 실현 하려 면 persistent 속성 을 YES 로 설정 해 야 합 니 다.
UIPasteboard 에서 자주 사용 하 는 방법 및 속성 은 다음 과 같 습 니 다.

//      
@property(readonly,nonatomic) NSString *name;
//           
+ (void)removePasteboardWithName:(NSString *)pasteboardName;
//       
@property(getter=isPersistent,nonatomic) BOOL persistent;
//                                    
@property(readonly,nonatomic) NSInteger changeCount;
다음 방법 들 은 클립보드 의 데 이 터 를 설정 하고 가 져 오 는 데 사 용 됩 니 다.
최신 데이터 대상 의 액세스:

//             
- (NSArray<NSString *> *)pasteboardTypes;
//                       
- (BOOL)containsPasteboardTypes:(NSArray<NSString *> *)pasteboardTypes;
//                    
- (nullable NSData *)dataForPasteboardType:(NSString *)pasteboardType;
//                   
- (nullable id)valueForPasteboardType:(NSString *)pasteboardType;
//                     
- (void)setValue:(id)value forPasteboardType:(NSString *)pasteboardType;
//                      
- (void)setData:(NSData *)data forPasteboardType:(NSString *)pasteboardType;
         :

//    
@property(readonly,nonatomic) NSInteger numberOfItems;
//               
- (nullable NSArray *)pasteboardTypesForItemSet:(nullable NSIndexSet*)itemSet;
//                   
- (BOOL)containsPasteboardTypes:(NSArray<NSString *> *)pasteboardTypes inItemSet:(nullable NSIndexSet *)itemSet;
//              
- (nullable NSIndexSet *)itemSetWithPasteboardTypes:(NSArray *)pasteboardTypes;
//              
- (nullable NSArray *)valuesForPasteboardType:(NSString *)pasteboardType inItemSet:(nullable NSIndexSet *)itemSet;
//             NSData  
- (nullable NSArray *)dataForPasteboardType:(NSString *)pasteboardType inItemSet:(nullable NSIndexSet *)itemSet;
//      
@property(nonatomic,copy) NSArray *items;
//        
- (void)addItems:(NSArray<NSDictionary<NSString *, id> *> *)items;

상기 방법 에서 데이터 형식 파 라 메 터 를 전송 해 야 하 는 경우 가 많 습 니 다.이런 파 라 메 터 는 시스템 이 정의 한 일부 문자 입 니 다.다음 과 같 습 니 다.

//                   
UIKIT_EXTERN NSArray<NSString *> *UIPasteboardTypeListString;
//  URL              
UIKIT_EXTERN NSArray<NSString *> *UIPasteboardTypeListURL;
//                
UIKIT_EXTERN NSArray<NSString *> *UIPasteboardTypeListImage;
//                
UIKIT_EXTERN NSArray<NSString *> *UIPasteboardTypeListColor;

위의 두 가지 방법 에 비해 아래 의 이런 방법 들 은 대상 을 대상 으로 하고 개발 에서 사용 하 는 것 이 더욱 편리 하고 빠르다.

//               
@property(nullable,nonatomic,copy) NSString *string;
//               
@property(nullable,nonatomic,copy) NSArray<NSString *> *strings;
//          URL  
@property(nullable,nonatomic,copy) NSURL *URL;
//          URL  
@property(nullable,nonatomic,copy) NSArray<NSURL *> *URLs;
//   s           
@property(nullable,nonatomic,copy) UIImage *image;
//              
@property(nullable,nonatomic,copy) NSArray<UIImage *> *images;
//              
@property(nullable,nonatomic,copy) UIColor *color;
//              
@property(nullable,nonatomic,copy) NSArray<UIColor *> *colors;
                :

//               
UIKIT_EXTERN NSString *const UIPasteboardChangedNotification;
//                 
UIKIT_EXTERN NSString *const UIPasteboardChangedTypesAddedKey;
//                 
UIKIT_EXTERN NSString *const UIPasteboardChangedTypesRemovedKey;
//            
UIKIT_EXTERN NSString *const UIPasteboardRemovedNotification;

3.사진 을 복사 하 는 간단 한 예
CopyView 만 들 기

#import "CopyView.h"
@interface CopyView ()
@property (strong, nonatomic) UIImageView* img1;
@property (strong, nonatomic) UIImageView* img2;
@end

@implementation CopyView
-(UIImageView *)img1{
  if (_img1 == nil) {
    _img1 = [[UIImageView alloc] initWithFrame:CGRectMake(10.0f, 20.0f, 100.0f, 100.0f)];
    NSString* path = [[NSBundle mainBundle] pathForResource:@"NetworldImage" ofType:@"jpg"];
    _img1.image = [UIImage imageWithContentsOfFile:path];
  }
  return _img1;
}

-(UIImageView *)img2{
  if (_img2 == nil) {
     _img2 = [[UIImageView alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.img1.frame)+50.0f, 20.0f, 100.0f, 100.0f)];
    _img2.backgroundColor = [UIColor lightGrayColor];
  }
  return _img2;
}

- (instancetype)initWithFrame:(CGRect)frame {
  self = [super initWithFrame:frame];
  if (self) {
    self.backgroundColor = [UIColor whiteColor];
    [self addSubview:self.img1];
    [self addSubview:self.img2];
  }
  return self;
}

-(BOOL)canBecomeFirstResponder{
  return YES;
}
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
  NSArray* methodNameArr = @[@"copy:",@"cut:",@"select:",@"selectAll:",@"paste:"];
  if ([methodNameArr containsObject:NSStringFromSelector(action)]) {
    return YES;
  }
  return [super canPerformAction:action withSender:sender];
}

-(void)copy:(id)sender{
  UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
  [pasteboard setImage:self.img1.image];
}

-(void)paste:(id)sender{
  UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
  self.img2.image = [pasteboard image];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
  [self becomeFirstResponder];
  UIMenuController* menuController = [UIMenuController sharedMenuController];
  [menuController setTargetRect:self.img1.frame inView:self];
  [menuController setMenuVisible:YES animated:YES];
}

@end
 controller 

#import "ViewController.h"
#import "CopyView.h"

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  CopyView* cv = [[CopyView alloc] initWithFrame:self.view.bounds];
  self.view = cv;
}

@end

효과 전시
201661893535077.png (592×986)
201661893556615.png (592×986)

좋은 웹페이지 즐겨찾기