दो बनाने के बजाय UIImageViews
, केवल image
एक दृश्य को बदलना तर्कसंगत लगता है । अगर मैं ऐसा करता हूं, तो क्या एक झटके / क्रॉस को तत्काल स्विच के बजाय दो छवियों के बीच भंग कर दिया जाता है?
दो बनाने के बजाय UIImageViews
, केवल image
एक दृश्य को बदलना तर्कसंगत लगता है । अगर मैं ऐसा करता हूं, तो क्या एक झटके / क्रॉस को तत्काल स्विच के बजाय दो छवियों के बीच भंग कर दिया जाता है?
जवाबों:
संपादित करें: नीचे @algal से बेहतर समाधान है ।
ऐसा करने का एक और तरीका पूर्वनिर्धारित CAAimimation बदलाव का उपयोग करना है:
CATransition *transition = [CATransition animation];
transition.duration = 0.25;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionFade;
transition.delegate = self;
[self.view.layer addAnimation:transition forKey:nil];
view1.hidden = YES;
view2.hidden = NO;
Apple से दृश्य परिवर्तन उदाहरण परियोजना देखें: https://developer.apple.com/library/content/samplecode/ViewTransitions/Introduct/Intro.html#//apple_ref/doc/uid/DTSD0000007411
यह नए ब्लॉक-आधारित, UIKit animation
विधियों का उपयोग करके बहुत सरल हो सकता है ।
मान लीजिए कि निम्नलिखित कोड व्यू कंट्रोलर में है, और UIImageView आप जिसको क्रॉस-डिसॉल्व करना चाहते हैं, वह संपत्ति के माध्यम से सेल्फव्यू का एक सबव्यू है। self.imageView
इसके बाद आपकी जरूरत है:
UIImage * toImage = [UIImage imageNamed:@"myname.png"];
[UIView transitionWithView:self.imageView
duration:5.0f
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
self.imageView.image = toImage;
} completion:nil]
किया हुआ।
और स्विफ्ट में करने के लिए, यह ऐसा है:
let toImage = UIImage(named:"myname.png")
UIView.transitionWithView(self.imageView,
duration:5,
options: UIViewAnimationOptions.TransitionCrossDissolve,
animations: { self.imageView.image = toImage },
completion: nil)
स्विफ्ट 3, 4 और 5
let toImage = UIImage(named:"myname.png")
UIView.transition(with: self.imageView,
duration: 0.3,
options: .transitionCrossDissolve,
animations: {
self.imageView.image = toImage
},
completion: nil)
स्विफ्ट 3.0.1 के लिए:
UIView.transition(with: self.imageView,
duration:0.5,
options: .transitionCrossDissolve,
animations: { self.imageView.image = newImage },
completion: nil)
संदर्भ: https://gist.github.com/licvido/bc22343cacfa3a8ccf88
हां, आप जो कहते हैं, वह बिल्कुल सही है और इसे करने का तरीका है। मैंने इस विधि को लिखा और हमेशा अपनी छवि में फीका करने के लिए इसका उपयोग किया। मैं इससे निपटता हूं CALayer
। इसके लिए आपको Core एनिमेशन आयात करना होगा।
+ (void)fadeInLayer:(CALayer *)l
{
CABasicAnimation *fadeInAnimate = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeInAnimate.duration = 0.5;
fadeInAnimate.repeatCount = 1;
fadeInAnimate.autoreverses = NO;
fadeInAnimate.fromValue = [NSNumber numberWithFloat:0.0];
fadeInAnimate.toValue = [NSNumber numberWithFloat:1.0];
fadeInAnimate.removedOnCompletion = YES;
[l addAnimation:fadeInAnimate forKey:@"animateOpacity"];
return;
}
आप एक छवि को फीका करने के लिए विपरीत कर सकते हैं। इसके बाद बाहर निकल जाता है। आप इसे केवल पर्यवेक्षण (जो है UIImageView
) से हटा दें । [imageView removeFromSuperview]
।
आप एक उपवर्ग में फीका-इन सुविधा को भी पैकेज कर सकते हैं, ताकि आप इसे सामान्य UIImageView के रूप में उपयोग कर सकें, निम्न उदाहरण में:
IMMFadeImageView *fiv=[[IMMFadeImageView alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];
[self.view addSubview:fiv];
fiv.image=[UIImage imageNamed:@"initialImage.png"];
fiv.image=[UIImage imageNamed:@"fadeinImage.png"]; // fades in
एक संभावित कार्यान्वयन निम्नानुसार है।
नोट: जिस तरह से आप वास्तव में setImage:
फ़ंक्शन में फीका-इन लागू करते हैं, वह बदल सकता है, और इस प्रश्न के अन्य उत्तर में वर्णित अन्य उत्कृष्ट उदाहरणों में से एक हो सकता है - एक अतिरिक्त ऑन-द-फ्लाई बनाना UIImageView
जैसा कि मैं यहां कर रहा हूं। अपनी विशिष्ट स्थिति में अस्वीकार्य उपरि बनें ।
IMMFadeImageView.h :
#import <UIKit/UIKit.h>
@interface IMMFadeImageView : UIImageView
@property (nonatomic,assign) float fadeDuration;
@end
IMMFadeImageView.m :
#import "IMMFadeImageView.h"
@implementation IMMFadeImageView
@synthesize fadeDuration;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.fadeDuration=1;
}
return self;
}
-(void)setImage:(UIImage *)newImage{
if(!self.image||self.fadeDuration<=0){
super.image=newImage;
} else {
UIImageView *iv=[[UIImageView alloc] initWithFrame:self.bounds];
iv.contentMode=self.contentMode;
iv.image=super.image;
iv.alpha=1;
[self addSubview:iv];
super.image=newImage;
[UIView animateWithDuration:self.fadeDuration delay:0 options:UIViewAnimationCurveEaseInOut animations:^{
iv.alpha=0;
} completion:^(BOOL finished) {
[iv removeFromSuperview];
}];
}
}
उपरोक्त कोड कुछ मान्यताओं पर निर्भर करता है (ARC सहित आपकी XCode परियोजना में सक्षम होना), यह केवल अवधारणा के प्रमाण के रूप में है, और स्पष्टता और फ़ोकस के हित में, यह महत्वपूर्ण असंबंधित कोड को छोड़ कर प्रासंगिक रहता है। कृपया इसे आँख बंद करके कॉपी-पेस्ट न करें।
मुझे अनिश्चित काल तक दोहराने के लिए संक्रमण की आवश्यकता थी। इसके लिए एक परीक्षण और त्रुटि का एक बहुत लिया, लेकिन मैं अंत में मैं देख रहा था अंतिम परिणाम मिल गया। UITableViewCell में UIImageView में छवि एनीमेशन जोड़ने के लिए ये कोड स्निपेट हैं।
यहाँ प्रासंगिक कोड है:
@interface SomeViewController ()
@property(nonatomic, strong) NSMutableArray *imagesArray;
@property(nonatomic, assign) NSInteger varietyImageAnimationIndex;
@property(nonatomic, assign) BOOL varietyImagesAnimated;
@end
@implementation SomeViewController
@synthesize imagesArray;
@synthesize varietyImageAnimationIndex;
@synthesize varietyImagesAnimated;
...
// NOTE: Initialize the array of images in perhaps viewDidLoad method.
-(void)animateImages
{
varietyImageAnimationIndex++;
[UIView transitionWithView:varietyImageView
duration:2.0f
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
varietyImageView.image = [imagesArray objectAtIndex:varietyImageAnimationIndex % [imagesArray count]];
} completion:^(BOOL finished) {
[self animateImages];
}];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
[cell.imageView setImage:[imagesArray objectAtIndex:0]];
[self setVarietyImageView:cell.imageView];
if (! varietyImagesAnimated)
{
varietyImagesAnimated = YES;
[self animateImages];
}
...
return cell;
}
विकल्प के साथ खेलने UIView.transition()
और समस्याओं के बाद .transitionCrossDissolve
(मैं एक UIImageView के अंदर बदलने वाली चेतन छवियों की कोशिश कर रहा था और बिना एनीमेशन के संक्रमण तुरंत हो गया था) मुझे पता चला है कि आपको बस एक और विकल्प जोड़ने की आवश्यकता है जो आपको दृश्य के अंदर बदलने वाले चेतन गुणों को दे रहा है ( स्विफ्ट 4.2 ):
UIView.transition(with: self.imageView,
duration: 1,
options: [.allowAnimatedContent, .transitionCrossDissolve],
animations: { self.imageView.image = newImage },
completion: nil)
इसके अतिरिक्त: यदि आपकी छवि पर कोई साक्षात्कार है, तो इसे फिर से तैयार किया जाएगा और यह एनीमेशन को रोक सकता है। उदाहरण के लिए, मैंने अपनी छवि दृश्य पर धब्बा के साथ सबव्यू किया था और उस मामले में एनीमेशन काम नहीं करता है। इसलिए मैंने सिर्फ अपना दृष्टिकोण पदानुक्रम बदल दिया है और अपने स्वयं के दृश्य को धुंधला कर दिया है और इसे छवि दृश्य पर रख दिया है।
highlightedImage
संपत्ति का उपयोग करके इसे थोड़ा और सरल बनाया जा सकता है। यहाँ स्विफ्ट 3 में एक उदाहरण है। पहले सामान्य और हाइलाइट की गई छवि दोनों सेट करें:
let imageView = UIImageView(image: UIImage(named: "image"), highlightedImage: UIImage(named: "highlightedImage"))
और जब आप उन एनिमेटेड के बीच बदलना चाहते हैं:
UIView.transition(with: imageView, duration: 0.3, options: .transitionCrossDissolve, animations: { self.imageView.isHighlighted = !self.imageView.isHighlighted}, completion: .none)