Сохранение позиции каждой кнопки в массиве после перетаскивания
Мне нужна серьезная помощь. Я создаю приложение клавиатуры в задаче c, и одна из функций, которые у меня есть, заключается в том, чтобы перетаскивать кнопки клавиатуры вокруг экрана клавиатуры, чтобы пользователь мог разместить их в любом месте. Но моя проблема в том, что я не могу понять, как сохранить каждую позицию кнопки после перетаскивания, чтобы при выключении и включении всех кнопок клавиатуры находились в том же месте, где пользователь их размещал раньше.
Мой код в соответствии с ниже:
Это на мой взгляд DidLoad:
for (UIButton *button in self.allButtonsArray) {
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc]
initWithTarget:self
action:@selector(handlePanGestureButtons:)];
[button addGestureRecognizer:panGestureRecognizer];
}
Способ обращения с кастрюлей:
(void) handlePanGestureButtons:(UIPanGestureRecognizer *)gesture {
NSString *_valueOfDragging= [defaults stringForKey:@"stateOfSwitchButtonDragging"];
if([_valueOfDragging compare:@"ON"] == NSOrderedSame){
if (gesture.state==UIGestureRecognizerStateChanged || gesture.state == UIGestureRecognizerStateEnded){
UIView *superview = gesture.view.superview;
CGSize superviewSize = superview.bounds.size;
CGSize thisSize = gesture.view.frame.size;
CGPoint translation = [gesture translationInView:self.view];
CGPoint center = CGPointMake(gesture.view.center.x + translation.x,
gesture.view.center.y + translation.y);
CGPoint resetTranslation = CGPointMake(translation.x, translation.y);
if(center.x - thisSize.width/2 < 0)
center.x = thisSize.width/2;
else if (center.x + thisSize.width/2 > superviewSize.width)
center.x = superviewSize.width-thisSize.width/2;
else
resetTranslation.x = 0;
if(center.y - thisSize.height/2 < 0)
center.y = thisSize.height/2;
else if(center.y + thisSize.height/2 > superviewSize.height)
center.y = superviewSize.height-thisSize.height/2;
else
resetTranslation.y = 0; //Only reset the vertical translation if the view *did* translate vertically
gesture.view.center = center;
[gesture setTranslation:CGPointMake(0, 0) inView:self.view];
}
}
1 ответ
Вы можете хранить все свои координаты в NSUserDefaults
, который вы можете получить доступ снова, когда вы открываете свое приложение. Поскольку координаты CGPoint
значения, вам нужно сначала преобразовать их в строковые объекты, используя NSStringFromCGPoint
, Затем вы можете создать массив с координатами для всех ваших кнопок и записать их по умолчанию. Чтобы иметь возможность идентифицировать каждую кнопку, вы можете создать массив структур, например:
struct KeyCoordinate {
NSString *keyIdentifier;
NSString *keyCoordinate;
}
struct KeyCoordinate keyCoordinate1;
struct KeyCoordinate keyCoordinate2;
keyCoordinate1.keyIdentifier = @"key1"
keyCoordinate1.keyCoordinate = NSStringFromCGPoint(key1Point);
keyCoordinate2.keyIdentifier = @"key2"
keyCoordinate2.keyCoordinate = NSStringFromCGPoint(key2Point);
NSArray *buttonCoordinatesArray = @[keyCoordinate1, keyCoordinate2, ...];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// write:
[userDefaults setObject: buttonCoordinatesArray forKey: @"buttonCoordinatesArray"];
// read:
NSArray *buttonCoordinatesArray = [userDefaults objectForKey: @"buttonCoordinatesArray"];
Чтобы вернуться от строк к точкам, используйте CGPointFromString
,
В качестве альтернативы вы можете хранить точки как NSValue
в вашей структуре, но идея остается прежней.