পরিবর্তনের সময় কোনও ইউআইটিএলভিউ অ্যানিমেটের জন্য একটি পুনরায়লোড ডেটা রাখুন


183

আমার একটি ইউআইটিএবলভিউ রয়েছে যার দুটি মোড রয়েছে। যখন আমরা মোডগুলির মধ্যে স্যুইচ করি তখন আমার প্রতি বিভাগে আলাদা আলাদা বিভাগ এবং সেল রয়েছে। আদর্শভাবে, যখন টেবিলটি বড় হয় বা সঙ্কুচিত হয় তখন এটি কিছু শীতল অ্যানিমেশন করবে।

এখানে আমি চেষ্টা করেছি কোডটি, কিন্তু এটি কিছুই করে না:

CGContextRef context = UIGraphicsGetCurrentContext(); 
[UIView beginAnimations:nil context:context]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:0.5]; 

[self.tableView reloadData];
[UIView commitAnimations];

আমি কীভাবে এটি করতে পারি তার কোনও চিন্তাভাবনা?

উত্তর:


400

আসলে, এটি খুব সহজ:

[_tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];

ডকুমেন্টেশন থেকে :

এই পদ্ধতিতে কল করার কারণে সারণী দর্শনটিকে নির্দিষ্ট বিভাগগুলির জন্য নতুন কোষগুলির জন্য এটির ডেটা উত্স জিজ্ঞাসা করতে হবে। সারণী দর্শনটি পুরানো কোষগুলিকে আনিমেট করার সাথে সাথে নতুন কক্ষের সন্নিবেশকে অ্যানিমেট করে।


13
এবং কেবল এই পৃষ্ঠায় সেরা উত্তর!
ম্যাথিয়াস ডি

40
এটি সম্পূর্ণরূপে সঠিক নয়, কারণ এটি কেবলমাত্র প্রথম বিভাগটি পুনরায় লোড করবে। যদি আপনার টেবিলের একাধিক বিভাগ থাকে তবে এটি কাজ করবে না
নসরেটপ

4
কোনও ডেটা পরিবর্তিত না হলে আপনি একটি ব্যতিক্রম হবেন সম্ভবত .. আমার উত্তর
মতেজ

8
@ নসরেটট্যাপ: আপনি যদি আপনার টেবিলভিউ পুনরায় লোডের আরও বা সমস্ত বিভাগ রাখতে চান তবে আপনাকে যা করতে হবে তা হল আপনার এনএসআইডেক্সটসেটটি সমস্ত বিভাগ সূচী দিয়ে প্রসারিত করতে হবে, এটিকেও সতেজ করা দরকার
জোনেসি

সুইফ্ট সংস্করণ: _tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Fade)উল্লেখযোগ্যভাবে, যদিও এটি কেবল বিভাগ 0 আপডেট করে যা ডিফল্ট, প্রথম বিভাগ।
kbpontius

261

আপনি ব্যবহার করতে পারেন:

উদ্দেশ্য গ

[UIView transitionWithView: self.tableView
                  duration: 0.35f
                   options: UIViewAnimationOptionTransitionCrossDissolve
                animations: ^(void)
 {
      [self.tableView reloadData];
 }
                completion: nil];

দ্রুতগতি

UIView.transitionWithView(tableView,
                          duration: 0.35,
                          options: .TransitionCrossDissolve,
                          animations:
{ () -> Void in
    self.tableView.reloadData()
},
                          completion: nil);

সুইফট 3, 4 এবং 5

UIView.transition(with: tableView,
                  duration: 0.35,
                  options: .transitionCrossDissolve,
                  animations: { self.tableView.reloadData() }) // left out the unnecessary syntax in the completion block and the optional completion parameter

কোন ঝামেলা. : ডি

আপনি UIViewAnimationOptionTransitionsশীতল প্রভাবের জন্য আপনার যে কোনওটি ব্যবহার করতে পারেন:

  • transitionNone
  • transitionFlipFromLeft
  • transitionFlipFromRight
  • transitionCurlUp
  • transitionCurlDown
  • transitionCrossDissolve
  • transitionFlipFromTop
  • transitionFlipFromBottom

2
এটি কার্যকর যদি আপনার টেবিলভিউয়ের শুরু / শেষের অবস্থাটি খুব আলাদা হবে (এবং বিভাগগুলি এবং সারিগুলি যুক্ত / সরিয়ে ফেলতে গণনা করা জটিল হবে) তবে আপনি অ-অ্যানিমেটেড পুনরায় লোডের সাথে কিছুটা ঝাঁকুনি দিচ্ছেন।
বেন প্যাকার্ড

1
এটি পদ্ধতিতে অন্তর্নির্মিত টেবিলভিউটি পুনরায় লোড করার মতো দুর্দান্ত অ্যানিমেশন নয়, তবে এখানে উল্লিখিত উচ্চতর রেটযুক্ত পদ্ধতির বিপরীতে, আপনার একাধিক বিভাগ থাকলে এই কাজ করে।
মার্ক সেতুগুলি

1
বাহ বাকি সমস্ত চেষ্টা করার পরেও এটি আমার পক্ষে একেবারে নিখুঁত
লুকাশ গুসসেন

1
@ মার্কব্রিজেস উচ্চতর রেটযুক্ত উত্তরটি একাধিক বিভাগের সাথে কাজ করে :) -[_tableView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)] withRowAnimation:UITableViewRowAnimationFade];
লবিয়ানকো

2
@ অ্যান্টনি যদি শেষের রাষ্ট্রের শুরু করার চেয়ে আরও কম / কম বিভাগ থাকে তবে এটি কাজ করে না। তারপরে আপনাকে ম্যানুয়ালি ট্র্যাক করতে হবে কোন বিভাগগুলি যুক্ত / মোছা হয়েছে, যা বেশ ঝামেলা is
নিকোলভস্কি

78

CATransitionক্লাস ব্যবহার করে আরও বেশি স্বাধীনতা অর্জন করুন ।

এটি বিবর্ণ হওয়ার মধ্যেই সীমাবদ্ধ নয়, পাশাপাশি চলাচলও করতে পারে ..


উদাহরণ স্বরূপ:

(আমদানি করতে ভুলবেন না QuartzCore)

CATransition *transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.fillMode = kCAFillModeForwards;
transition.duration = 0.5;
transition.subtype = kCATransitionFromBottom;

[[self.tableView layer] addAnimation:transition forKey:@"UITableViewReloadDataAnimationKey"];

typeআপনার প্রয়োজন মেলাতে পরিবর্তন করুন , পছন্দ করুনkCATransitionFade etc.

সুইফটে বাস্তবায়ন:

let transition = CATransition()
transition.type = kCATransitionPush
transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition.fillMode = kCAFillModeForwards
transition.duration = 0.5
transition.subtype = kCATransitionFromTop
self.tableView.layer.addAnimation(transition, forKey: "UITableViewReloadDataAnimationKey")
// Update your data source here
self.tableView.reloadData()

ক্যাটারানসিশনের জন্য রেফারেন্স

সুইফট 5:

let transition = CATransition()
transition.type = CATransitionType.push
transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
transition.fillMode = CAMediaTimingFillMode.forwards
transition.duration = 0.5
transition.subtype = CATransitionSubtype.fromTop
self.tableView.layer.add(transition, forKey: "UITableViewReloadDataAnimationKey")
// Update your data source here
self.tableView.reloadData()

এটি একক সারি / বিভাগের পরিবর্তে পুরো টেবিলটিকে অ্যানিমেট করে।
আগোগোস

@ অগোস এটি এখনও প্রশ্নের উত্তর দেয়। একটি প্রশ্নের "কীভাবে কেবলমাত্র এক সারি পুনরায় লোড করবেন" এর একটি পৃথক উত্তর রয়েছে যেমন অ্যানিমেশনটি প্রয়োগ layerকরা UITableViewCell
মতেজ

@ মেটজক্রামনি আমি টেবিলটি কেবলমাত্র বিভিন্ন সারিটি সঞ্চারিত করার প্রত্যাশা করেছিল (প্রশ্নে উল্লেখ করা হয়েছে), তবে এই পদ্ধতিটি সমস্ত টেবিলকে একবারে ঠেলে দেয়। আমি কি কিছু মিস করছি?
Agos

@ আগম হুম না এটি করার কথা নয়। কোয়ার্টজকোর সরাসরি দর্শন পরিবর্তন করে কারণ এটি কেবল অর্ধেক টেবিলটি করতে পারে না। আপনি টেবিল ভিউ থেকে ঘরগুলি পাওয়ার চেষ্টা করতে পারেন এবং তারপরে এই অ্যানিমেশনটি প্রতিটিটিতে প্রয়োগ করতে পারেন (তবে এটি কার্যকর হবে তা নিশ্চিত নয়)
মেটেজ

2
কেসিএটি ট্রান্সিশনফিডের সাথে একটি কবজির মতো কাজ করেছে ধন্যবাদ! :)
কোয়ারেজ

60

আমি বিশ্বাস করি আপনি কেবল আপনার ডেটা কাঠামো আপডেট করতে পারবেন, তারপরে:

[tableView beginUpdates];
[tableView deleteSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:YES];
[tableView insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:YES];
[tableView endUpdates];

এছাড়াও, "উইথরো অ্যানিমেশন" হুবহু বুলিয়ান নয়, তবে একটি অ্যানিমেশন স্টাইল:

UITableViewRowAnimationFade,
UITableViewRowAnimationRight,
UITableViewRowAnimationLeft,
UITableViewRowAnimationTop,
UITableViewRowAnimationBottom,
UITableViewRowAnimationNone,
UITableViewRowAnimationMiddle

সরল স্টাফ, তবে ট্র্যাক ডক্সের চেয়ে সরাসরি স্ট্যাকওভারফ্লোতে যেতে এবং আপনার প্রয়োজনীয় স্নিপেট পেতে get । ধন্যবাদ!
জ্যাস্পার ব্লুজ

24

এই সমস্ত উত্তর অনুমান করে যে আপনি কেবল 1 বিভাগ দিয়ে একটি ইউআইটিএবলভিউ ব্যবহার করছেন।

আপনার 1 টিরও বেশি বিভাগের পরিস্থিতি সঠিকভাবে পরিচালনা করতে:

NSRange range = NSMakeRange(0, myTableView.numberOfSections);
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:range];
[myTableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];

(দ্রষ্টব্য: আপনার নিশ্চিত হওয়া উচিত যে আপনার 0 টিরও বেশি বিভাগ রয়েছে!)

আরেকটি বিষয় লক্ষণীয় হ'ল আপনি যদি এই কোডটি সহ একই সাথে আপনার ডেটা উত্স আপডেট করার চেষ্টা করেন তবে আপনি NSInternInconsistencyException এ চলে যেতে পারেন। যদি এটি হয় তবে আপনি এটির মতো যুক্তি ব্যবহার করতে পারেন:

int sectionNumber = 0; //Note that your section may be different

int nextIndex = [currentItems count]; //starting index of newly added items

[myTableView beginUpdates];

for (NSObject *item in itemsToAdd) {
    //Add the item to the data source
    [currentItems addObject:item];

    //Add the item to the table view
    NSIndexPath *path = [NSIndexPath indexPathForRow:nextIndex++ inSection:sectionNumber];
    [myTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationAutomatic];
}

[myTableView endUpdates];

3
বিভাগের গণনা সম্পর্কে ভাল বক্তব্য, তবে আমার কেবল একটি বিভাগ ছিল এবং আপনার কোডটিতে একের পর এক ত্রুটি ছিল। আমাকে আপনার কোডের প্রথম লাইনটি এনএসআরঞ্জ পরিসীমা = এনএসমেকরেঞ্জ (0, myTableView.numberOfSections) এ পরিবর্তন করতে হয়েছিল;
দানিয়াল আয়তেকিন

18

এর কাছে যাওয়ার উপায়টি হ'ল টেবিলভিউকে সারি এবং বিভাগগুলি সরিয়ে এবং যুক্ত করতে বলুন

insertRowsAtIndexPaths:withRowAnimation:,
deleteRowsAtIndexPaths:withRowAnimation:,
insertSections:withRowAnimation:এবং
deleteSections:withRowAnimation:

ইউআইটিএলভিউয়ের পদ্ধতিগুলি।

আপনি যখন এই পদ্ধতিগুলি কল করেন, সারণীটি আপনার অনুরোধ করা আইটেমগুলিকে আউট / আভীট করবে, তারপরে নিজেকে পুনরায় লোডডাটা কল করবে যাতে আপনি এই অ্যানিমেশনের পরে রাষ্ট্র আপডেট করতে পারেন। এই অংশটি গুরুত্বপূর্ণ - আপনি যদি সমস্ত কিছু সরিয়ে ফেলেন তবে টেবিলের ডেটাসোর্স দ্বারা ফিরিয়ে নেওয়া ডেটা পরিবর্তন না করেন তবে অ্যানিমেশনটি সম্পূর্ণ হওয়ার পরে সারিগুলি আবার প্রদর্শিত হবে।

সুতরাং, আপনার অ্যাপ্লিকেশন প্রবাহটি হ'ল:

[self setTableIsInSecondState:YES];

[myTable deleteSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:YES]];

আপনার টেবিলের ডেটা সোর্স পদ্ধতি যতক্ষণ না পরীক্ষা করে [self tableIsInSecondState](বা যাই হোক না কেন) বিভাগ এবং সারিগুলির সঠিক নতুন সেটটি ফিরিয়ে দেয়, এটি আপনার সন্ধানের প্রভাবটি অর্জন করবে।


16

আমি উপরের উত্তরে মন্তব্য করতে পারি না, তবে একটি দ্রুত বাস্তবায়ন হবে:

self.tableView.reloadSections([0], with: UITableViewRowAnimation.fade)

রিলোডসেকশনের জন্য প্রথম যুক্তিতে আপনি যতগুলি বিভাগ আপডেট করতে চান তা অন্তর্ভুক্ত করতে পারেন।

ডক্স থেকে উপলব্ধ অন্যান্য অ্যানিমেশন: https://developer.apple.com/references/uikit/uitableviewrowanimation

বিবর্ণ tableোকানো বা মুছে ফেলা সারি বা সারিগুলি বিবরণটি টেবিলের দৃশ্যের বাইরে বা বাইরে।

ডানদিকে প্রবেশ করানো সারি বা সারিগুলি স্লাইড করে; মুছে ফেলা সারি বা সারি ডানদিকে স্লাইড।

বাম দিকে rowোকানো সারি বা সারিগুলি স্লাইড করে; মুছে ফেলা সারি বা সারিগুলি বাম দিকে স্লাইড হয়।

উপরে fromোকানো সারি বা সারিগুলি উপরে থেকে স্লাইড হয়; মুছে ফেলা সারি বা সারি শীর্ষে স্লাইড হয়।

পাদ থেকে rowোকানো সারি বা সারিগুলি স্লাইড করে; মুছে ফেলা সারি বা সারি নীচের দিকে স্লাইড।

কেস না কোনও Theোকানো বা মুছে ফেলা সারিগুলি ডিফল্ট অ্যানিমেশনগুলি ব্যবহার করে।

মাঝখানে টেবিল ভিউ পুরানো এবং নতুন কক্ষগুলিকে তারা স্থান দখল করবে বা স্থান দখল করবে সেদিকে কেন্দ্র করে রাখার চেষ্টা করে। আইফোন 3.2 এ উপলব্ধ।

স্বয়ংক্রিয়ভাবে টেবিল ভিউ আপনার জন্য উপযুক্ত অ্যানিমেশন শৈলী চয়ন করে। (আইওএস 5.0 এ পরিচিত।)


1
সুইফট ৪.২ এর জন্য: সেল্ফ.ট্যাবলভিউ.রেলোডসেকশনস [[0], এর সাথে: ইউআইটিবেল ভিউ.রোউ অ্যানিমেশন.ফ্যাড)
পুনরায় পুনর্নির্ধারণ

14

@ ডার্মাল উত্তরের জন্য সুইফট 4 সংস্করণ:

tableView.reloadSections(IndexSet(integer: 0), with: .automatic)

9

সুইফ্ট বাস্তবায়ন:

let range = NSMakeRange(0, self.tableView!.numberOfSections())
let indexSet = NSIndexSet(indexesInRange: range)
self.tableView!.reloadSections(indexSet, withRowAnimation: UITableViewRowAnimation.Automatic)


1

আমার ক্ষেত্রে, আমি টেবিলভিউতে আরও 10 টি সারি যুক্ত করতে চেয়েছিলাম ("আরও ফলাফল দেখানোর জন্য" কার্যকারিতার ধরণের জন্য) এবং আমি নিম্নলিখিতটি করেছি:

  NSInteger tempNumber = self.numberOfRows;
  self.numberOfRows += 10;
  NSMutableArray *arrayOfIndexPaths = [[NSMutableArray alloc] init];
  for (NSInteger i = tempNumber; i < self.numberOfRows; i++) {
    [arrayOfIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]];
  }
  [self.tableView beginUpdates];
  [self.tableView insertRowsAtIndexPaths:arrayOfIndexPaths withRowAnimation:UITableViewRowAnimationTop];
  [self.tableView endUpdates];

বেশিরভাগ ক্ষেত্রে, "self.numberOfRows" এর পরিবর্তে, আপনি সাধারণত টেবিল ভিউয়ের জন্য অবজেক্টগুলির অ্যারের গণনাটি ব্যবহার করবেন। সুতরাং এই সমাধানটি আপনার পক্ষে কার্যকরভাবে কাজ করে তা নিশ্চিত করার জন্য, "অ্যারেঅফ ইন্ডেক্সপ্যাথস" সন্নিবেশ করা হচ্ছে এমন সারিগুলির সূচী পথগুলির একটি সঠিক অ্যারে হওয়া দরকার। যদি এই সূচী পথগুলির জন্য সারিটি বিদ্যমান থাকে তবে কোডটি ক্র্যাশ হতে পারে, সুতরাং ক্র্যাশ হওয়া এড়াতে এই সূচক পাথগুলির জন্য আপনার "পুনরায় লোডআরটসঅ্যাট ইন্ডেক্সপথগুলি: রআউ অ্যানিমেশন:" পদ্ধতিটি ব্যবহার করা উচিত


1

আপনি যদি ইউআইটিবেবল ভিউ সেলগুলিতে নিজস্ব কাস্টম অ্যানিমেশন যুক্ত করতে চান তবে ব্যবহার করুন

[theTableView reloadData];
[theTableView layoutSubviews];
NSArray* visibleViews = [theTableView visibleCells];

দৃশ্যমান কক্ষগুলির একটি অ্যারে পেতে। তারপরে প্রতিটি ঘরে কোনও কাস্টম অ্যানিমেশন যুক্ত করুন।

মসৃণ কাস্টম সেল অ্যানিমেশনের জন্য পোস্ট করা এই টুকরোটি দেখুন। https://gist.github.com/floprr/1b7a58e4a18449d962bd


1

মধ্যে reloadData () ছাড়া অ্যানিমেট সুইফট ভালো কাজ করা যেতে পারে (সংস্করণ 2.2 এর হিসাবে):

tableview.beginUpdates()
var indexPathsToDeleteForAnimation: [NSIndexPath] = []
var numOfCellsToRemove = ArrayOfItemsToRemove ?? 0

// Do your work here
while numOfCellsToRemove > 0 {
    // ...or here, if you need to add/remove the same amount of objects to/from somewhere
    indexPathsToDeleteForAnimation.append(NSIndexPath(forRow: selectedCellIndex+numOfCellsToRemove, inSection: 0))
    numOfCellsToRemove -= 1
}
tableview.deleteRowsAtIndexPaths(indexPathsToDeleteForAnimation, withRowAnimation: UITableViewRowAnimation.Right)
tableview.endUpdates()

অ্যানিমেশন শেষ হওয়ার পরে আপনার যদি পুনরায় লোডডাটা () কল করতে হবে, আপনি CATransaction এ পরিবর্তনগুলি এইভাবে আলিঙ্গন করতে পারেন:

CATransaction.begin()
CATransaction.setCompletionBlock({() in self.tableview.reloadData() })
tableview.beginUpdates()
var indexPathsToDeleteForAnimation: [NSIndexPath] = []
var numOfCellsToRemove = ArrayOfItemsToRemove.count ?? 0

// Do your work here
while numOfCellsToRemove > 0 {
     // ...or here, if you need to add/remove the same amount of objects to/from somewhere
     indexPathsToDeleteForAnimation.append(NSIndexPath(forRow: selectedCellIndex+numOfCellsToRemove, inSection: 0))
     numOfCellsToRemove -= 1
}
tableview.deleteRowsAtIndexPaths(indexPathsToDeleteForAnimation, withRowAnimation: UITableViewRowAnimation.Right)
tableview.endUpdates()
CATransaction.commit()

যুক্তিটি যখন সারিগুলি মুছবে তখন মামলার জন্য প্রদর্শিত হয়, তবে একই ধারণাটি সারি যুক্ত করার জন্যও কাজ করে। আপনি অ্যানিমেশনটি UITableViewRowAnimation এও পরিবর্তন করতে পারেন it এটিকে পরিষ্কার করার জন্য বাম বা অন্য উপলব্ধ অ্যানিমেশনগুলির তালিকা থেকে চয়ন করুন from


1
CATransition *animation = [CATransition animation];
animation.duration = .3;
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromLeft];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[animation setDuration:.3];

[[_elementTableView layer] addAnimation:animation forKey:@"UITableViewReloadDataAnimationKey"];

[tableView reloadData];

2
.3দু'বার সময়সীমা কেন সেট করবেন ?
পাং

1

সমস্ত বিভাগ পুনরায় লোড করতে , কেবল একটি দিয়ে নয় কাস্টম সময়কাল

কাস্টম সময়কাল সেট করতে ব্যবহারকারী durationপ্যারামিটার UIView.animate

UIView.animate(withDuration: 0.4, animations: { [weak self] in
    guard let `self` = self else { return }
    let indexSet = IndexSet(integersIn: 0..<self.tableView.numberOfSections)
    self.tableView.reloadSections(indexSet, with: UITableView.RowAnimation.fade)
})

0

সুইফটে নেটিভ UITableViewঅ্যানিমেশন

tableView.performBatchUpdatesএকসাথে সারিগুলি সন্নিবেশ করান এবং মুছুন যাতে সেগুলি একই সাথে ঘটে। @ আইকেনড্যাক ব্যবহারের পদ্ধতিগুলি থেকে উত্তরের উপর ভিত্তি করে তৈরি করা:

  • tableView.insertSections
  • tableView.insertRows
  • tableView.deleteSections
  • tableView.deleteRows

উদা:

 tableView.performBatchUpdates({
   tableView.insertSections([0], with: .top)
 })

এটি শূন্য অবস্থানে একটি অ্যানিমেশন সহ একটি বিভাগ সন্নিবেশ করান যা উপরে থেকে লোড হয়। এটি আবার চালাবেcellForRowAt পদ্ধতিটি এবং সেই অবস্থানে একটি নতুন কক্ষ অনুসন্ধান করবে। আপনি নির্দিষ্ট অ্যানিমেশন সহ পুরো টেবিল ভিউটি পুনরায় লোড করতে পারেন।

পুনরায়: ও.পি. প্রশ্ন, বিকল্প সারণী দর্শন রাষ্ট্রের জন্য ঘরগুলি দেখানোর জন্য শর্তযুক্ত পতাকা প্রয়োজন ছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.