Я создаю приложение 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"];
}
}
}