দুটি তৈরি করার পরিবর্তে UIImageViews
, কেবলমাত্র image
একটি দৃশ্যের পরিবর্তনটি যুক্তিসঙ্গত বলে মনে হয় । যদি আমি এটি করি তবে তাত্ক্ষণিক স্যুইচের পরিবর্তে দুটি চিত্রের মধ্যে কোনও বিবর্ণ / ক্রস দ্রবীভূত হওয়ার কোনও উপায় আছে কি?
দুটি তৈরি করার পরিবর্তে UIImageViews
, কেবলমাত্র image
একটি দৃশ্যের পরিবর্তনটি যুক্তিসঙ্গত বলে মনে হয় । যদি আমি এটি করি তবে তাত্ক্ষণিক স্যুইচের পরিবর্তে দুটি চিত্রের মধ্যে কোনও বিবর্ণ / ক্রস দ্রবীভূত হওয়ার কোনও উপায় আছে কি?
উত্তর:
সম্পাদনা করুন: নীচে @ অ্যালগাল থেকে আরও ভাল সমাধান রয়েছে ।
এটি করার আরেকটি উপায় হ'ল পূর্বনির্ধারিত সিএএনিমেশন ট্রানজিশনগুলি ব্যবহার করে:
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;
অ্যাপল থেকে রূপান্তর উদাহরণ দেখুন প্রকল্পটি দেখুন: https://developer.apple.com/library/content/samplecode/ViewTransitions/Intrication/Intro.html#//apple_ref/doc/uid/DTS40007411
নতুন ব্লক-ভিত্তিক, UIKit animation
পদ্ধতিগুলি ব্যবহার করে এটি অনেক সহজ হতে পারে ।
ধরুন নীচের কোডটি ভিউ কন্ট্রোলারে রয়েছে এবং আপনি যে ইউআইআইমেজভিউটি ক্রস-দ্রবীভূত করতে চান সেটি হল সম্পত্তিটির মাধ্যমে সম্বোধনযোগ্য সেলফ ভিউর একটি সংক্ষিপ্তসার তবে 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
এই জন্য মোকাবেলা । এর জন্য আপনাকে কোর অ্যানিমেশনটি আমদানি করতে হবে।
+ (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]
।
আপনি একটি সাবক্লাসে ফেড-ইন বৈশিষ্ট্যটি প্যাকেজও করতে পারেন, যাতে আপনি নীচের উদাহরণের মতো এটি সাধারণ ইউআইআইমেজভিউ হিসাবে ব্যবহার করতে পারেন:
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
হতে পারে - আমি এখানে যা করছিলাম তত বাড়তি ফ্লাই তৈরি করা হতে পারে আপনার নির্দিষ্ট পরিস্থিতিতে একটি অগ্রহণযোগ্য ওভারহেড হতে হবে ।
আইএমএমফ্যাডআইমেজভিউ। H :
#import <UIKit/UIKit.h>
@interface IMMFadeImageView : UIImageView
@property (nonatomic,assign) float fadeDuration;
@end
আইএমএমফেইডআইমেজভিউ.এম :
#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];
}];
}
}
উপরের কোডটি কয়েকটি অনুমানের উপর নির্ভর করে (আপনার এক্সকোড প্রকল্পে এটিআরসি সক্ষম করা সহ) কেবলমাত্র ধারণার প্রমাণ হিসাবেই উদ্দিষ্ট, এবং স্পষ্টতা এবং ফোকাসের স্বার্থে, এটি গুরুত্বপূর্ণ সম্পর্কযুক্ত কোড বাদ দিয়ে প্রাসঙ্গিক থাকে। দয়া করে এটি অন্ধভাবে কপি-পেস্ট করবেন না।
অনির্দিষ্টকালের জন্য পুনরাবৃত্তি করার জন্য আমার উত্তরণ দরকার needed এটির জন্য এটি অনেক পরীক্ষা এবং ত্রুটি নিয়েছে তবে শেষ পর্যন্ত আমি যে ফলাফলটি সন্ধান করছি তা পেয়েছি। এটি কোনও ইউআইটিএবলভিউসেলটিতে কোনও ইউআইআইমেজভিউতে চিত্র অ্যানিমেশন যুক্ত করার জন্য কোড স্নিপেট।
এখানে প্রাসঙ্গিক কোড:
@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
(আমি একটি ইউআইআইভিউভিউয়ের অভ্যন্তরে চিত্রগুলি পরিবর্তন করার চেষ্টা করছিলাম এবং অ্যানিমেশন ছাড়াই তাত্ক্ষণিকভাবে ঘটেছে) আমি জানতে পেরেছিলাম যে আপনাকে আরও একটি বিকল্প যুক্ত করতে হবে যা আপনাকে ভিউয়ের অভ্যন্তরে বৈশিষ্ট্যগুলি পরিবর্তন করতে দেয় ( সুইফট ৪.২ ):
UIView.transition(with: self.imageView,
duration: 1,
options: [.allowAnimatedContent, .transitionCrossDissolve],
animations: { self.imageView.image = newImage },
completion: nil)
তদতিরিক্ত: আপনার চিত্রভিউতে যদি আপনার কোনও মতামত থাকে তবে এটি আবারও চিত্রায়িত হবে এবং এটি অ্যানিমেশনটিকে আটকাতে পারে। উদাহরণস্বরূপ, আমার ইমেজভিউতে অস্পষ্টতার সাথে আমার সাবভিউ ছিল এবং সে ক্ষেত্রে অ্যানিমেশনটি কাজ করে না। সুতরাং আমি স্রেফ আমার দর্শন শ্রেণিবিন্যাস পরিবর্তন করেছি এবং অস্পষ্টতাকে তার নিজের দৃষ্টিতে সরিয়ে নিয়ে ইমেজভিউয়ের উপরে রেখেছি।
highlightedImage
সম্পত্তি ব্যবহার করে এটিকে আরও কিছুটা সহজ করা যায়। এখানে সুইফট ৩-এর একটি উদাহরণ রয়েছে প্রথমে সাধারণ এবং হাইলাইট উভয় চিত্রই সেট করুন:
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)