Domanda

Ho un UIScrollView con un UIView all'interno. Voglio bloccare l'asse x in modo che la vista viene fatto scorrere solo verticalmente. Come faccio ad attivare di bloccaggio direzionale?

È stato utile?

Soluzione

Innanzitutto, impostare s 'UIScrollView il contentSize avere una larghezza che è uguale o inferiore alla larghezza del telaio della UIScrollView.

Successivamente, impostare UIScrollView's alwaysBounceHorizontal su NO. Questo consentirà di evitare la vista di scorrimento da "bande di gomma", anche se gli si dice non più c'è il contenuto orizzontale da visualizzare.

UIScrollView *scrollView;
CGSize size = scrollView.contentSize;
size.width = CGRectGetWidth(scrollView.frame);
scrollView.contentSize = size;
scrollView.alwaysBounceHorizontal = NO;

Non importa che cosa è in realtà all'interno della vista di scorrimento.

Altri suggerimenti

Ti verrà Subclassing UIScrollView e l'override del metodo touchesBegan:withEvent: metodo touchesMoved:withEvent:, e il metodo touchesEnded:withEvent:.

Potrai utilizzare questi metodi, insieme con i punti di inizio e fine di un tocco, di calcolare che tipo di tocco evento ha avuto luogo: era un rubinetto semplice, o un colpo orizzontale o verticale?

Se è un colpo orizzontale, si annulla l'evento di tocco.

Date un'occhiata al codice sorgente href="https://stackoverflow.com/questions/728014/prevent-diagonal-scrolling-in-uiscrollview/844627#844627"> per imparare si potrebbe iniziare.

#import <UIKit/UIKit.h>


@interface DemoButtonViewController : UIViewController <UIScrollViewDelegate>

@property (nonatomic, strong) UIScrollView *filterTypeScrollView;
@property (nonatomic, strong) UIBarButtonItem *lockButton;

- (void)lockFilterScroll:(id)sender;

@end

#import "DemoButtonViewController.h"

@implementation DemoButtonViewController

@synthesize filterTypeScrollView;
@synthesize lockButton;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) 
    {
        // Custom initialization
    }
    return self;
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor darkGrayColor];
    self.filterTypeScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 130, self.view.frame.size.width, 320)];
    filterTypeScrollView.contentSize = CGSizeMake(self.view.frame.size.width*4, 320);
    filterTypeScrollView.pagingEnabled = YES;
    filterTypeScrollView.delegate = self;
    [self.view addSubview:filterTypeScrollView];

    UIToolbar *lockbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 450, self.view.frame.size.width, 30)];
    lockbar.barStyle = UIBarStyleBlackTranslucent;
    self.lockButton = [[UIBarButtonItem alloc] initWithTitle:@"Lock Filter Scroll" style:UIBarButtonItemStylePlain target:self action:@selector(lockFilterScroll:)];
    [lockbar setItems:[NSArray arrayWithObjects:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],lockButton,nil]]; 
    [self.view addSubview:lockbar];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations  
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)lockFilterScroll:(id)sender
{
    filterTypeScrollView.scrollEnabled = !filterTypeScrollView.scrollEnabled;

    if (filterTypeScrollView.scrollEnabled) 
    {
        [lockButton setTitle:@"Lock Filter Scroll"];
    } 
    else {
        [lockButton setTitle:@"Unlock Filter Scroll"];
    }
}

@end
scroll top