Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«iOS. ΠŸΡ€ΠΈΠ΅ΠΌΡ‹ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 60

Автор Π’Π°Π½Π΄Π°Π΄ Нахавандипур

5. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚ΡŒ Π²ΠΈΠ΄Ρ‹ Π²Π΅Ρ€Ρ…Π½ΠΈΡ… ΠΈ Π½ΠΈΠΆΠ½ΠΈΡ… ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Ρ‹, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ collectionView: viewForSupplementaryElementOfKind: atIndexPath: источника Π΄Π°Π½Π½Ρ‹Ρ… сборного Π²ΠΈΠ΄Π°, Π° Π² этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ запуститС Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ сборного Π²ΠΈΠ΄Π°, dequeueReusableSupplementaryViewOfKind: withReuseIdentifier: forIndexPath:, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹ΠΉ Π²ΠΈΠ΄ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΈΠ»ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»Π°.

6. ΠΠ°ΠΊΠΎΠ½Π΅Ρ†, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²ΠΈΠ΄ΠΎΠ² для Π²Π΅Ρ€Ρ…Π½ΠΈΡ… ΠΈ Π½ΠΈΠΆΠ½ΠΈΡ… ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»ΠΎΠ² задаСтся ΠΏΡƒΡ‚Π΅ΠΌ присваивания ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ свойствам headerReferenceSize ΠΈ footerReferenceSize ΠΌΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅Π³ΠΎ Π·Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Π˜Ρ‚Π°ΠΊ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ трСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ. xib-Ρ„Π°ΠΉΠ»Ρ‹ для ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π²Π΅Ρ€Ρ…Π½ΠΈΡ… ΠΈ Π½ΠΈΠΆΠ½ΠΈΡ… ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»ΠΎΠ². НазовСм ΠΈΡ… Header.xib ΠΈ Footer.xib. ΠœΡ‹ создаСм ΠΈΡ… ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описан Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 5.5, поэтому я Π½Π΅ Π±ΡƒΠ΄Ρƒ вновь ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ здСсь этот ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π». Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ для Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΈ для Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»Π° Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ классу Objective-C. НазовитС ΠΈΡ… соотвСтствСнно Header ΠΈ Footer. НСобходимо Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° этих класса Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΎΡ‚ UICollectionReusableView. Π—Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ² с этим, сконфигурируйтС Π² конструкторС интСрфСйса подпись ΠΈ ΠΊΠ½ΠΎΠΏΠΊΡƒ, Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ‚Π°Ρ‰ΠΈΡ‚Π΅ подпись Π² Ρ„Π°ΠΉΠ» Header, Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ β€” Π² Ρ„Π°ΠΉΠ» Footer. БвяТитС ΠΈΡ… с вашими классами Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 5.10 ΠΈ 5.11.


Рис. 5.10. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ячСйки Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»Π° для сборного Π²ΠΈΠ΄Π° Π² конструкторС интСрфСйса


Рис. 5.11. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ячСйки Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»Π° для сборного Π²ΠΈΠ΄Π° Π² конструкторС интСрфСйса



#import <UIKit/UIKit.h>


@interface Header: UICollectionReusableView

@property (weak, nonatomic) IBOutlet UILabel *label;

@end


Π’ΠΎ ΠΆΠ΅ самоС я дСлаю ΠΈ Π² Π½ΠΈΠΆΠ½Π΅ΠΌ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»Π΅, связав ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° Footer.xib с Π°ΡƒΡ‚Π»Π΅Ρ‚ΠΎΠΌ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° Footer.h ΠΈ Π½Π°Π·Π²Π°Π² Π°ΡƒΡ‚Π»Π΅Ρ‚ button:


#import <UIKit/UIKit.h>


@interface Footer: UICollectionReusableView

@property (weak, nonatomic) IBOutlet UIButton *button;

@end

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ сборного Π²ΠΈΠ΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ для ячССк Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»ΠΎΠ²:

#import Β«ViewController.hΒ»

#import Β«MyCollectionViewCell.hΒ»

#import Β«Header.hΒ»

#import Β«Footer.hΒ»


static NSString *kCollectionViewCellIdentifier = @"Cells";

static NSString *kCollectionViewHeaderIdentifier = @"Headers";

static NSString *kCollectionViewFooterIdentifier = @"Footers";


@implementation ViewController


…

Π”Π°Π»Π΅Π΅ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ сборного Π²ΠΈΠ΄Π° зарСгистрируСм ячСйку сборного Π²ΠΈΠ΄Π°, ячСйку Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»Π° ΠΈ ячСйку Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»Π°. Для этого Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ nib-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ:


β€” (instancetype) initWithCollectionViewLayout:(UICollectionViewLayout *)layout{


self = [super initWithCollectionViewLayout: layout];

if (self!= nil){

/* Π Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ nib-Ρ„Π°ΠΉΠ» со ΡΠ±ΠΎΡ€Π½Ρ‹ΠΌ Π²ΠΈΠ΄ΠΎΠΌ для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ получСния */

UINib *nib = [UINib nibWithNibName:

NSStringFromClass([MyCollectionViewCell class])

bundle: [NSBundle mainBundle]];


[self.collectionView registerNib: nib

forCellWithReuseIdentifier: kCollectionViewCellIdentifier];


/* Π Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ nib-Ρ„Π°ΠΉΠ» Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»Π° */

UINib *headerNib = [UINib

nibWithNibName: NSStringFromClass([Header class])

bundle: [NSBundle mainBundle]];

[self.collectionView registerNib: headerNib

forSupplementaryViewOfKind: UICollectionElementKindSectionHeader

withReuseIdentifier: kCollectionViewHeaderIdentifier];


/* Π Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ nib-Ρ„Π°ΠΉΠ» Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»Π° */

UINib *footerNib = [UINib

nibWithNibName: NSStringFromClass([Footer class])

bundle: [NSBundle mainBundle]];

[self.collectionView registerNib: footerNib

forSupplementaryViewOfKind: UICollectionElementKindSectionFooter

withReuseIdentifier: kCollectionViewFooterIdentifier];

}

return self;


}


ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° collectionView: viewForSupplemen taryElementOfKind: atIndexPath: сборного Π²ΠΈΠ΄Π°. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½ΡƒΠΆΠ΅Π½ Π½Π°ΠΌ для конфигурирования Π²Π΅Ρ€Ρ…Π½ΠΈΡ… ΠΈ Π½ΠΈΠΆΠ½ΠΈΡ… ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»ΠΎΠ² ΠΈ прСдоставлСния ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ сборному Π²ΠΈΠ΄Ρƒ:


β€” (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView

viewForSupplementaryElementOfKind:(NSString *)kind

atIndexPath:(NSIndexPath *)indexPath{


NSString *reuseIdentifier = kCollectionViewHeaderIdentifier;

if ([kind isEqualToString: UICollectionElementKindSectionFooter]){

reuseIdentifier = kCollectionViewFooterIdentifier;

}


UICollectionReusableView *view =

[collectionView dequeueReusableSupplementaryViewOfKind: kind

withReuseIdentifier: reuseIdentifier

forIndexPath: indexPath];


if ([kind isEqualToString: UICollectionElementKindSectionHeader]){

Header *header = (Header *)view;

header.label.text = [NSString stringWithFormat:@"Section Header %lu",

(unsigned long)indexPath.section + 1];

}

else if ([kind isEqualToString: UICollectionElementKindSectionFooter]){

Footer *footer = (Footer *)view;


NSString *title = [NSString stringWithFormat:@"Section Footer %lu",

(unsigned long)indexPath.section + 1];

[footer.button setTitle: title forState: UIControlStateNormal];


}


return view;


}


НаконСц, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΠ°ΠΊΠ΅Ρ‚Ρƒ с ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ извСстно ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² сборном Π²ΠΈΠ΄Π΅ Π΅ΡΡ‚ΡŒ ячСйки Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»ΠΎΠ². На основС ΠΊΠΎΠ΄Π°, написанного Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 5.3, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ flowLayout Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° нашСго прилоТСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


β€” (UICollectionViewFlowLayout *) flowLayout{


UICollectionViewFlowLayout *flowLayout =

[[UICollectionViewFlowLayout alloc] init];


flowLayout.minimumLineSpacing = 20.0f;

flowLayout.minimumInteritemSpacing = 10.0f;

flowLayout.itemSize = CGSizeMake(80.0f, 120.0f);

flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;

flowLayout.sectionInset = UIEdgeInsetsMake(10.0f, 20.0f, 10.0f, 20.0f);

/* Π—Π°Π΄Π°Π΅ΠΌ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ для Π²ΠΈΠ΄ΠΎΠ² с Π²Π΅Ρ€Ρ…Π½ΠΈΠΌΠΈ ΠΈ Π½ΠΈΠΆΠ½ΠΈΠΌΠΈ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»Π°ΠΌΠΈ */

flowLayout.headerReferenceSize = CGSizeMake(300.0f, 50.0f);

flowLayout.footerReferenceSize = CGSizeMake(300.0f, 50.0f);


return flowLayout;


}


Π˜Ρ‚Π°ΠΊ, всС Π³ΠΎΡ‚ΠΎΠ²ΠΎ! Если Π²Ρ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² эмуляторС iPad, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠ°ΠΊ Π½Π° рис. 5.12.


Рис. 5.12. Π’Π΅Ρ€Ρ…Π½ΠΈΠ΅ ΠΈ Π½ΠΈΠΆΠ½ΠΈΠ΅ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ»Ρ‹ Π² сборном Π²ΠΈΠ΄Π΅

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅

Π Π°Π·Π΄Π΅Π»Ρ‹ 5.2, 5.3, 5.5.

5.8. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ собствСнных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² взаимодСйствий ΠΊ сборным Π²ΠΈΠ΄Π°ΠΌ

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

Π’Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ сборному Π²ΠΈΠ΄Ρƒ собствСнныС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ распознавания ТСстов, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Ρ‰ΠΈΠΏΠΎΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ собствСнныС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΉ Π½Π° Π±Π°Π·Π΅ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ.

РСшСниС

Π˜Π½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ распознавания ТСстов, Π° ΠΏΠΎΡ‚ΠΎΠΌ просмотритС распознаватСли ТСстов, ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ Π² сборном Π²ΠΈΠ΄Π΅, ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Π½Π΅Ρ‚ Π»ΠΈ срСди Π½ΠΈΡ… Ρ‚Π°ΠΊΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π²Π°ΠΌ. Если Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Π² Π½Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ requireGestureRecognizerToFail: ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ этому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ваш собствСнный Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ ТСстов. Π’Π°ΠΊ Π²Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ ТСстов, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉΡΡ Π² сборном Π²ΠΈΠ΄Π΅ ΠΈ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΡ‚, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ΅Π½ Π²Π°ΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ Π² случаС нСобходимости ΠΏΠΎΠ΄Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ТСстов. Π­Ρ‚ΠΎ станСт ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ, Ссли Π²Π°ΡˆΠ΅ΠΌΡƒ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŽ ТСстов Π½Π΅ удастся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π΅ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ трСбованиям/критСриям. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ваш Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ способСн ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ТСст, ΠΎΠ½ это сдСлаСт, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ТСст Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡƒ распознавания, ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΌΡƒΡΡ Π² сборном Π²ΠΈΠ΄Π΅. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΅Π³ΠΎ сам.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ваш Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ ТСстов ΠΊ сборному Π²ΠΈΠ΄Ρƒ. Как Π²Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Π² экзСмплярС UICollectionViewController ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ вашСго сборного Π²ΠΈΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ доступСн Ρ‡Π΅Ρ€Π΅Π· свойство ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° collectionView, Π° Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· свойство view.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Π’ API iOS ΡƒΠΆΠ΅ прСдусмотрСно нСсколько ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ТСстов, примСняСмых Π² сборных Π²ΠΈΠ΄Π°Ρ…. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для добавлСния собствСнных распознаватСлСй ТСстов ΠΊ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ сначала Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ваши распознаватСли ТСстов Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°Ρ‚ΡŒΡΡ с ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈΡΡ. Для этого сначала Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ваши собствСнныС распознаватСли ТСстов, Π° ΠΏΠΎΡ‚ΠΎΠΌ, ΠΊΠ°ΠΊ описано Ρ€Π°Π½Π΅Π΅, ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ массив Ρ‚Π°ΠΊΠΈΡ… распознаватСлСй, ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Ρƒ сборного Π²ΠΈΠ΄Π°. Π—Π°Ρ‚Π΅ΠΌ понадобится Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ requireGestureRecognizerToFail: Π² классС распознаватСля ТСстов Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ ΠΈ наш Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ ТСстов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ собираСмся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ сборному Π²ΠΈΠ΄Ρƒ.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ собираСмся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ сборному Π²ΠΈΠ΄Ρƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ ΠΈ увСличСния изобраТСния (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ). Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ выстроСн Π½Π° основС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 5.5. Π˜Ρ‚Π°ΠΊ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ Ρ‰ΠΈΠΏΠΊΠΎΠ² Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ распознаватСлСй ТСстов, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Π² сборном Π²ΠΈΠ΄Π΅. ΠœΡ‹ сдСлаСм это Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ viewDidLoad ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° сборного Π²ΠΈΠ΄Π°: