2016-01-13 4 views
0

Как остановить перемещение UIView? Или вид замедленного действия.Как остановить перемещение UIView?

Проблема заключается в том, например:

У меня есть метод, изменяя положение взгляда на события щелчка кнопки; в то же время другое событие перетаскивания может изменить положение представления. Если я сначала позвоню событию перетаскивания, тогда, когда вид замедляется, быстро нажмите «В», позиция «Вид» изменится в соответствии с методом, стоящим за В, но он немедленно вернется туда, где он замедлялся, и продолжает замедляться. Вид не вернется туда, где кнопка B указывает, что он заканчивает торможение.

Код выглядит следующим образом.

Сначала я использую KVO, чтобы представление (то есть _topView - это код) отвечает на contentOffset таблицыView (при перетаскивании таблицыView View будет перемещаться).

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary<NSString *,id> *)change context:(void *)context 

{ 
    CGPoint contentOffset = [change[NSKeyValueChangeNewKey] CGPointValue]; 

    CGRect topFrame = _topView.frame; 

    topFrame.origin.y = -(contentOffset.y + TOP_SECTION_HEIGHT); 
    _topView.frame = topFrame; 
} 

Затем, нажав кнопку B, будет запущена анимация внизу.

topFrame = CGRectMakke(...); 
[UIView animateWithDuration:1 animations:^{ 
     _topView.frame = topFrame;//topView 
     targetTableView.contentOffset = targetViewTargetOffset; 
    }]; 
+2

Показать код перемещения «UIView'». – Raptor

+1

KVO - отличный способ для просмотра видов. Почему бы вам не просто оживить все вместе в блоке анимации? – SmokeDispenser

+0

@JanGreve, потому что мне нужно сделать перемещение View вместе с tableView, даже последнее замедляет – WhiteTherewasproblem

ответ

0

Как я понимаю, вы должны остановить замедление таблицы, а затем вызвать метод для события кнопки. , чтобы остановить торможение при нажатии кнопки:

-(IBAction)buttonPressed:(id)sender 
{ 
    //this will stop table view animations 
    [targetTableView setContentOffset:targetTableView.contentOffset animated:NO]; 
    //then you can adjust the frame of a view accurately 
    topFrame = CGRectMakke(...); 
[UIView animateWithDuration:1 animations:^{ 
     _topView.frame = topFrame;//topView 
     targetTableView.contentOffset = targetViewTargetOffset; 
    }]; 
} 
+0

Спасибо, что решил мою проблему.Кстати, другой способ - отказаться от KVO, так как это код не выполняется, tableView движется или замедляется. – WhiteTherewasproblem

0

Попробуйте этот код будет полезно для вас .:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationDuration:0.1]; 
[UIView setAnimationCurve: UIViewAnimationCurveLinear]; 
// other animation properties 

// set view properties 

[UIView commitAnimations]; 
0

Почему ваш взгляд движется?

Дело в том, что если это просто эстетическая анимация, вы можете создать копию своего вида с помощью -snapshotViewAfterScreenUpdates:, скрыть исходный вид и перенести этот снимок поверх всех, а затем удалить снимок и перенести исходный вид на конечная позиция анимации. Это немного дорогостоящая память/батарея, но ваша анимация полностью не зависит от вашего кода KVO.

Если это более важный компонент, с более сильными взаимодействиями, вы должны добавить в свой KVO флаг (например: isAnimated), чтобы предотвратить изменение позиции при запуске анимации.

Как сказал @Fogmeister, KVO не лучший для анимации, даже больше с просмотром прокрутки, поскольку у них есть делегат для этого (scrollviewDidScroll).

Смежные вопросы