Внедрение элементов управления копированием/вставкой iphone в подкласс пользовательского представления/uiview

Я признаю, что здесь, на SO, уже есть вопрос именно такого рода, но ему не хватает деталей реализации, рабочего ответа, и я хотел бы быть более конкретным, поэтому я думаю, что новый вопрос в порядке. Очевидно, дайте мне знать, если я ошибаюсь, и мы можем попытаться перезапустить ветка там.

По сути, я хочу скопировать текст в UILabel на монтажный стол, когда пользователь удерживает метку. Не сложно, честное слово. Тем не менее, я думаю, что лучший способ обеспечить визуальную обратную связь — предложить пользователю пункт меню «Копировать» из UIMenuController.

Согласно разделу «Обработка событий» Руководства по программированию приложений для iPhone, в частности разделу Операции копирования, вырезания и вставки должна быть предусмотрена возможность выполнения операций копирования, вырезания и/или вставки из пользовательский вид.

Итак, я создал подкласс UILabel со следующей реализацией, как описано в руководстве, но UIMenuController не появится. В руководстве нет указаний на то, что для этого требуется что-то еще, и оператор NSLog действительно выводит на консоль, указывая, что селектор выполняется, когда я удерживаю метку:

//
//  CopyLabel.m
//  HoldEm
//
//  Created by Billy Gray on 1/20/10.
//  Copyright 2010 Zetetic LLC. All rights reserved.
//

#import "CopyLabel.h"

@implementation CopyLabel

- (void)showCopyMenu {
    NSLog(@"I'm tryin' Ringo, I'm tryin' reeeeal hard.");
    // bring up editing menu.
    UIMenuController *theMenu = [UIMenuController sharedMenuController];
    // do i even need to show a selection? There's really no point for my implementation...
    // doing it any way to see if it helps the "not showing up" problem...
    CGRect selectionRect = [self frame];
    [theMenu setTargetRect:selectionRect inView:self];
    [theMenu setMenuVisible:YES animated:YES]; // <-- doesn't show up...
}

// obviously, important to provide this, but whether it's here or not doesn't seem
// to change the fact that the UIMenuController view is not showing up
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    BOOL answer = NO;

    if (action == @selector(copy:))
        answer = YES;

    return answer;
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self performSelector:@selector(showCopyMenu) withObject:nil afterDelay:0.8f];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showCopyMenu) object:nil];
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showCopyMenu) object:nil];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showCopyMenu) object:nil];
}

@end

Итак, что еще нужно сделать, чтобы это произошло?

Для тех, кто следит за вами и пытается сделать то же самое, вам также потребуется установить для ярлыка "Взаимодействие с пользователем включено"

Редактировать:

Для ясности позвольте мне добавить, что это должно быть похоже на маленький пункт меню [Копировать], который появляется поверх изображения в некоторых представлениях iPhone, когда вы удерживаете его. -Б


person Billy Gray    schedule 21.01.2010    source источник
comment
Как только у меня это заработало, я собрал учебное пособие и пример проекта для Mobile Orchard: mobileorchard.com/hold-and-copy-in-uikit   -  person Billy Gray    schedule 25.02.2010
comment
Учебник - это именно то, что мне нужно, но вы забыли добавить код методов сброса. Спасибо!   -  person AlBeebe    schedule 31.07.2011


Ответы (1)


Я скажу заранее, что у меня нет ответа, но я немного поковырялся и узнал больше. Я уверен, что вы уже видели это: Копировать и вставить плитку

Этот код работает на моем симуляторе и выглядит следующим образом:

CGRect drawRect = [self rectFromOrigin:currentSelection inset:TILE_INSET];
[self setNeedsDisplayInRect:drawRect];

UIMenuController *theMenu = [UIMenuController sharedMenuController];
[theMenu setTargetRect:drawRect inView:self];
[theMenu setMenuVisible:YES animated:YES];

Здесь есть несколько отличий:

  • drawRect рассчитывается на основе гигантской плитки вида и вычислений точки касания.
  • setNeedsDisplayInRect вызывается
  • self - это вид на большой экран, вам могут понадобиться координаты экрана вместо локальных координат (вы, вероятно, можете получить это из self.superview)

Я бы попробовал внести эти коррективы, чтобы сначала соответствовать примеру, и посмотреть, какой прогресс я получу.

person slf    schedule 21.01.2010
comment
БИНГО, попробовал каждое из ваших предложений, и победителем стала установка selectionRect = [[super view] frame]. Скоро напишу полный рабочий пример и свяжу его здесь. Спасибо! - person Billy Gray; 21.01.2010
comment
рад слышать, что вы исправили :) - person slf; 21.01.2010
comment
Итак, Билли. Где полный пример? :-) - person amok; 27.08.2010