2010-01-21 12 views
6

Devo ammettere che esiste già una domanda esattamente in questo senso qui su SO, ma manca di dettagli di implementazione, una risposta operativa e vorrei essere più specifico, quindi penso che una nuova domanda è in ordine. Ovviamente, fammi sapere se ho torto e possiamo provare a restart the thread over there.Implementazione dei controlli copia/incolla di iphone in una sottoclasse di visualizzazione personalizzata/uiview

Fondamentalmente, voglio copiare il testo in una UILabel sul tavolo di montaggio quando un utente tiene giù l'etichetta. Non è difficile da fare, onestamente. Tuttavia, ritengo che il modo migliore per fornire feedback visivo sia quello di richiedere all'utente l'opzione di menu Copia da UIMenuController.

In base alla sezione Gestione eventi della Guida alla programmazione dell'applicazione iPhone, in particolare la sezione su Copy, Cut, and Paste Operations, dovrebbe essere possibile fornire operazioni di copia, incolla e/o incolla da una vista personalizzata.

Quindi, ho sottoclassato UILabel con la seguente implementazione come descritto dalla guida, ma UIMenuController non verrà visualizzato. Non c'è alcuna indicazione nella guida che non c'è niente altro necessario per fare questo, e la dichiarazione NSLog si stampa fuori alla console, che indica che è in corso il selettore quando tengo premuto sull'etichetta:

// 
// 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 

Quindi, cos'altro si deve fare per farlo accadere?

Per quelli seguendo lungo e cercando di fare anche questo, avrete anche bisogno di impostare 'Interazione Utente Abilitato' per l'etichetta

Edit:

Per chiarezza, Lasciatemi aggiungere che questo dovrebbe essere simile alla piccola voce di menu [Copia] che appare su un'immagine in certe viste iphone quando si tiene premuto su di essa. -B

+1

Una volta che ho funzionato, ho messo insieme un tutorial e un esempio di progetto su Mobile Orchard: http://www.mobileorchard.com/hold-and-copy-in-uikit/ –

+0

Tutorial è esattamente ciò di cui avevo bisogno, ma hai dimenticato di aggiungere il codice dei metodi "reset". Grazie! – AlBeebe

risposta

6

Dirò in anticipo che non ho una risposta, ma ho fatto un po 'di curiosità e ho scoperto di più. Sono sicuro che hai guardato questo già: CopyPasteTile

Quel codice funziona sul mio simulatore e va in questo modo:

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]; 

Ci sono alcune differenze qui:

  • drawRect è calcolata da una gigantesca tessera e da un tap point
  • setNeedsDisplayInRect
  • self è un grande schermo vista dimensioni, potrebbe essere necessario coordinate schermo invece di coordinate locali (probabilmente si può ottenere che da self.superview)

mi piacerebbe provare a fare queste regolazioni per soddisfare l'esempio prima e vedere che tipo di progressi mi prende

+0

aaahhh, interessante! gli darò uno scatto, grazie ;-) –

+0

BINGO, ha provato ognuno dei tuoi suggerimenti, e il vincitore stava impostando il 'selectionRect = [[super view] frame]'. Scriverà un esempio operativo completo e collegherà il modulo qui a breve. Grazie! –

+0

felice di averti sentito riparare :) – slf

Problemi correlati