How can I use pinch zoom(UIPinchGestureRecognizer) to change width of a UITextView?

后端 未结 4 1569
陌清茗
陌清茗 2020-12-25 09:52

I can get the UIPinchGestureRecognizer handler to work with scaling an object but I don\'t want to scale I want to change the size. For example I have a

相关标签:
4条回答
  • 2020-12-25 10:28

    I am doing the very same thing. I will update this post if I found how to do it.

    Try this, it work for me (for 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 讨论(0)
  • 2020-12-25 10:40

    I think what you want to do is just multiplying the width of your textView's frame with the gesture recognizer's scale:

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

    Or isn't this what you mean?

    0 讨论(0)
  • 2020-12-25 10:41

    I have four routines that deal with pinching of a text field. The gesture recognizer is the core routine. It sees if the selected text field(s) are going to be Pinched off the Screen, I don't want that. If they are not, then I tell it to pinch itself with the scale from the gesture. If there are multiple selected I send a Notification for those that won't pinch off screen to Pinch themselves.

        //--------------------------------------------------------------------------------------------------------
        //    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];
        }
    
    }
    
    0 讨论(0)
  • 2020-12-25 10:46

    You have to use in swift:

       func pinchgsterAction(gesture:UIPinchGestureRecognizer){
         if (gesture.state == UIGestureRecognizerState.Changed) {
             let scale:CGFloat = gesture.scale
             gesture.view.transform = CGAffineTransformScale(gesture.view.transform, scale, scale)
    
         }
      }
    
    0 讨论(0)
提交回复
热议问题