Stworzyłem sobie klasę dziedziczącą po UIView i w niej metody odpowiedzialne za drag&drop to działa dobrze. Teraz dodaje kilka takich widoków do głównego widoku aplikacji, chcę aby po przeciągnięciu jednego widoku na drugi zamieniały się miejscami.
Zamiana pozycji dwóch UIView
Rozpoczęty przez
macQUB
, 28 sie 2014 17:39
8 odpowiedzi w tym temacie
#1
Napisano 28 sierpnia 2014 - 17:39
#2
Napisano 28 sierpnia 2014 - 21:21
No i? Bo chyba zapomniałeś pytania.
BTW: to jest forum Q&A a nie "zrób to za mnie".
#3
Napisano 29 sierpnia 2014 - 09:52
Wybacz poszukuję biblioteki która to załatwi. Jak wykryć jaki widok jest zaraz pod przesuwanym widokiem, chodzi mi tylko o wskazówki i nie oczekuje że ktoś inny za mnie to zrobi. Dzięki
#4
Napisano 01 września 2014 - 17:46
hmm ciekawe, sprawdzanie UIGesture w którym miejscu jest, a następnie sprawdzenie czy framy views zawierają ten punkt. Tak na szybko myślę.
Jest sobie taka metoda CGRectContainsPoint(rect, point); plus rekurencyjna metoda która zwróci wszystkie podwidoki (uwagą, może być ich dużo) . Możesz też otagować te widoko (tag > 10 !) i będziesz wiedział które to.
Pewnie ktoś coś innego wymyśli bardziej pro.
#5 Gość_oneghost_*
Napisano 01 września 2014 - 18:16
Zrobiłem ci przykład o ile dobrze to zrozumiałem, jakby co pisz
// // ViewController.m // ExchangeObjects // // Created by Damian Dudycz on 01.09.2014. // Copyright (c) 2014 MobiTouch. All rights reserved. // #import "ViewController.h" @interface ViewController () { CGPoint startPoint; CGRect startFrame; NSArray *objectsViews; } @end @implementation ViewController - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Wygeneruj 3 kwadraty w losowych miejscach. const CGFloat viewSize = 100; const CGFloat maxX = CGRectGetWidth(self.view.bounds) - viewSize; const CGFloat maxY = CGRectGetHeight(self.view.bounds) - viewSize; NSMutableArray *newObjectsViews = [NSMutableArray arrayWithCapacity:3]; for (int i = 0; i < 3; ++i) { UIView *view = [[UIView alloc] initWithFrame:CGRectMake(arc4random() % (int)maxX, arc4random() % (int)maxY, viewSize, viewSize)]; view.backgroundColor = [UIColor colorWithRed:arc4random() % 255 / 255.0f green:arc4random() % 255 / 255.0f blue:arc4random() % 255 / 255.0f alpha:1]; [self.view addSubview:view]; UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panningView:)]; [view addGestureRecognizer:panGestureRecognizer]; [newObjectsViews addObject:view]; } objectsViews = newObjectsViews; } - (void)panningView:(UIPanGestureRecognizer *)panGestureRecognizer { if (panGestureRecognizer.state == UIGestureRecognizerStateBegan) { // Po rozpoczęciu przeciągania zapamiętaj punkt zaczepienia startPoint = [panGestureRecognizer locationInView:panGestureRecognizer.view]; startFrame = panGestureRecognizer.view.frame; } else if (panGestureRecognizer.state == UIGestureRecognizerStateChanged) { CGPoint newPoint = [panGestureRecognizer locationInView:panGestureRecognizer.view.superview]; CGPoint newPositionPoint = CGPointMake(newPoint.x - startPoint.x, newPoint.y - startPoint.y); panGestureRecognizer.view.frame = CGRectMake(newPositionPoint.x, newPositionPoint.y, CGRectGetWidth(panGestureRecognizer.view.bounds), CGRectGetHeight(panGestureRecognizer.view.bounds)); } else if (panGestureRecognizer.state == UIGestureRecognizerStateEnded) { // Sprawdź czy widok koliduje z innym for (UIView *otherView in objectsViews) { if (otherView == panGestureRecognizer.view) { continue; } if (CGRectIntersectsRect(panGestureRecognizer.view.frame, otherView.frame)) { [UIView animateWithDuration:0.5f animations:^{ panGestureRecognizer.view.frame = otherView.frame; otherView.frame = startFrame; }]; break; } } } } @end
#6
Napisano 03 września 2014 - 20:31
Twój kod raczej nie obejmuję Z-indexu, a jak są widoki dwa nałożone na siebie to znaczy widać jednego w połowie to chcę aby nowy widok wsunął się na miejsce starego, próbowałem z view.layer.zPosition ale nie chowa się pod widok z pod którego wyciągnąłem stary widokZrobiłem ci przykład o ile dobrze to zrozumiałem, jakby co pisz
#7 Gość_oneghost_*
Napisano 04 września 2014 - 08:37
Wywołaj na widoku który ma wyjść na gore
[view.superview bringSubviewToFront:view]
#8
Napisano 04 września 2014 - 09:13
To spowoduje wyciągnięcie widoku na samą górę, a nie zamienienie index-ów bardziej chodzi mi o coś takiego
[self.view exchangeSubviewAtIndex:[[self.view subviews] indexOfObject:view1] withSubviewAtIndex:[[self.view subviews] indexOfObject:view2]];
#9
Napisano 04 września 2014 - 10:35
Dobra zrobione w ten sposób co podałem. Czy istnieje możliwość detekcji kilku możliwych tapnięć na 1 widoku tzn. kliknięcie 2 razy coś robi kliknięcie 3 razy robi co innego?
Użytkownicy przeglądający ten temat: 2
0 użytkowników, 2 gości, 0 anonimowych