2010-04-22 2 views
7

Я могу получить обработчик UIPinchGestureRecognizer для работы с масштабированием объекта, но я не хочу масштабировать. Я хочу изменить размер. Например, у меня есть UITextView, и я приложил к нему жест UIPinchGestureRecognizer, и если пользовательские щипцы, я хочу изменить ширину текстового изображения в соответствии с пинчем. Я не хочу его масштабировать, поэтому размер UITextView больше (масштабирование).Как использовать масштабирование (UIPinchGestureRecognizer) для изменения ширины UITextView?

+31

Вы не должны нападать на беззащитных UIPinchGestureRecognizers: P –

+0

@KennyTM Ха-ха! Хороший ... –

+2

@ Jongsma Почему бы и нет? Возможно, он первым ударил его! –

ответ

0

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

CGFloat scale = gestureRecognizer.scale; 
CGRect newFrame = textView.frame; 
newFrame.size = CGSizeMake(scale*newFrame.size.width, newFrame.size.height); 
textView.frame = newFrame; 

Или это не то, что вы имеете в виду?

+0

Это не работает. Uitextview растет очень быстро и задерживается. Шкала может быть от 0-20 + –

+0

Нечетная ... Я бы этого не ожидал. Я никогда не использовал распознаватели жестов ... –

+7

Почему бы не удалить этот ответ? –

23

Я делаю то же самое. Я обновлю это сообщение, если найду, как это сделать.

Попробуйте, это работает для меня (для UIView):

- (IBAction)handlePinchGesture:(UIGestureRecognizer *)sender { 
    static CGRect initialBounds; 

    UIView *_view = sender.view; 

    if (sender.state == UIGestureRecognizerStateBegan) 
    { 
     initialBounds = _view.bounds; 
    } 
    CGFloat factor = [(UIPinchGestureRecognizer *)sender scale]; 

    CGAffineTransform zt = CGAffineTransformScale(CGAffineTransformIdentity, factor, factor); 
    _view.bounds = CGRectApplyAffineTransform(initialBounds, zt); 
    return; 
} 
+0

Что действительно помогло мне: _view.bounds = CGRectApplyAffineTransform (initialBounds, zt); Чудесно часами, почему мой размер не изменился. Спасибо большое! – Oritm

+0

много ошибок в этом коде. – user2083364

+0

всегда попадал в ловушку при запуске этого кода ... – HoangNA

0

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

//-------------------------------------------------------------------------------------------------------- 
    // pinchElement 
    // Description: Called to di the element scale, in our case, we are adjusting the length. 
    // 
    //-------------------------------------------------------------------------------------------------------- 

- (void)pinchElement:(CGFloat)scale { 

     //Grab how big we are now 
    CGRect textFieldBounds = textField.bounds; 

     //Multiple the Scale of the Pinch by the Width to get our new width. 
    CGFloat newWidth = textFieldBounds.size.width * scale; 

    CGFloat widthChange = newWidth - textFieldBounds.size.width; 
    CGRect newBounds = CGRectMake(0, 0, newWidth, textFieldBounds.size.height); 

    [textField setBounds: newBounds]; 
    [textField setCenter: CGPointMake(textField.center.x + widthChange/2, textField.center.y)] ; 
    [self contentSizeChanged]; 

} 
    //-------------------------------------------------------------------------------------------------------- 
    // pinchOffScreen 
    // Description: Called to see if the Pinch Gesture will cause element to go off screen Gesture 
    // 
    //-------------------------------------------------------------------------------------------------------- 

- (BOOL)pinchOffScreen:(CGFloat)scale { 

     //Grab how big we are now 
    CGRect textFieldBounds = textField.bounds; 

     //Multiple the Scale of the Pinch by the Width to get our new width. 
    CGFloat newWidth = textFieldBounds.size.width * scale; 


     //Figure out our Change in Width so we can calculate our new Zen Center 
    CGRect newElementBounds = CGRectMake(0, 0, newWidth+ kElementFrameOffset*2 + kElementContentFrameOffset*2, textFieldBounds.size.height + kElementFrameOffset*2 + kElementContentFrameOffset*2); 


     //We want to be sure that we dont size beyond our bounds, find our Parent Origin. 

    CGRect elementBoundsInSuperView = [self convertRect:newElementBounds toView:[self superview]]; 

    CGFloat xPosition = CGRectGetMidX(elementBoundsInSuperView); 
    CGFloat yPosition = CGRectGetMidY(elementBoundsInSuperView); 


    BOOL offScreen = [self calcOffEditorFromXposition:xPosition yPosition:yPosition fromBoundsInSuperView:elementBoundsInSuperView]; 
    return offScreen; 

} 

    //-------------------------------------------------------------------------------------------------------- 
    // handlePinchGesture 
    // Description: Called when we get a Pinch Gesture 
    //     We want to override the default scaling and set the width.    
    // 
    //-------------------------------------------------------------------------------------------------------- 

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer { 
    if (IoUIDebug & IoUIDebugSelectorNames) { 
     NSLog(@"%@ - %@", INTERFACENAME, NSStringFromSelector(_cmd)); 
    } 

     // UIView *element = [gestureRecognizer view]; 

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan) { 

      //We are resizing, Select ourself 



      [self selectSelf]; 
    } 

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) { 

     NSSet *selectedElements = [[(IoScreenEditorViewController *)UIAppDelegate.ioMainViewController.currentViewController editorContentViewController] selectedElements]; 

     BOOL aSelectedElementOffscreen = FALSE; 
     for (IoUIScreenElement* element in selectedElements) { 
      if ([element pinchOffScreen:[gestureRecognizer scale]]) { 
       aSelectedElementOffscreen = TRUE; 
       break; 
      } 
     } 
     if (!aSelectedElementOffscreen) { 

      [self pinchElement:[gestureRecognizer scale]]; 

       // Let others know they are moving if they are selected 
       // Setup our data for the Notification 
      NSMutableDictionary *theUserInfo = [[[NSMutableDictionary alloc] initWithCapacity:1] autorelease]; 
      [theUserInfo setObject:self forKey:@"ElementWithGesture"]; 


      NSNumber * scaleAsNumber = [[NSNumber alloc] initWithFloat:[gestureRecognizer scale]]; 
      [theUserInfo setValue:scaleAsNumber forKey:@"GestureScale"]; 
      [theUserInfo setObject:gestureRecognizer forKey:@"TheGestureRecognizer"]; 
      [scaleAsNumber release]; 
       // Post the Group Rotation Notification. 
      [[NSNotificationCenter defaultCenter] postNotificationName:kNCSEGroupPinchGesture 
                   object:nil 
                   userInfo:theUserInfo];  
     } 
     [gestureRecognizer setScale:1]; 
    } 
    if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) { 


    } 


} 



    //-------------------------------------------------------------------------------------------------------- 
    //  groupHandlePinchGesture: 
    // Description: For a groupPinch Notification. Move it! within bounds of course 
    // 
    //-------------------------------------------------------------------------------------------------------- 

- (void) groupHandlePinchGesture:(NSNotification*)notification{ 

    if (IoUIDebug & IoUIDebugSelectorNames) { 
     NSLog(@"%@ - %@", INTERFACENAME, NSStringFromSelector(_cmd)); 
    } 

    IoUIScreenElement *element = (IoUIScreenElement *) [[notification userInfo] objectForKey:@"ElementWithGesture"]; 
     //UIRotationGestureRecognizer *gestureRecognizer = (UIRotationGestureRecognizer *) [[notification userInfo] objectForKey:@"TheGestureRecognizer"]; 

    NSNumber *scaleAsNumber = [[notification userInfo] valueForKey:@"GestureScale"]; 
    CGFloat scale = [scaleAsNumber floatValue]; 


    if (IOFNOTEQUAL(self, element) & [self isSelected]){ 
     [self pinchElement: scale]; 
    } 

} 
2

Вы должны использовать в скор:

func pinchgsterAction(gesture:UIPinchGestureRecognizer){ 
    if (gesture.state == UIGestureRecognizerState.Changed) { 
     let scale:CGFloat = gesture.scale 
     gesture.view.transform = CGAffineTransformScale(gesture.view.transform, scale, scale) 

    } 
    }