Ограничение перемещения кнопок (панорамирование и вращение) за пределы экрана - PullRequest
0 голосов
/ 08 мая 2018

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

    // Handling dragging to allow user to place views in the whatever places they want

    for (UIView *allView in self.viewArray) {

        UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc]
                                                        initWithTarget:self
                                                        action:@selector(handlePan:)];

        [allView addGestureRecognizer:panGestureRecognizer];

    }

    // Rotate keyboard view
    for (UIView *allViews in self.viewArray) {
        UIRotationGestureRecognizer *rotate = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationSwitchChanged:)];
        [allViews addGestureRecognizer:rotate];
        NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"appName"];
        CGFloat rotation = [defaults floatForKey:@"rotationAngle"];
        allViews.transform = CGAffineTransformMakeRotation(rotation);
    }
}

- (void) handlePan:(UIPanGestureRecognizer*) sender {

    NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"appName"];
    NSString *_value= [defaults stringForKey:@"stateOfSwitchKeyboardDragging"];
    if([_value compare:@"ON"] == NSOrderedSame){

    CGPoint translatedPoint = [sender translationInView:self.view];

    if(sender.state == UIGestureRecognizerStateBegan)
    {
        firstX = [[sender view] center].x;
        firstY = [[sender view] center].y;
    }
    translatedPoint = CGPointMake(firstX+translatedPoint.x, firstY+translatedPoint.y);

    if ( ( (translatedPoint.x>0) && (translatedPoint.x<self.view.bounds.size.width) ) && ( (translatedPoint.y>0) && (translatedPoint.y<self.view.bounds.size.height) ) )
        [[sender view] setCenter:translatedPoint];
    }
}

- (CGFloat)degreeToRadians:(CGFloat) degree {
    CGFloat radian = degree * (M_PI/180);
    return radian;
}


- (CGFloat)radianToDegree:(CGFloat) radian {
    CGFloat degree = radian * (180/M_PI);
    return degree;
}


- (void) rotationSwitchChanged: (UIRotationGestureRecognizer*) gesture {

    NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"appName"];
    NSString *_value= [defaults stringForKey:@"stateOfSwitchKeyboardRotation"];
    if([_value compare:@"ON"] == NSOrderedSame){

        CGFloat radians = atan2f(gesture.view.transform.b, gesture.view.transform.a);

        CGFloat newRadian = gesture.rotation;

        CGFloat degrees = [self radianToDegree:(radians + newRadian)];

        if ( (degrees<=30) && (degrees>=(-30)) ) {
            for (UIView *rotationView in self.viewArray)
                rotationView.transform = CGAffineTransformMakeRotation(newRadian);
            self.rotationAngle = newRadian;
            [defaults setFloat:self.rotationAngle forKey:@"rotationAngle"];
        }
    }
}

1 Ответ

0 голосов
/ 08 мая 2018

Вы всегда можете узнать местоположение распознавателя жестов, используя приведенный ниже код. Измените соответственно для Objective-C.

let location: CGPoint = gesturerecognizer.location(in: view)

Напишите условие if, чтобы проверить, попадает ли это место за границы или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...