Сохранение позиции каждой кнопки в массиве после перетаскивания - PullRequest
0 голосов
/ 27 августа 2018

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

0 голосов
/ 27 августа 2018

Вы можете сохранить все свои координаты в 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 в вашей структуре, но идея остается прежней.

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