Выдвиньте 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];
}
}
}
Теперь просто чтобы заставить его работать, потянув взгляд со стороны.