2015-04-19 3 views
1

Я пытаюсь сделать UIView, который может иметь подобное поведение, такое как центр управления iOS. Мой текущий код способен делать подтягивание, чтобы показать и спрятаться, чтобы спрятаться.UIView Bouncing как iOS Control Center

#define kViewMaxHeight 600 
#define kViewMinHeight 300 
#define kViewWidth [[UIScreen mainScreen] bounds].size.width 
#define kViewDefaultX 0 
#define kScreenHeight [[UIScreen mainScreen] bounds].size.height 

- (void)swipeView:(id)sender { 
CGPoint location = [(UIPanGestureRecognizer *)sender locationInView:self]; 
CGPoint translatedPoint = [(UIPanGestureRecognizer *)sender translationInView:self]; 
CGPoint velocity = [(UIPanGestureRecognizer *)sender velocityInView:self]; 
NSLog(@"x:%.2f, y:%.2f", location.x, location.y); 
if([(UIPanGestureRecognizer *)sender state] == UIGestureRecognizerStateBegan) { 

    firstX = [self center].x; 
    firstY = [self center].y; 
} 

translatedPoint = CGPointMake(firstX, firstY+translatedPoint.y); 

// Dragged Up 
if (velocity.y < 0) { 
    if (self.frame.origin.y + self.frame.size.height > kScreenHeight) { 
     [self setCenter:translatedPoint]; 
    } 
    else { 

    } 
} 
// Dragged Down 
else { 
    [self setCenter:translatedPoint]; 
} 

// 
if (self.frame.origin.y + self.frame.size.height < kScreenHeight) { 
    CGRect frame = self.frame; 
    frame.origin.y = kScreenHeight - kViewMinHeight; 
    self.frame = frame; 
} 

if ([(UIPanGestureRecognizer *)sender state] == UIGestureRecognizerStateEnded) { 

    if (velocity.y < 0 || location.y < 0) { 
     CGRect frame = self.frame; 
     frame.origin.y = kScreenHeight - kViewMinHeight; 
     self.frame = frame; 
    } 
    else { 
     CGRect frame = self.frame; 
     frame.origin.y = kScreenHeight - 50; 
     frame.size.height = kViewMinHeight; 
     self.frame = frame; 
    } 
} 
} 

Демо: My Program iOS Control Centre

Вопрос 1: Может кто-нибудь дать несколько примеров, или руководство, как я могу добиться этого?

Вопрос 2 (Какой-то глупый вопрос здесь): Как реализован iOS Control Center? Используется ли UIViewController или UIView?

+0

Центр управления является, скорее всего, ни UIView, ни UIViewController, это, вероятно, просто зашиты в IOS –

ответ

0

Попробуйте использовать UIGravityBehavior и UICollisionBehavior. Когда пользователь подтягивает панель, добавьте ее в столкновение, и когда они вытащит ее, выключите поведение столкновения.

0

Вы можете добиться движения, используя анимацию UIView с пружиной. Отрегулируйте значения для продолжительности, коэффициента демпфирования, скорости и увеличения center.y, пока не найдете нужную комбинацию. Здесь должен быть хороший старт для вас:

// sliding up 
    UIView.animate(withDuration: 0.5, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 10.0, options: .curveEaseOut, animations: { 
    // Assuming self is the view 
    self.center.y += 50 
    } 

// sliding down, subtract the value for center.y 
    UIView.animate(withDuration: 0.5, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 10.0, options: .curveEaseOut, animations: { 
    // Assuming self is the view 
    self.center.y -= 50 
    } 

Дополнительные твики, проверить компонент I упаковали здесь: https://github.com/narumolp/NMPAnchorOverlayView