Сохранение позиции каждой кнопки в массиве после перетаскивания

Мне нужна серьезная помощь. Я создаю приложение клавиатуры в задаче 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 в вашей структуре, но идея остается прежней.

Другие вопросы по тегам