Реализация элементов управления копирования / вставки iphone в подклассе view / uiview - PullRequest
7 голосов
/ 21 января 2010

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

По сути, я хочу скопировать текст в 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

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

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

Edit:

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

1 Ответ

7 голосов
/ 21 января 2010

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

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

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)

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

...