Создание UICollectionView программно
Я ищу руководство или учебник, который покажет мне, как настроить простой UICollectionView, используя только код.
я пробираюсь через документация на сайте яблоки, и я использую справочник как хорошо.
но я действительно выиграю от простого руководства, которое может показать мне, как настроить UICollectionView без необходимости использовать раскадровки или файлы XIB / NIB - но, к сожалению, когда я ищу, все, что я могу найти, это учебники, которые показывают раскадровку.
10 ответов:
файл заголовка:--
@interface ViewController : UIViewController<UICollectionViewDataSource,UICollectionViewDelegateFlowLayout> { UICollectionView *_collectionView; }
Файл Реализации:--
- (void)viewDidLoad { [super viewDidLoad]; self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init]; _collectionView=[[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout]; [_collectionView setDataSource:self]; [_collectionView setDelegate:self]; [_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellIdentifier"]; [_collectionView setBackgroundColor:[UIColor redColor]]; [self.view addSubview:_collectionView]; // Do any additional setup after loading the view, typically from a nib. } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return 15; } // The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath: - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath]; cell.backgroundColor=[UIColor greenColor]; return cell; } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { return CGSizeMake(50, 50); }
выход---
для пользователя swift4:--
class TwoViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UICollectionViewDelegate { override func viewDidLoad() { super.viewDidLoad() self.collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: flowLayout) collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "collectionCell") collectionView.delegate = self collectionView.dataSource = self collectionView.backgroundColor = UIColor.cyan self.view.addSubview(collectionView) } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 20 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath as IndexPath) cell.backgroundColor = UIColor.green return cell } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { return CGSize(width: 50, height: 50) } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { return UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5) } }
Для Swift 2.0
вместо реализации методов, которые необходимы для рисования
CollectionViewCells
:func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { return CGSizeMake(50, 50); } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { return UIEdgeInsetsMake(5, 5, 5, 5); //top,left,bottom,right }
использовать
UICollectionViewFlowLayout
реализоватьfunc createCollectionView() { let flowLayout = UICollectionViewFlowLayout() // Now setup the flowLayout required for drawing the cells let space = 5.0 as CGFloat // Set view cell size flowLayout.itemSize = CGSizeMake(50, 50) // Set left and right margins flowLayout.minimumInteritemSpacing = space // Set top and bottom margins flowLayout.minimumLineSpacing = space // Finally create the CollectionView let collectionView = UICollectionView(frame: CGRectMake(10, 10, 300, 400), collectionViewLayout: flowLayout) // Then setup delegates, background color etc. collectionView?.dataSource = self collectionView?.delegate = self collectionView?.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cellID") collectionView?.backgroundColor = UIColor.whiteColor() self.view.addSubview(collectionView!) }
UICollectionViewDataSource
методами по мере необходимости:func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 20; } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { var cell:UICollectionViewCell=collectionView.dequeueReusableCellWithReuseIdentifier("collectionCell", forIndexPath: indexPath) as UICollectionViewCell; cell.backgroundColor = UIColor.greenColor(); return cell; } func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { // #warning Incomplete implementation, return the number of sections return 1 }
Swift 3
class TwoViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UICollectionViewDelegate { override func viewDidLoad() { super.viewDidLoad() let flowLayout = UICollectionViewFlowLayout() let collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: flowLayout) collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "collectionCell") collectionView.delegate = self collectionView.dataSource = self collectionView.backgroundColor = UIColor.cyan self.view.addSubview(collectionView) } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 20 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath as IndexPath) cell.backgroundColor = UIColor.green return cell } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: 50, height: 50) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { return UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5) } }
построение ответа @Warewolf, следующим шагом является создание собственной пользовательской ячейки.
на
File -> New -> File -> User Interface -> Empty -> Call
этот ниб"customNib"
.в своем
customNib
перетащите aUICollectionView
ячейки. Дайте ему повторно использовать идентификатор ячейки@"Cell"
.
File -> New -> File -> Cocoa Touch Class -> Class
имени"CustomCollectionViewCell"
подкласс ifUICollectionViewCell
.вернитесь к пользовательскому наконечнику, щелкните ячейку и создайте этот пользовательский класс
"CustomCollectionViewCell"
.иди к своему
viewDidLoad
viewcontroller
и вместо
[_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
есть
UINib *nib = [UINib nibWithNibName:@"customNib" bundle:nil]; [_collectionView registerNib:nib forCellWithReuseIdentifier:@"Cell"];
кроме того, измените (на ваш новый идентификатор ячейки)
UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
вы можете обрабатывать пользовательские ячейки в представлении uicollection см. ниже код.
- (void)viewDidLoad { UINib *nib2 = [UINib nibWithNibName:@"YourCustomCell" bundle:nil]; [CollectionVW registerNib:nib2 forCellWithReuseIdentifier:@"YourCustomCell"]; UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; [flowLayout setItemSize:CGSizeMake(200, 230)]; flowLayout.minimumInteritemSpacing = 0; [flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical]; [CollectionVW setCollectionViewLayout:flowLayout]; [CollectionVW reloadData]; } #pragma mark - COLLECTIONVIEW #pragma mark Collection View CODE -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return 1; } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return Array.count; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"YourCustomCell"; YourCustomCell *cell = (YourCustomCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; cell.MainIMG.image=[UIImage imageNamed:[Array objectAtIndex:indexPath.row]]; return cell; } -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { } #pragma mark Collection view layout things // Layout: Set cell size - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { CGSize mElementSize; mElementSize=CGSizeMake(kScreenWidth/3.4, 150); return mElementSize; } - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { return 5.0; } // Layout: Set Edges - (UIEdgeInsets)collectionView: (UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { if (isIphone5 || isiPhone4) { return UIEdgeInsetsMake(15,15,5,15); // top, left, bottom, right } else if (isIphone6) { return UIEdgeInsetsMake(15,15,5,15); // top, left, bottom, right } else if (isIphone6P) { return UIEdgeInsetsMake(15,15,5,15); // top, left, bottom, right } return UIEdgeInsetsMake(15,15,5,15); // top, left, bottom, right }
Apple Docs:
- (id)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layoutParameters
используйте этот метод при инициализации объекта представления коллекции программно. Если для параметра layout указано значение nil, то необходимо присвоить объект макета в собственность collectionViewLayout перед отображением представления коллекции на экране. Если вы этого не сделаете, то представление коллекции не сможет отображать какие-либо элементы на экране.
этот метод является назначенным инициализатором.
этот метод используется для инициализации
UICollectionView
. здесь вы предоставляете кадр иUICollectionViewLayout
"объект".UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
в конце добавить
UICollectionView
какsubview
на ваш взгляд.теперь представление коллекции добавляется Pro грамматически. Вы можете продолжать учиться.
Счастливого обучения!! Надеюсь, это поможет вам.
#pragma mark - #pragma mark - UICollectionView Datasource and Delegates -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return 1; } -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return Arr_AllCulturalButtler.count; } -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { static NSString *coll=@"FromCulturalbutlerCollectionViewCell"; FromCulturalbutlerCollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:coll forIndexPath:indexPath]; cell.lbl_categoryname.text=[[Arr_AllCulturalButtler objectAtIndex:indexPath.row] Category_name]; cell.lbl_date.text=[[Arr_AllCulturalButtler objectAtIndex:indexPath.row] event_Start_date]; cell.lbl_location.text=[[Arr_AllCulturalButtler objectAtIndex:indexPath.row] Location_name]; [cell.Img_Event setImageWithURL:[APPDELEGATE getURLForMediumSizeImage:[(EventObj *)[Arr_AllCulturalButtler objectAtIndex:indexPath.row] Event_image_name]] placeholderImage:nil usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; cell.button_Bookmark.selected=[[Arr_AllCulturalButtler objectAtIndex:indexPath.row] Event_is_bookmarked]; [cell.button_Bookmark addTarget:self action:@selector(btn_bookmarkClicked:) forControlEvents:UIControlEventTouchUpInside]; cell.button_Bookmark.tag=indexPath.row; return cell; } - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:SEGUE_CULTURALBUTLER_KULTURELLIS_DETAIL sender:self]; } // stroy board navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"Overview_Register"]) { WDRegisterViewController *obj=(WDRegisterViewController *)[segue destinationViewController]; obj.str_Title=@"Edit Profile"; obj.isRegister=NO; } } [self performSegueWithIdentifier:@"Overview_Measure" sender:nil]; UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; WDPeekViewController *Peek = (WDPeekViewController *)[sb instantiateViewControllerWithIdentifier:@"WDPeekViewController"]; [self.navigationController pushViewController:tabBarController animated:YES];
swift 4 code // // ViewController.swift // coolectionView // import UIKit class ViewController: UIViewController , UICollectionViewDataSource, UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{ @IBOutlet weak var collectionView: UICollectionView! var items = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48"] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return self.items.count } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { if indexPath.row % 3 != 0 { return CGSize(width:collectionView.frame.width/2 - 7.5 , height: 100) } else { return CGSize(width:collectionView.frame.width - 10 , height: 100 ) } } // make a cell for each cell index path func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { // get a reference to our storyboard cell let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell1234", for: indexPath as IndexPath) as! CollectionViewCell1234 // Use the outlet in our custom class to get a reference to the UILabel in the cell cell.lbl1.text = self.items[indexPath.item] cell.backgroundColor = UIColor.cyan // make cell more visible in our example project cell.layer.borderColor = UIColor.black.cgColor cell.layer.borderWidth = 1 cell.layer.cornerRadius = 8 return cell } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { // handle tap events print("You selected cell #\(indexPath.item)!") } }
colection view exam
#import "CollectionViewController.h" #import "BuyViewController.h" #import "CollectionViewCell.h" @interface CollectionViewController () { NSArray *mobiles; NSArray *costumes; NSArray *shoes; NSInteger selectpath; NSArray *mobilerate; NSArray *costumerate; NSArray *shoerate; } @end @implementation CollectionViewController - (void)viewDidLoad { [super viewDidLoad]; self.title = self.receivename; mobiles = [[NSArray alloc]initWithObjects:@"7.jpg",@"6.jpg",@"5.jpg", nil]; costumes = [[NSArray alloc]initWithObjects:@"shirt.jpg",@"costume2.jpg",@"costume1.jpg", nil]; shoes = [[NSArray alloc]initWithObjects:@"shoe.jpg",@"shoe1.jpg",@"shoe2.jpg", nil]; mobilerate = [[NSArray alloc]initWithObjects:@"10000",@"11000",@"13000",nil]; costumerate = [[NSArray alloc]initWithObjects:@"699",@"999",@"899", nil]; shoerate = [[NSArray alloc]initWithObjects:@"599",@"499",@"300", nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return 1; } -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return 3; } -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellId = @"cell"; UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath]; UIImageView *collectionImg = (UIImageView *)[cell viewWithTag:100]; if ([self.receivename isEqualToString:@"Mobiles"]) { collectionImg.image = [UIImage imageNamed:[mobiles objectAtIndex:indexPath.row]]; } else if ([self.receivename isEqualToString:@"Costumes"]) { collectionImg.image = [UIImage imageNamed:[costumes objectAtIndex:indexPath.row]]; } else { collectionImg.image = [UIImage imageNamed:[shoes objectAtIndex:indexPath.row]]; } return cell; } -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { selectpath = indexPath.row; [self performSegueWithIdentifier:@"buynow" sender:self]; } // In a storyboard-based application, you will often want to do a little - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"buynow"]) { BuyViewController *obj = segue.destinationViewController; if ([self.receivename isEqualToString:@"Mobiles"]) { obj.reciveimg = [mobiles objectAtIndex:selectpath]; obj.labelrecive = [mobilerate objectAtIndex:selectpath]; } else if ([self.receivename isEqualToString:@"Costumes"]) { obj.reciveimg = [costumes objectAtIndex:selectpath]; obj.labelrecive = [costumerate objectAtIndex:selectpath]; } else { obj.reciveimg = [shoes objectAtIndex:selectpath]; obj.labelrecive = [shoerate objectAtIndex:selectpath]; } // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } } @end
.файл H
@interface CollectionViewController : UIViewController<UICollectionViewDelegate,UICollectionViewDataSource> @property (strong, nonatomic) IBOutlet UICollectionView *collectionView; @property (strong,nonatomic) NSString *receiveimg; @property (strong,nonatomic) NSString *receivecostume; @property (strong,nonatomic)NSString *receivename; @end