2013-05-20 13 views
17

Moja struktura poglądów:UIButton nie działa, gdy w UIScrollView

UITableView 
    UITableViewCell 
    UIScrollView 
     CustomView 
     UIButton 

Problemem jest UIButton nie działa, kiedy go dotknąć. tworzę go z kodem:

btn = [[UIButton alloc] init]; 
[btn setImage:image forState:UIControlStateNormal]; 
[btn addTarget:self action:@selector(tileTouchUpInside) forControlEvents:UIControlEventTouchUpInside]; 
btn.layer.zPosition = 1; 
[self addSubview:btn]; 

Ja również dodać to:

scroll.delaysContentTouches = NO; 
scroll.canCancelContentTouches = NO; 

Ale mój przycisk nie działa tak. Nie mogę anulowaćContentTouches lub ustawić opóźnienie dla UITableView, ponieważ jeśli to ustawię, UITableView przestanie przewijać w pionie.

Dzięki za pomoc!

+0

czy zaimplementowano metodę 'tileTouchUpInside'? –

+2

Czy userInteractionEnabled YES dla CustomView? –

+0

@AhmedZ. - Pewnie – George

Odpowiedz

19

utworzyć podklasę UIScrollView z

- (BOOL)touchesShouldCancelInContentView:(UIView *)view { 
    return NO; 
} 

Jeśli nie otrzymujesz tej wiadomości, ustaw:

scrollView.delaysContentTouches = NO; 

Problem polega na tym ze względu na sposób touchesShouldCancelInContentView zachowuje się domyślnie, że nie zwraca tylko jeśli podgląd jest kontrolerem UIC, ale twój przycisk jest ukryty wewnątrz CustomView, który nie jest.

+3

Możesz również zmienić opcja "Opóźnienia zawartości" w IB. To mi się udało. – jowie

+4

Widok przewijania zatrzymał się przewijanie – Yaman

3

Chyba trzeba ustawić ramkę przycisku. Domyślnie, jeśli używasz metody btn = [[UIButton alloc] init]; do inicjalizacji, będzie to UIButtonTypeCustom. Ustaw także kolor tła dla celów debugowania, aby zanotować, gdzie przycisk jest rzeczywiście umieszczony. Teraz dla swojej sprawy musisz ustawić ramkę dla tego przycisku, jak btn.frame = CGRectMake(0,0,100,100);

Dla wewnętrznej UIScrollView implementuj tę metodę delegata.

- (BOOL)touchesShouldCancelInContentView:(UIView *)view 
    { 
     return ![view isKindOfClass:[UIButton class]]; 
    } 

To może działać.

+0

Dzięki, ustawiłem ramkę przycisku, po prostu nie powiedziałem o tym w kodzie. – George

2

Twoja ramka CustomView może zakłócać działanie Twojego Uibutton. Czy nakładają się na siebie? Dodaj swój przycisk do CustomView tylko do przetestowania przez [CustomView addSubview:UIButton]; (używając swoich wartości oczywiście). Jeśli to działa, najprawdopodobniej Twój problem się nakłada.

+0

Dzięki za pomysł. Ale kiedy po prostu dodaję mój CustomView do ViewController, z przewijaniem, działa idealnie. Przestaje działać po umieszczeniu w przewijanym widoku. – George

+0

Jeśli chcesz tylko dodać przycisk do wyświetlenia tabeli, spójrz na ten poprzedni wpis ... http://stackoverflow.com/questions/10229597/adding-uibutton-to-uitableview-cells – sangony

4

Przyszedł w tym samym scenariuszu. UIScrollView w oddzielnej klasie i dodawanie przycisku poprzez niestandardowy widok. "NSNotificationCenter" pomógł mi rozwiązać problem. Przykładowy kod:

-(void)tileTouchUpInside:(id)sender 
{  
    NSDictionary *dict=[NSDictionary dictionaryWithObject:@"index" forKey:@"index"]; 

    [[NSNotificationCenter defaultCenter]postNotificationName:@"Action" object:nil userInfo:dict]; 
} 

W klasie zawierającej przewijania Widok:

- (void)viewDidLoad 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doAction:) name:@"Action" object:nil]; 
} 
-(void)doAction:(NSNotification *) notification 
{ 
    NSString* value =[notification.userInfo valueForKey:@"index"]; 
    // ....... 
} 

Włącz userInteraction dla widoku przewijania, niestandardowego widoku i przycisk.

-1

miałem ten sam problem & samą hierarchię widoków, Z najnowszego SDK, wystarczy użyć go:

Ustawianie delaysContentTouches na NIE dla UIButton w tym samym UITableViewCell.

self.tableView.delaysContentTouches = NO 
+0

To nie działa dla mnie –

0

Dodaj wszystkie subviews z CustomView do ScrollView. I ukryj CustomView. Upewnij się, że CustomView (ContainerView of scrollView) również powinien być subView of scrollView.