Выдвиньте viewcontroller с правой стороны экрана

Я хочу создать выдвижное меню справа от моего основного контроллера вида. Однако я хочу, чтобы выдвигающееся меню появилось в верхней части основного вида, а не сдвигало его в сторону.

Я посмотрел на ECSlidingViewController 2, и он позволяет выдвигаться с любой стороны, однако выдвигающиеся меню выглядят обрезанными по краям. Это создает эффект перемещения контроллера вида сверху влево или вправо, чтобы показать скрытое меню под ним. Я хочу, чтобы казалось, что скрытое меню выдвигается на главном контроллере и что мы можем видеть его левый край, поэтому контент не обрезается.

Это вообще возможно, и ECSlidingViewController 2 будет работать для этого?

редактировать

Вот что я попробовал:

Чтобы обнаружить касание началось:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    BBAppDelegate *myAppDelegate = (BBAppDelegate*)[UIApplication sharedApplication].delegate;

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];
    NSArray *myViewArray = [[NSBundle mainBundle] loadNibNamed:@"FilterView" owner:self options:nil];
    self.filterView = myViewArray[0];


    [myAppDelegate.window addSubview:self.filterView];

    if (CGRectContainsPoint(self.filterView.frame, touchLocation)) {

        dragging = YES;
        oldX = touchLocation.x;
        oldY = touchLocation.y;
    }
}

А затем перетаскивая:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];

    if (dragging) {

        CGRect frame = self.filterView.frame;
        frame.origin.x = self.filterView.frame.origin.x + touchLocation.x;
        frame.origin.y =  self.filterView.frame.origin.y + touchLocation.y;
        self.filterView.frame = frame;
    }
}

Тем не менее, когда я запускаю касание, filterView заменяет все виды и в любом случае не скользит и не анимирует. Я, хотя это было связано с не предоставлением отправной точки - поэтому я установил self.filterView так:

self.filterView = [[UIView alloc] initWithFrame: CGRectMake (0, 0, 120, 564)];

Однако изменение этих значений не влияет на положение / размер представления при его отображении.

Редактировать 2

Ладно, я запустил новый проект для тестирования, и мне удалось вывести на экран вид, чтобы перемещаться, следуя моим прикосновениям.

я использую UIPanGestureRecognizer

Вот так:

viewDidLoad

- (void)viewDidLoad

{[super viewDidLoad];

NSArray *myViewArray = [[NSBundle mainBundle] loadNibNamed:@"View" owner:self options:nil];
UIView *myView = myViewArray[0];

self.filterView = myView;

self.filterView.frame = CGRectMake(100, 100, 200, 200);

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self
                                                                     action:@selector(dragging:)];
pan.delegate = self;

[self.filterView addGestureRecognizer:pan];


[self.view addSubview:self.filterView];

}

Тогда в методе перетаскивания:

-(void)dragging:(UIPanGestureRecognizer *)gesture
{
    if(gesture.state == UIGestureRecognizerStateBegan)
        {
            NSLog(@"Received a pan gesture");
        self.panCoord = [gesture locationInView:gesture.view];


        }
    CGPoint newCoord = [gesture locationInView:gesture.view];
    float dX = newCoord.x-self.panCoord.x;


    gesture.view.frame = CGRectMake(gesture.view.frame.origin.x+dX, gesture.view.frame.origin.y, gesture.view.frame.size.width, gesture.view.frame.size.height);
}

Это позволяет представлению двигаться только горизонтально.

Почти там - сейчас я пытаюсь понять, как заставить его привязаться к месту, когда пользователь поднимает палец. И как переместить этот вид, когда его начальная позиция находится вне экрана.

Редактировать 3

Итак, я хотел контролировать скорость и скорость просмотра на экране. Если пользователь быстро проведет пальцем, представление перейдет на место с той скоростью, с которой он проводит. Если они медленно проведут, он медленно встанет на место. Однако я также установил самое низкое время - так что, если они занимают много времени - по умолчанию используется минимальная сумма.

Вот код:

{
   float start;
    float end;

    NSDate *methodStart;
    NSDate *methodEnd;

}



-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

methodStart = [NSDate date];

UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:touch.view];

start = location.x;}


-(void)dragging:(UIPanGestureRecognizer *)gesture{

if(gesture.state == UIGestureRecognizerStateBegan)
    {

    self.panCoord = [gesture locationInView:gesture.view];


    }

CGPoint newCoord = [gesture locationInView:gesture.view];
float dX = newCoord.x-self.panCoord.x;





gesture.view.frame = CGRectMake(gesture.view.frame.origin.x+dX, gesture.view.frame.origin.y, gesture.view.frame.size.width, gesture.view.frame.size.height);


if (gesture.state == UIGestureRecognizerStateEnded){

    methodEnd = [NSDate date];
    NSTimeInterval executionTime = [methodEnd timeIntervalSinceDate:methodStart];


    double time = executionTime;

    float distance = start - end;


    int distanceOverTime = distance / time;
    float veloticty = distanceOverTime / 100;

    double miniTimeToUse = 0.5;
    double newMinTime;
    if (time < miniTimeToUse){

        newMinTime =  miniTimeToUse;
    }else {
        newMinTime = time;
    }


    if (gesture.view.frame.origin.x+dX >= 180){

        [UIView animateWithDuration:newMinTime
                              delay:0
             usingSpringWithDamping:0.9
              initialSpringVelocity:veloticty
                            options:0
                         animations:^{

                             self.filterView.frame = CGRectMake(300, 100, 200, 200);

                         } completion:nil];

    }
    if (gesture.view.frame.origin.x+dX <= 181){

    [UIView animateWithDuration:newMinTime
    delay:0
    usingSpringWithDamping:0.9
    initialSpringVelocity:veloticty
    options:0
    animations:^{

        self.filterView.frame = CGRectMake(50, 100, 200, 200);

    } completion:nil];


    }
}

}

Теперь просто чтобы заставить его работать, потянув взгляд со стороны.

0 ответов

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