Я могу получить обработчик UIPinchGestureRecognizer
для работы с масштабированием объекта, но я не хочу масштабировать. Я хочу изменить размер. Например, у меня есть UITextView
, и я приложил к нему жест UIPinchGestureRecognizer
, и если пользовательские щипцы, я хочу изменить ширину текстового изображения в соответствии с пинчем. Я не хочу его масштабировать, поэтому размер UITextView
больше (масштабирование).Как использовать масштабирование (UIPinchGestureRecognizer) для изменения ширины UITextView?
ответ
Я думаю, что вы хотите сделать, это просто умножив ширину кадра вашего TextView с масштабом жеста распознаватель в:
CGFloat scale = gestureRecognizer.scale;
CGRect newFrame = textView.frame;
newFrame.size = CGSizeMake(scale*newFrame.size.width, newFrame.size.height);
textView.frame = newFrame;
Или это не то, что вы имеете в виду?
Это не работает. Uitextview растет очень быстро и задерживается. Шкала может быть от 0-20 + –
Нечетная ... Я бы этого не ожидал. Я никогда не использовал распознаватели жестов ... –
Почему бы не удалить этот ответ? –
Я делаю то же самое. Я обновлю это сообщение, если найду, как это сделать.
Попробуйте, это работает для меня (для 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;
}
Что действительно помогло мне: _view.bounds = CGRectApplyAffineTransform (initialBounds, zt); Чудесно часами, почему мой размер не изменился. Спасибо большое! – Oritm
много ошибок в этом коде. – user2083364
всегда попадал в ловушку при запуске этого кода ... – HoangNA
У меня есть четыре процедуры, которые имеют дело с защемлением текстового поля. Устройство распознавания жестов является основной рутиной. Он видит, будут ли выделенные текстовые поля помечены на экране, я не хочу этого. Если это не так, я скажу, что это прижимается к шкале от жеста. Если есть несколько выбранных, я отправляю уведомление для тех, кто не будет зажимать экран, чтобы зажать.
//--------------------------------------------------------------------------------------------------------
// 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];
}
}
Вы должны использовать в скор:
func pinchgsterAction(gesture:UIPinchGestureRecognizer){
if (gesture.state == UIGestureRecognizerState.Changed) {
let scale:CGFloat = gesture.scale
gesture.view.transform = CGAffineTransformScale(gesture.view.transform, scale, scale)
}
}
Вы не должны нападать на беззащитных UIPinchGestureRecognizers: P –
@KennyTM Ха-ха! Хороший ... –
@ Jongsma Почему бы и нет? Возможно, он первым ударил его! –