Я признаю, что уже существует вопрос точно вдоль этих строк здесь на S.O., но это испытывает недостаток в деталях реализации, рабочем ответе, и я хотел бы быть более конкретным, таким образом, я думаю, что новый вопрос в порядке. Очевидно, сообщите мне, неправ ли я, и мы можем попытаться перезапустить поток там.
В основном я хочу скопировать текст в UILabel к области монтажа, когда пользователь удерживает на маркировке. Не трудно, чтобы сделать, честно. Однако я думаю, что лучший способ обеспечить визуальную обратную связь состоит в том, чтобы предложить пользователю с пунктом меню Copy от UIMenuController
.
Согласно разделу Event Handling Руководства по программированию приложения для 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
Так, что еще нужно сделать, чтобы заставить это произойти?
Для тех, которые после вперед и пытающийся сделать это также, необходимо будет также установить 'Взаимодействие с пользователем, Включенное' для маркировки
Править:
Для ясности позвольте мне добавить, что это должно быть подобно небольшому пункту меню [Copy], который появляется по изображению в определенных представлениях iPhone, когда Вы удерживаете на нем.-B
Я скажу заранее у меня нет асвера, но я сделал немного покинул и узнал больше. Я уверен, что вы уже посмотрели на это: 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];
Здесь есть несколько различий:
SetneedsdisplayInRect
называется Self
- это представление большого размера экрана, вам может потребоваться координаты экрана вместо локальных координаров (вы можете получить это от Self.superview) Я бы попытался сделать эти настройки, чтобы сначала соответствовать примеру и посмотреть, какой прогресс это заставляет меня.