2009-05-14 15 views
9

मेरे पास है जिसमें UIView अंदर है। मैं एक्स-अक्ष को लॉक करना चाहता हूं ताकि दृश्य केवल लंबवत स्क्रॉल हो। मैं दिशात्मक लॉकिंग कैसे सक्षम करूं?मैं UIScrollView के लिए दिशात्मक लॉक कैसे सक्षम करूं?

उत्तर

17

सबसे पहले, UIScrollView के "सामग्री आकार" को एक चौड़ाई रखने के लिए सेट करें जो UIScrollView के फ्रेम की चौड़ाई के बराबर या उससे कम है।

अगला, यूआईएसक्रॉल व्यू के "हमेशा बाउंस होरिज़ोंटल" को सेट करें। यह "रबड़ बैंडिंग" से स्क्रॉल व्यू को रोक देगा, भले ही आपने इसे बताया है कि प्रदर्शित करने के लिए कोई और क्षैतिज सामग्री नहीं है।

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

इससे कोई फर्क नहीं पड़ता कि वास्तव में स्क्रॉल व्यू के अंदर क्या है।

+0

इससे मुझे एक्सकोड 7 में भी मदद मिली। मुझे दिशा लॉक को काम करने के लिए स्टोरीबोर्ड में बाउंस बंद करना पड़ा (भले ही मेरे पास दिशा लॉक सक्षम हो गया हो)। –

2

आप UIScrollView उपवर्गीकरण किया जाएगा और touchesBegan:withEvent: विधि, touchesMoved:withEvent: विधि, और touchesEnded:withEvent: विधि अधिभावी।

आप उन तरीकों, एक स्पर्श का प्रारंभ और अंत बिंदु के साथ इस्तेमाल करेंगे, गणना करने के लिए स्पर्श घटना किस तरह जगह ले ली: यह एक साधारण नल, या एक क्षैतिज या लम्बवत कड़ी चोट थी?

यदि यह एक क्षैतिज स्वाइप है, तो आप स्पर्श ईवेंट रद्द कर देते हैं।

यह जानने के लिए कि आप कैसे शुरू कर सकते हैं source code here पर एक नज़र डालें।

+0

अपने इरादे के स्क्रॉलव्यू को सूचित करने के लिए बेहतर है, मुझे लगता है कि मैन्युअल रूप से स्वयं को छूने के बजाय मुझे लगता है। आपके दृष्टिकोण के साथ, यदि आप क्षैतिज रूप से खींचना शुरू करते हैं (भले ही दुर्घटना से), तो आप लंबवत खींच नहीं सकते हैं और इसे काम कर सकते हैं। –

+0

मुझे डर था कि कोई यह कहेंगे ... अक्ष को लॉक करने के लिए एक निश्चित-अग्नि तरीका मुझे यकीन है, लेकिन मुझे लगता है कि मैं ऐसा करने के लिए एक आलसी तरीके खोज रहा हूं। यद्यपि आपकी प्रतिक्रिया के लिए धन्यवाद। निक फरीना ने मेरा मुद्दा हल करके हल किया: सबसे पहले, UIScrollView के "सामग्री आकार" को एक चौड़ाई रखने के लिए सेट करें जो UIScrollView के फ्रेम की चौड़ाई के बराबर या उससे कम है। अगला, यूआईएसक्रॉल व्यू के "हमेशा बाउंस होरिज़ोंटल" को सेट करें। यह "रबड़ बैंडिंग" से स्क्रॉल व्यू को रोक देगा, भले ही आपने इसे बताया है कि प्रदर्शित करने के लिए कोई और क्षैतिज सामग्री नहीं है। – RexOnRoids

0
#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 
संबंधित मुद्दे