web-dev-qa-db-fra.com

UITextView scrollEnabled = YES ne fonctionne pas après que set scrollEnabled = NO dans iOS8

Je crée une démo pour vérifier UITextView scrollEnabled. Il ne contient que 1 UITextView et 2 boutons activer et désactiver le défilement

  • Je teste sur le simulateur et le périphérique iOS 8, si je clique sur le bouton de défilement désactivé, la UITextView désactive le défilement correctement, mais après cela, je Clique sur activer le défilement, la UITextView non activer faire défiler 

  • Cependant, je teste sur le périphérique iOS9, l'activation et la désactivation du défilement fonctionnent bien.

    #import "ViewController.h"
    
    @interface ViewController ()
    
        @property (weak, nonatomic) IBOutlet UITextView *myTextView;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    - (IBAction)enableScrollButtonPressed:(id)sender{
        self.myTextView.scrollEnabled = YES;
    }
    
    - (IBAction)disableScrollButtonPressed:(id)sender{
        self.myTextView.scrollEnabled = NO;
    }
    
    @end
    

Une idée pour résoudre ce problème? Si quelqu'un ne comprend pas mon explication, veuillez vérifier mon projet de démonstration
Toute aide ou suggestion serait la bienvenue

21
Linh

Le problème est que dans iOS 8, contentSize n'est pas ajusté correctement lorsque scrollEnabled est modifié. Un petit ajustement de votre méthode enableScrollButtonPressed permettra de résoudre le problème.

-(IBAction)enableScrollButtonPressed:(id)sender
{
    self.myTextView.scrollEnabled = YES;
    self.myTextView.contentSize = [self.myTextView sizeThatFits:self.myTextView.frame.size];
}
16
Brett Donald

Oui, vous avez raison de désactiver et d’activer le défilement de textview ne fonctionne pas dans iOS8; il peut s’agir d’un bogue ou de quelque chose d’autre, qu’il en soit ainsi. Nous pouvons désactiver ou activer le défilement de la vue du texte simplement changer le textview.

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITextView *myTextView;

@end

 @implementation ViewController
-(IBAction)enableScrollButtonPressed:(id)sender{
    CGSize scrollableSize = CGSizeMake(self.myTextView.bounds.size.width+20, self.myTextView.bounds.size.height+20);
    [self.myTextView setContentSize:scrollableSize];
}

-(IBAction)disableScrollButtonPressed:(id)sender{
    [self.myTextView setContentOffset:CGPointMake(0, 0)];
    [self performSelector:@selector(StopScroll) withObject:nil afterDelay:0.1];
}

-(void)StopScroll{
    CGSize scrollableSize = CGSizeMake(self.myTextView.bounds.size.width, self.myTextView.bounds.size.height/2);
    [self.myTextView setContentSize:scrollableSize];
}

@end

J'avais testé le code ci-dessus, il fonctionnait bien pour moi. J'utilise xcode 7.2.1et iOS 8.3. Essayez et laissez-moi savoir le résultat

6
Gokul

 enter image description here Après des heures de recherche, je suis trouvé un moyen 

-(IBAction)enableScrollButtonPressed:(id)sender{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    self.myTextView.scrollEnabled = YES;
    [self.myTextView setText:self.myTextView.text];

    self.myTextView.layoutManager.allowsNonContiguousLayout = false;

});

}

-(IBAction)disableScrollButtonPressed:(id)sender{

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    self.myTextView.scrollEnabled = NO;
});

}

condition pour cela est que vous devez faire défiler en premier alors vous cela fonctionnera parfaitement

Signifie que lorsque le bouton de défilement est désactivé, textview doit défiler à une positionne doit pas être à la position par défaut

5
Please follow below steps simply
self.myTextView.scrollEnabled = NO;
self.myTextView.userInteractionEnabled = YES;
self.myTextView.scrollEnabled = YES;
4
Kiran K

changez votre propriété comme suit.

dans votre code ..

@property (weak, nonatomic) IBOutlet UITextView *myTextView;

changez l'attribut de propriété comme suit:

@property (strong, nonatomic) IBOutlet UITextView *myTextView;

alors ça fonctionnera bien. Je l'ai vérifié.

3
soorej babu

J'ai essayé mon code et cela a fonctionné correctement

IBOutlet UITextView *tv;

//---------Enable button action.

-(IBAction)enable:(id)sender
{
    tv.scrollEnabled=YES;
}

//---------Disable button action.

-(IBAction)disable:(id)sender
{
    tv.scrollEnabled=NO;
}

essayez votre code une fois de plus dans l'appareil.

3
soorej babu

vous devez disposer vos vues après avoir activé ou désactivé l'affichage par défilement dans votre vue.

utilisez les méthodes viewWillLayoutSubviews/layoutIfNeeded.

3
Harish Pathak

Essaye celui-là

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    tableView.setContentOffset(CGPoint.zero, animated: false)
}
0
Artyom