2012-05-09 23 views
19

पर सेट करने के लिए मुझे UIScrollview पर सवाल मिला।UIScrollView की सामग्री आकार को गतिशील रूप से

कहानी यह है कि मेरे पास UIView चार्ट्स व्यू नामक है जिसे मैं इसे ओवरराइड विधि drawRect() द्वारा स्वयं खींचता हूं। ड्राइंग की सामग्री गतिशील रूप से उत्पन्न की गई थी। तो मैं रनटाइम तक इसका आकार नहीं जानता। सवाल यह है कि मैं अपने सुपर व्यू (scrollView) सामग्री आकार को गतिशील रूप से कैसे/कहां सेट कर सकता हूं? इसके बारे में कोई विचार?

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

// not this way. it's fixed size..... 
     ChartsView *chartsView = [[ChartsView alloc]initWithFrame:CGRectMake(0, 0, 320, 800)]; 

     self.scrollView.contentSize = chartsView.frame.size; 

     [self.scrollView addSubview:chartsView]; 

    } 

उत्तर

1

@IBOutlet weak var btnLatestButton: UIButton! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let height = btnLatestButton.frame.size.height 
    let pos = btnLatestButton.frame.origin.y 
    let sizeOfContent = height + pos + 10 
    scrollview.contentSize.height = sizeOfContent 

} 

बिल्कुल ऊपर है जब आप सिर्फ इसका कोई सुधार इस

- (void)viewDidLoad 
     { 
      [super viewDidLoad]; 

    // not this way. it's fixed size..... 
      ChartsView *chartsView = [[ChartsView alloc]initWithFrame:CGRectMake(0, 0, 320, 800)]; 

      self.scrollView.contentSize = chartsView.frame.size; 
      [self.scrollView setNeedsDisplay]; 
      [self.scrollView addSubview:chartsView]; 

    } 
+0

फिर भी प्रयास विफल पर लिखा है। मैं एक वर्कअराउंड खोजने का प्रयास करता हूं, ड्राइंग करते समय चार्ट दृश्य में स्क्रॉलव्यू के सामग्री आकार को सेट करता हूं.अब सवाल यह है कि मैं किस तरह का एपीआई चार्ट का वास्तविक आकार प्राप्त करने के लिए उपयोग कर सकता हूं ((UIScrollView *) [self superview])। ContentSize = CGSizeMake (320, 480); –

54

एक और आसान तरीका

- (void)viewDidLoad 
{ 
    float sizeOfContent = 0; 
    UIView *lLast = [scrollView.subviews lastObject]; 
    NSInteger wd = lLast.frame.origin.y; 
    NSInteger ht = lLast.frame.size.height; 

    sizeOfContent = wd+ht; 

    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width, sizeOfContent); 
} 
+0

अच्छी चाल। इसका उपयोग किसी भी 'UIScrollView' के लिए किया जा सकता है। इसके लिए +1। –

+0

मैं सिर्फ एक चीज जोड़ना चाहता हूं। आप में से कुछ इस कोड को viwDidAppear में रखना पसंद कर सकते हैं: क्योंकि आपका UIView ViewDidAppear से पहले खींचा जा सकता है लेकिन देखने के बाद डिडलोड को कॉल किया जाता है; यह आपको दृश्य की नवीनतम ऊंचाई तक पहुंचने में सक्षम बनाएगा। – mvb

+10

lastObject सबव्यूज़ सरणी में अनुक्रमित अंतिम ऑब्जेक्ट देता है, स्क्रीन पर सबसे नीचे सबव्यू नहीं। वास्तव में, lastObject के पास दृश्य की स्थिति से कोई लेना देना नहीं है और इसका उपयोग करना गलत है। – AmitP

5

तेज (2.0) की कोशिश अपने स्क्रॉलव्यू पर विचारों की एड राशि। आईओएस रॉक्स विधि उपलब्ध है लेकिन मेरे लिए अच्छा नहीं था, मुझे आवश्यक जगह और अधिक जगह बनाई गई।

let lastView : UIView! = scrollview.subviews.last 
    let height = lastView.frame.size.height 
    let pos = lastView.frame.origin.y 
    let sizeOfContent = height + pos + 10 
    scrollview.contentSize.height = sizeOfContent 
3

आईओएस चट्टानों और इस पर सुराग के लिए CularBytes के लिए धन्यवाद। मैं दो समस्याओं (मेरे लिए) ऊपर समाधान के साथ पाया:

  1. मैं हमेशा अपने UIScrollView की इकलौती संतान के रूप में एक कंटेनर UIView है, इसलिए मैं जिस तरह से मैं पिछले दृश्य को देखने के उस बच्चे UIView में अद्यतन करने के लिए किया था (देखें नीचे)
  2. मैं UIScrollView में और के रूप में अपनी सामग्री को offset'ing हूँ इस तरह के
इसके अलावा

मैं (हां, खिड़की नहीं जनक दृश्य के सापेक्ष) है कि पिछले UIView की पूर्ण स्थिति की गणना करने के लिए आवश्यक UIScrollView के किनारे पिन करने के लिए ऑटोलायआउट का उपयोग कर रहा हूं, इसलिए मुझे चौड़ाई के बारे में चिंता करने की आवश्यकता नहीं है (जैसा कि कूलरबाइट्स है)।

यहाँ मैं के साथ आया था और काम करता है (स्विफ्ट 3.0 में) है:

func setScrollViewContentSize() { 

    var height: CGFloat 
    let lastView = self.myScrollView.subviews[0].subviews.last! 
    print(lastView.debugDescription) // should be what you expect 

    let lastViewYPos = lastView.convert(lastView.frame.origin, to: nil).y // this is absolute positioning, not relative 
    let lastViewHeight = lastView.frame.size.height 

    // sanity check on these 
    print(lastViewYPos) 
    print(lastViewHeight) 

    height = lastViewYPos + lastViewHeight 

    print("setting scroll height: \(height)") 

    myScrollView.contentSize.height = height 
} 

मैं अपने viewDidAppear() विधि में इस कहते हैं।

1

इस प्रयास करें -

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

// not this way. it's fixed size..... 
     ChartsView *chartsView = [[ChartsView alloc]initWithFrame:CGRectMake(0, 0, 320, 800)]; 

     //self.scrollView.contentSize = chartsView.frame.size; 
     [self.scrollView setContentSize:CGSizeMake(chartsView.frame.size.width, chartsView.frame.size.height)]; 
     [self.scrollView addSubview:chartsView]; 

    } 
1

यह 100% गारंटी है कि scrollView.subviews सरणी में पिछले वस्तु अपने पुस्तक ध्यान में रखते हुए उच्चतम y-मूल वस्तु वापस आ जाएगी नहीं है। सबव्यूज़ सरणी जेड-इंडेक्स द्वारा व्यवस्थित की जाती है (यानी सबव्यूज़ सरणी में आखिरी ऑब्जेक्ट ऑब्जेक्ट उच्चतम होगा और स्क्रॉल व्यू के सबव्यूव में सबसे ज्यादा सबव्यूव होगा। इसके बजाय मूलभूत फ़ंक्शन का उपयोग करना अधिक सटीक है सबव्यू के माध्यम से पुन: प्रयास करने के लिए और वस्तु को उच्चतम वाई-उत्पत्ति के साथ प्राप्त करें।

func calculateContentSize(scrollView: UIScrollView) -> CGSize { 
    var topPoint = CGFloat() 
    var height = CGFloat() 

    for subview in scrollView.subviews { 
     if subview.frame.origin.y > topPoint { 
      topPoint = subview.frame.origin.y 
      height = subview.frame.size.height 
     } 
    } 
    return CGSize(width: scrollView.frame.size.width, height: height + topPoint) 
} 

उपयोग (viewDidLayoutSubviews में या जब भी अपनी सामग्री आकार अपडेट)::

scrollView.contentSize = calculateContentSize(scrollView: scrollView) 

अद्यतन स्विफ्ट 4

यहाँ तेजी से 3 में एक बुनियादी कार्य है जो कि ऐसा कर सकते हैं है

यहां स्विफ्ट 4

में एक और अधिक संक्षिप्त संस्करण है
extension UIScrollView { 
    func updateContentView() { 
     contentSize.height = subviews.sorted(by: { $0.frame.maxY < $1.frame.maxY }).last?.frame.maxY ?? contentSize.height 
    } 
} 

उपयोग:

myScrollView.updateContentView() 
0

यह एक विस्तार स्विफ्ट 3

extension UIScrollView { 
    func updateContentViewSize() { 
     var newHeight: CGFloat = 0 
     for view in subviews { 
      let ref = view.frame.origin.y + view.frame.height 
      if ref > newHeight { 
       newHeight = ref 
      } 
     } 
     let oldSize = contentSize 
     let newSize = CGSize(width: oldSize.width, height: newHeight + 100) 
     contentSize = newSize 
    } 
} 
संबंधित मुद्दे