2013-08-25 2 views
6

Rozumiem, że tytuł jest nieco mylący, więc postaram się jak najlepiej wyjaśnić to dobrze. Mam UIView, który ma stałą szerokość równą 100, i zmienną wysokość, która zaczyna się od 0. Co chcę zrobić, to przeciągnąć palec z podstawy UIView, w kierunku górnej części ekranu i UIView zmienia jego wysokość/rozciąga się do pozycji mojego palca. Jeśli to wciąż jest skomplikowane, wyobraź sobie, że jest to pasek papieru wyciągnięty spod czegoś.Zmiana wysokości UIView w odpowiedzi na przeciągnięcie palcem

Jeśli możesz pomóc, to byłoby naprawdę świetnie. Nie sądzę, że powinno to być zbyt trudne, ale jestem dopiero początkującym i mogę zrozumieć, jeśli nie wyjaśniłem tego dobrze!

+0

Uczyniłbym widok zawsze pełną wysokością, ale w widoku miałbym CALayera, który zmienia wysokość. –

+0

Jak mam to zrobić? – user2397282

+0

Czy przyjrzałeś się rozpoznawaczom gestów? – Wain

Odpowiedz

9

Powinno to być proste dzięki UIPanGestureRecognizer i małej matematyce. Aby zmienić widok do właściwej ramki (używam nazwy _viewToChange, więc zastąpi że z widoku później), wystarczy dodać:

UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; 
pan.maximumNumberOfTouches = pan.minimumNumberOfTouches = 1; 
[self addGestureRecognizer:pan]; 

do sposobu init dla super widzenia i określić sposób:

- (void)pan:(UIPanGestureRecognizer *)aPan; { 
    CGPoint currentPoint = [aPan locationInView:self]; 

    [UIView animateWithDuration:0.01f 
        animations:^{ 
        CGRect oldFrame = _viewToChange.frame; 
        _viewToChange.frame = CGRectMake(oldFrame.origin.x, currentPoint.y, oldFrame.size.width, ([UIScreen mainScreen].bounds.size.height - currentPoint.y)); 
        }]; 
} 

To powinno animować widok w górę, gdy porusza się palec użytkownika. Mam nadzieję, że pomaga!

+0

To działa, dziękuję! Czy wiesz, w jaki sposób mogę dodać maksimum i min do wysokości widoku? – user2397282

+0

Istnieje również inny niewielki problem. Kod działa, ale działa bez względu na to, gdzie dotkniesz ekranu. To trochę problem, ponieważ będę miał 3 z nich. Czy istnieje sposób, aby zmienić to ustawienie, aby działało tylko dla określonego widoku, gdy go dotykasz? – user2397282

+0

A max i min są dość łatwe. Zauważ, że liczy się tylko 'currentPoint.y'. Upewniając się, że 'currentPoint.y' znajduje się w pewnym przedziale czasu (używając funkcji' MAX' i 'MIN'), uzyskasz pożądany rezultat. Jeśli chodzi o widok, który ma zostać wybrany, wystarczy spojrzeć na 'currentPoint.x' i ustalić, gdzie on się znajduje. Jeśli jest po lewej stronie (mniej niż 1/3 szerokości ekranu), skorzystaj z pierwszego widoku. Jeśli jest w środku, użyj drugiego widoku, itd. – msgambel