Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

Zamiana pozycji dwóch UIView


  • Zaloguj się, aby dodać odpowiedź
8 odpowiedzi w tym temacie

#1 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

Napisano 28 sierpnia 2014 - 17:39

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.

#2 wojtkow

wojtkow


  • 6 767 postów
  • Płeć:
  • SkądPoznań

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 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

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 Paweł Pałka

Paweł Pałka
  • 34 postów
  • SkądKatowice, Poland, Poland

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_*

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 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

Napisano 03 września 2014 - 20:31

Zrobiłem ci przykład o ile dobrze to zrozumiałem, jakby co pisz

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 widok

#7 Gość_oneghost_*

Gość_oneghost_*

Napisano 04 września 2014 - 08:37

Wywołaj na widoku który ma wyjść na gore [view.superview bringSubviewToFront:view]

#8 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

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 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

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: 0

0 użytkowników, 0 gości, 0 anonimowych