2013-04-17 14 views
24

मेरे आईफोन ऐप में, मैं संग्रह दृश्य पर छवियां दिखा रहा हूं। मैं यूआरएल से छवियों को लाता हूं, यूआरएल के साथ मुझे छवि का आकार भी मिलता है। उदाहरण: - मान लें कि दो प्रकार की छवियां लैंडस्केप और पोर्ट्रेट हैं। मुझे चित्र छवियों के लिए मूल्य पी मिलता है और एल लैंडस्केप छवियों के लिए एलUICollectionview में विभिन्न सेल आकार

संग्रह को कैसे अनुकूलित करें सेल का आकार देखें?

+0

आप https://github.com/bryceredd/RFQuiltLayout को देख सकते हैं। ऐसा लगता है कि आप इस – Rajneesh071

उत्तर

63

उपयोग इस UICollectionViewDelegateFlowLayout विधि

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath; 
+0

के लिए उपयोग कर सकते हैं धन्यवाद। मैं यहां फंस गया था, और परीक्षण और काम करने के लिए एक नई परियोजना खोलता हूं। –

+1

पीएस। UICollectionViewDelegateFlowLayout में UICollectionViewDataSource और UICollectionViewDelegate दोनों शामिल हैं, इसलिए आपको केवल अपनी प्रतिनिधि घोषणाओं में जोड़ने की आवश्यकता है। –

9

1) आप बनाए रख सकता है और कई लेआउट वस्तुओं बाहर स्वैप, लेकिन वहाँ एक सरल तरीका है। बस अपने UICollectionViewController उपवर्ग के लिए निम्न जोड़ सकते हैं और आवश्यक के रूप में आकार को समायोजित:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{  
    // Adjust cell size for orientation 
    if (UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { 
     return CGSizeMake(170.f, 170.f); 
    } 
    return CGSizeMake(192.f, 192.f); 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    [self.collectionView performBatchUpdates:nil completion:nil]; 
} 

-performBatchUpdates:completion: कॉलिंग लेआउट को अमान्य और एनीमेशन के साथ कोशिकाओं का आकार बदलेंगे (आप बस दोनों ब्लॉक पैरामीटर के लिए नहीं के बराबर पारित कर सकते हैं यदि आप बिना किसी अतिरिक्त है प्रदर्शन करने के लिए समायोजन)।

2) -collectionView:layout:sizeForItemAtIndexPath में आइटम आकारों को हार्डकोड करने के बजाय, संग्रह की ऊंचाई या चौड़ाई को विभाजित करने के बजाय स्क्रीन पर फिट होने वाली कोशिकाओं की संख्या से दृश्य की सीमाएं विभाजित करें। यदि UICollectionView क्षैतिज या चौड़ाई स्क्रॉल करता है तो ऊंचाई का उपयोग करें यदि यह लंबवत स्क्रॉल करता है।

2

यही वह है जो मैंने किया था। मैंने पहले स्क्रीन के आकार के आधार पर सेल का आकार सेट किया है (ताकि हम प्रत्येक पंक्ति पर छवियों की सर्वश्रेष्ठ संख्या प्राप्त कर सकें)। आप अपने कारण के अनुरूप संख्याओं को बदलना चाह सकते हैं।

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ 
CGFloat widthOfCell =(self.view.frame.size.width-30)/2; 
CGFloat heightOfCell =widthOfCell * 1.33; 
CGSize returnValue = CGSizeMake(widthOfCell, heightOfCell); 
returnValue.height += 5; 
returnValue.width += 5; 
return returnValue; 

} 

मैं तो एक छवि हेरफेर विधि का इस्तेमाल किया लैंडस्केप या पोर्ट्रेट स्थिति का निर्धारण करने, और (मेरे अनुप्रयोग के लिए) मैं हर छवि एक चित्र बनाने का फैसला किया:

if (sourceImage.size.width>sourceImage.size.height) { 
    sourceImage = [[UIImage alloc] initWithCGImage: sourceImage.CGImage 
              scale: 1.0 
             orientation: UIImageOrientationRight]; 
    } 

आप इसे करना चाहते हैं दूसरी तरफ, ><

कैवेट: तस्वीर घूर्णन या दाएं ओर इशारा करते हुए मेरी घूर्णन विधि को ध्यान में नहीं रखती है। दूसरे शब्दों में, यदि कोई छवि ऊपर की तरफ से परिदृश्य है, तो मेरा कोड उसे पहचान नहीं सकता है। मुझे उम्मीद है कि कोई और आपकी मदद कर सकता है, और मुझे आशा है कि मैं ट्रैक से बाहर नहीं गया हूं! :)

1

तेजी के लिए, करने के लिए आप ViewController flowlayout का विस्तार करता है, तो आप चर जो पकड़ आपके विचार contorller में छवियों नाम बनाने के सेल पर गतिशील छवियों दिखाने के लिए और इस का उपयोग करने की आवश्यकता है:

let imageData = ["image1","image2","image3","image4"] 

extension yourViewController: UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{ 
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 

    let photo = UIImage(named: imageData[indexPath.row]) 
     return CGSize(width: (photo?.size.width)!, height: (photo?.size.height)!) 

} 

}

संबंधित मुद्दे