2012-12-14 37 views
6

के अनुसार UIView के एनएसएमयूटेबलएरे को सॉर्ट करें। मैं अपने फ्रेम.ऑरिगिन.ई के अनुसार यूआईवीव्स के एनएसएमयूटेबलएरे को सॉर्ट करना चाहता हूं, मैं वाई के साथ सबसे कम दृश्य चाहता हूं आदि। यह हो सकता है मामला है कि 2 UIViews एक ही मूल है। क्या इसके लिए कोई मौजूदा विधि है?उनके फ्रेम.ऑरिगिन.ई

उत्तर

15

NSMutableArray है कई छँटाई तरीकों subviews के सरणी मिल सकती है। उनमें से एक को चुनें, सॉर्टिंग चयनकर्ता, ब्लॉक या फ़ंक्शन को कार्यान्वित करें और y मानों की तुलना करें। यहाँ ब्लॉकों का उपयोग कर एक उदाहरण है:

NSComparator comparatorBlock = ^(UIView *obj1, UIView *obj2) { 
    if (obj1.frame.origin.y > obj2.frame.origin.y) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 

    if (obj1.frame.origin.y < obj2.frame.origin.y) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
}; 

[array sortUsingComparator:comparatorBlock]; 
+1

वर्क्स एक charme की तरह! धन्यवाद आदमी :) यह नहीं पता था, और यह बहुत अच्छा है! – xGoPox

+0

धन्यवाद! यह वास्तव में एक बड़ी मदद है। –

+0

इतना सहायक! बहुत बहुत धन्यवाद –

-2

आप

yourView.subviews 

का उपयोग कर तो आपको प्रत्येक के माध्यम से पुनरावृति और प्रत्येक frame.origin.y की जाँच करें और क्या कर सकते हैं अपने कोडिंग

3

हालांकि यह frame.origin.y नहीं है, आप भी एक SortDescriptor का उपयोग करने और कुंजी के रूप में layer.position.y को देखकर ऐसा कर सकते हैं।

[array sortedArrayUsingDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"layer.position.y" ascending:YES]]]; 
+0

उत्तर से एक बेहतर समाधान .. आप 'फ्रेम' को सॉर्ट कर सकते हैं क्योंकि यह एक संरचना है – RyanG

1

इस तरह आप स्विफ्ट में ऐसा होता है:

listOfViews.sortInPlace { CGRectGetMinY($0.frame) < CGRectGetMinY($1.frame) } 

यही स्विफ्ट करने के लिए सभी :-) सभी मेरे प्यार :-)