2009-01-07 16 views
24

मेरे पास UIImageView है जो UIImageView की तुलना में व्यापक और लम्बाई वाली छवि प्रदर्शित कर रहा है। मैं एनीमेशन का उपयोग करके दृश्य में छवि को पैन करना चाहता हूं (ताकि पैन अच्छा और चिकनी हो)।मैं UIImageView के अंदर छवि को कैसे पैन करूं?

मुझे ऐसा लगता है कि मैं सिर्फ UIImageView की bounds.origin समायोजित करने में सक्षम होना चाहिए, और छवि (, है ना? क्योंकि छवि है कि के रूप में अपने मूल के साथ दृश्य के अंदर रंग चाहिए) बढ़ना चाहिए, लेकिन वह नहीं करता है काम नहीं लग रहा है। bounds.origin परिवर्तन, लेकिन छवि एक ही स्थान पर खींचती है।

दृश्य की परत के contentsRect को बदलने के लिए लगभग क्या काम है। लेकिन यह एक इकाई वर्ग के रूप में शुरू होता है, भले ही छवि का देखने योग्य क्षेत्र पूरी छवि नहीं है। इसलिए मुझे यकीन नहीं है कि मैं कैसे पता लगाऊंगा कि छवि के बहुत किनारे को देखने योग्य क्षेत्र में खींचा जा रहा है (जिसे मुझे टालने की ज़रूरत है, क्योंकि यह किनारे को अनंत तक खींचकर प्रदर्शित करता है, जो दिखता है, ठीक है, सब-पैरा)।

मेरे विचार में वर्तमान में contentsGravity इंटरफ़ेस बिल्डर के माध्यम से kCAGravityTopLeft पर सेट है, यदि इससे कोई फर्क पड़ता है (क्या यह छवि को स्थानांतरित कर रहा है?)। हालांकि, कोई अन्य विकल्प बेहतर नहीं लग रहा था।

अद्यतन: स्पष्ट होने के लिए, मैं के अंदर दृश्य को स्थानांतरित करना चाहता हूं, जबकि दृश्य को उसी स्थान पर रखते हुए।

उत्तर

37

ब्रैड लार्सन ने मुझे के अंदर UIImageView डालने के सुझाव के साथ सही सड़क पर इंगित किया।

अंत में मैं एक UIScrollView के अंदर UIImageView रखा, और scrollview के contentSizeऔरimageView की सीमा सेट UIImage में छवि के रूप में एक ही आकार के होने के लिए: फिर

UIImage* image = imageView.image; 
imageView.bounds = CGRectMake(0, 0, image.size.width, image.size.height); 
scrollView.contentSize = image.size; 

, मैं चेतन कर सकते हैं scrollview के contentOffset एक अच्छा पैनिंग प्रभाव को प्राप्त करने:

[UIView beginAnimations:@"pan" context:nil]; 
[UIView setAnimationDuration:animationDuration]; 
scrollView.contentOffset = newRect.origin; 
[UIView commitAnimations]; 

मेरी विशेष मामले में, मैं एक यादृच्छिक अंतरिक्ष के लिए पैन कर रहा हूँ मैं एन छवि। आदेश को और एक उचित अवधि पैन करने के लिए एक अच्छा स्थिर गति प्राप्त करने के लिए एक उचित रेक्ट खोजने के लिए, मैं निम्नलिखित का उपयोग करें:

UIImage* image = imageView.image; 

float xNewOrigin = [TCBRandom randomIntLessThan:image.size.width - scrollView.bounds.size.width]; 
float yNewOrigin = [TCBRandom randomIntLessThan:image.size.height - scrollView.bounds.size.height]; 

CGRect oldRect = scrollView.bounds; 
CGRect newRect = CGRectMake(
    xNewOrigin, 
    yNewOrigin, 
    scrollView.bounds.size.width, 
    scrollView.bounds.size.height); 

float xDistance = fabs(xNewOrigin - oldRect.origin.x); 
float yDistance = fabs(yNewOrigin - oldRect.origin.y); 
float hDistance = sqrtf(powf(xDistance, 2) + powf(yDistance, 2)); 
float hDistanceInPixels = hDistance; 

float animationDuration = hDistanceInPixels/speedInPixelsPerSecond; 

मैं उपयोग कर रहा हूँ एक 10.0f की speedInPixelsPerSecond, लेकिन अन्य अनुप्रयोगों करना चाह सकते हैं एक अलग मूल्य का उपयोग करें।

+0

अच्छा काम और बहुत बहुत धन्यवाद! – Darmen

44

मैं में अपने UIImageView को संलग्न करने की अत्यधिक अनुशंसा करता हूं। UIImageView पूर्ण छवि प्रदर्शित करें, और UIScrollView पर सामग्री आकार को अपने UIImageView's आकार के समान सेट करें। छवि में आपका windowUIScrollView का आकार होगा, और scrollRectToVisible:animated: का उपयोग करके आप एनिमेटेड फैशन में छवि पर विशेष क्षेत्रों में पैन कर सकते हैं।

यदि आप स्क्रॉल बार दिखाना नहीं चाहते हैं, तो आप showsHorizontalScrollIndicator और showsVerticalScrollIndicator गुण NO पर सेट कर सकते हैं।

UIScrollView भी चुटकी-ज़ूमिंग कार्यक्षमता प्रदान करता है, जो आपके लिए उपयोगी हो सकता है या नहीं भी हो सकता है।

+0

लेकिन उस मामले में एनीमेशन इतना तेज़ है कि आप वास्तव में छवि, केवल गंतव्य को कभी नहीं देखते हैं। – TALlama

+1

अपनी स्क्रॉल को संलग्न करें RectToVisible: एनिमेटेड: एक UIView प्रारंभ में विधि कॉल एनीमेशन/प्रतिबद्धएनीमेशन ब्लॉक और UIView के सेट का उपयोग करेंएनीमेशन अवधि: उस ब्लॉक की शुरुआत में। यह डिफ़ॉल्ट एनीमेशन अवधि ओवरराइड करता है। आप धीरे-धीरे स्क्रॉल व्यू पैन को उसी तरह से बना सकते हैं जैसे आप चाहते हैं। –

+0

यह स्क्रॉलिंग को धीमा नहीं लग रहा है। यहां मैं क्या कर रहा हूं: [UIView प्रारंभएनीमेशन: @ "बे पैन" संदर्भ: शून्य]; [UIView सेटएनीमेशन अवधि: 10]; [UIView setAnimationDelegate: self]; [scrollView scrollRectToVisible: newRect एनिमेटेड: हाँ]; [UIView प्रतिबद्धएनीमेशन]; – TALlama

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