20

कुछ जो मुझे परिवर्तनों के बारे में समझ में नहीं आता है। मैं UIView (मुख्य दृश्य) के शीर्ष दाएं कोने में ज़ूम इन करना चाहता हूं। मैं CGAffineTransformScale का उपयोग करता हूं और केंद्र/एंकरपॉइंट के साथ-साथ CGAffineTransformMakeTranslation दोनों को कोई फायदा नहीं हुआ है।(स्केल) एक बिंदु पर एक UIView में ज़ूम करें

मैं यह नहीं समझ सकता कि अनुवाद को सही तरीके से कैसे सेट करें ताकि यह इस बिंदु पर ज़ूम इन कर सके।

CGAffineTransform tr = CGAffineTransformScale(self.view.transform, 2, 2); 

[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{ 
      self.view.transform = tr; 
      self.view.center = CGPointMake(480,0); 

} completion:^(BOOL finished) {}]; 
+0

यादृच्छिक बिन्दुओं को जूम करने के बारे में क्या? उदाहरण के लिए स्क्रीन को टैप करने वाले उपयोगकर्ता के जवाब में? – user978838

उत्तर

34

आप दृश्य के केंद्र को शीर्ष दाएं कोने में सेट कर रहे हैं। इसका मतलब है कि आप कहीं भी केंद्र के निचले बाएं हिस्से में ज़ूम कर रहे हैं।

प्रभावी ढंग से ऊपर दाएं कोने तय साथ उसे ज़ूम इस

CGAffineTransform tr = CGAffineTransformScale(self.view.transform, 2, 2); 
CGFloat h = self.view.frame.size.height; 
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{ 
    self.view.transform = tr; 
    self.view.center = CGPointMake(0,h); 
} completion:^(BOOL finished) {}]; 

यह छोड़ दिया नीचे कोने को उड़ा-अप दृश्य के केन्द्र स्थापित करेगा प्रयास करें।

इस कोड में ऊंचाई हार्डकोड नहीं है, जो थोड़ा अधिक पोर्टेबल (आईफोन 5 के आईपैड पर) है।

transform संपत्ति सेट करने से पहले आपको h को पहले सहेजने की आवश्यकता है, क्योंकि उसके बाद आपको frame के मान पर भरोसा नहीं करना चाहिए।

संपादित

यह किसी भी पैमाने s के लिए काम करने के लिए, इस का उपयोग करें:

CGFloat s = 3; 
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s); 
CGFloat h = self.view.frame.size.height; 
CGFloat w = self.view.frame.size.width; 
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{ 
    self.view.transform = tr; 
    self.view.center = CGPointMake(w-w*s/2,h*s/2); 
} completion:^(BOOL finished) {}]; 

यह नीचे बाएँ के लिए काम करने के लिए, इस का उपयोग करें:

CGFloat s = 3; 
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s); 
CGFloat h = self.view.frame.size.height; 
CGFloat w = self.view.frame.size.width; 
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{ 
    self.view.transform = tr; 
    self.view.center = CGPointMake(w*s/2,h-h*s/2); 
} completion:^(BOOL finished) {}]; 

बनाने के यह नीचे दाईं ओर काम करता है, इसका उपयोग करें:

CGFloat s = 3; 
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s); 
CGFloat h = self.view.frame.size.height; 
CGFloat w = self.view.frame.size.width; 
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{ 
    self.view.transform = tr; 
    self.view.center = CGPointMake(w-w*s/2,h-h*s/2); 
} completion:^(BOOL finished) {}]; 

यह भी देखें: How to scale (zoom) a UIView to a given CGPoint

+0

धन्यवाद, यह मेरे लिए काम करता है, लेकिन यह 3 से ऊपर के पैमाने पर वास्तविक केंद्र की तरफ ज़ूम करता है। यह काम कैसे होगा, नीचे दाईं ओर कहें? विचित्र रूप से पर्याप्त, यह मेरे लिए काम करता है: self.view.center = CGPointMake (-280, -h) – akaru

+1

यह सही है, क्योंकि उड़ा हुआ दृश्य का केंद्र पैमाने पर निर्भर करता है। मैंने नीचे दाएं/बाएं और किसी भी पैमाने के लिए उदाहरण जोड़े। बस याद रखें: सबसे पहले आप दृश्य को उड़ाते हैं (इसे 320 * एस, 480 * एस बड़ा बनाते हैं), और फिर आप उस दृश्य का केंद्र सेट कर रहे हैं। – mvds

+0

शानदार! यह एक छोटा सा एल्गोरिदम है जिसे मैं याद कर रहा था, धन्यवाद। क्या मैं आसानी से वापस जाना चाहता हूं, तो केंद्र स्थापित करने की तुलना में MakeTranslate बेहतर विकल्प होगा? – akaru

1

मामले किसी में अभी भी रुचि है, यहां स्विफ्ट 3.0 समाधान है, जो मैं सही ढंग से नहीं हो पाती संभावना को जोड़ा है।

(मैं जानता हूँ कि लापता दो enums देखते हैं, लेकिन अभी भी पठनीय कोड है और मुझे लगता है कि आप अवधारणा मिल जाएगा)

func animateZoom(direction: ZoomDirection, type: ZoomType, duration: Double = 0.3, scale: CGFloat = 1.4) { 
    var cx, cy: CGFloat 
    var tr: CGAffineTransform = CGAffineTransform.identity 

    if (type == .IN) { tr = self.transform.scaledBy(x: scale, y: scale) } 

    let h: CGFloat = self.frame.size.height; 
    let w: CGFloat = self.frame.size.width; 

    if (type == .IN) { 
     switch direction { 
     case .LEFT_DOWN: 
      cx = w*scale/2 
      cy = h-h*scale/2 
      break 
     case .LEFT_UP: 
      cx = w*scale/2 
      cy = h*scale/2 
      break 
     case .RIGHT_UP: 
      cx = w-w*scale/2 
      cy = h*scale/2 
      break 
     case .RIGHT_DOWN: 
      cx = w-w*scale/2 
      cy = h-h*scale/2 
      break 
     } 
    } else { 
     cx = w/scale/2 
     cy = h/scale/2 
    } 

    UIView.animate(withDuration: duration, delay: 0, options: [.curveEaseInOut], animations: { 
     self.transform = tr 
     self.center = CGPoint(x: cx, y: cy) 
    }, completion: { finish in }) 
} 
संबंधित मुद्दे