Ma structure de vues:
UITableView
UITableViewCell
UIScrollView
CustomView
UIButton
Le problème est que UIButton ne fonctionne pas quand je le touche . Je le crée avec le code:
btn = [[UIButton alloc] init];
[btn setImage:image forState:UIControlStateNormal];
[btn addTarget:self action:@selector(tileTouchUpInside) forControlEvents:UIControlEventTouchUpInside];
btn.layer.zPosition = 1;
[self addSubview:btn];
J'ai aussi ajouté ceci:
scroll.delaysContentTouches = NO;
scroll.canCancelContentTouches = NO;
Mais mon bouton ne fonctionne pas quand même. Je ne peux pas annuler ni contourner ni définir de délai pour UITableView, car si je le définis, UITableView arrêtera de faire défiler verticalement.
Merci pour toute aide!
Créez une sous-classe de UIScrollview avec
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return NO;
}
Si vous ne recevez pas ce message, définissez:
scrollView.delaysContentTouches = NO;
Le problème tient à la façon dont touchesShouldCancelInContentView
se comporte par défaut: il renvoie NO uniquement si la sous-vue est un UIControl, mais votre bouton est masqué dans le CustomView, ce qui n'est pas le cas.
Entré dans le même scénario. UIScrollView en classe séparée et en ajoutant un bouton via une vue personnalisée. 'NSNotificationCenter' m'a aidé à résoudre le problème . Exemple de code:
-(void)tileTouchUpInside:(id)sender
{
NSDictionary *dict=[NSDictionary dictionaryWithObject:@"index" forKey:@"index"];
[[NSNotificationCenter defaultCenter]postNotificationName:@"Action" object:nil userInfo:dict];
}
Dans la classe contenant la vue de défilement:
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doAction:) name:@"Action" object:nil];
}
-(void)doAction:(NSNotification *) notification
{
NSString* value =[notification.userInfo valueForKey:@"index"];
// .......
}
Activer userInteraction pour la vue de défilement, la vue personnalisée et le bouton.
Je suppose que vous devez définir le cadre du bouton. Par défaut, si vous utilisez la méthode btn = [[UIButton alloc] init];
pour initialiser le bouton, il s'agira de UIButtonTypeCustom
. Définissez également une couleur d’arrière-plan pour le débogage afin de noter où le bouton est réellement placé . Maintenant, pour votre cas, vous devez définir le cadre pour ce bouton comme btn.frame = CGRectMake(0,0,100,100);
Pour UIScrollView interne, implémentez cette méthode de délégation.
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
return ![view isKindOfClass:[UIButton class]];
}
Cela peut fonctionner.
Le cadre de votre CustomView pourrait interférer avec votre UIButton. Se chevauchent-ils? Ajoutez votre bouton au CustomView juste pour tester par [CustomView addSubview:UIButton];
(en utilisant vos valeurs bien sûr). Si cela fonctionne, votre problème est probablement un chevauchement.
Aucune des réponses n'a fonctionné pour moi, parce que mon problème était que le bouton n'était pas visible au moment de la mise en page ou quelque chose du genre ...
RÉPARER:
1) déplacez complètement le bouton de la scrollView
(pour être une sous-vue de la view
principale de VC).
2) sélectionnez la button
et l’élément de votre contentV
vous voulez que votre bouton soit localisé (dans mon cas: après le dernier élément de conventV)
3) ajouter les contraintes nécessaires (dans mon cas: être aligné en bas)
4) Ajoutez le reste des contraintes pour la button
.
5) Profitez.
Ajoutez toutes les sous-vues de CustomView à ScrollView. Et cachez le CustomView. Assurez-vous que CustomView (ContainerView de scrollView) doit également être une sous-vue de scrollView.
Link de Capt.Hook m'a aidé. J'ai utilisé UIGestureRecognizer au lieu de UIButtons.
Autorise UIScrollView et ses sous-vues à répondre à un contact .__ Utilisez-le si vous rencontrez le même problème.