Maison > Article > développement back-end > Questions de développement iOS (9)
111. Pourquoi définir layer.borderColor dans IB est-il inutile ?
J'ai défini la propriété Runtime de UIView dans IB pour obtenir un effet rectangle avec des coins arrondis et une bordure rouge, comme indiqué ci-dessous :
Cependant, la propriété borderColor semble être invalide Oui, la bordure ne peut pas être affichée.
layer.borderColor est une propriété CGColorRef, et le panneau de couleurs de la propriété Runtime ne peut obtenir que la propriété UIColor, vous ne pouvez donc pas définir borderColor dans IB, mais ne pouvez le définir que via le code.
112. Pouvez-vous toujours utiliser les macros DLog et ALog dans Swift ?
Les macros complexes utilisées en C et Objective-C ne peuvent pas être utilisées dans Swift. Les macros complexes sont des macros qui s'ajoutent aux définitions de constantes, y compris les macros de fonctions avec parenthèses. Nous pouvons définir des fonctions globales à la place :
func dLog(message: String, filename: String = __FILE__, function: String =__FUNCTION__, line: Int = __LINE__) { if DEBUG==1 { println("[\(filename.lastPathComponent):\(line)] \(function) -\(message)") } }
113. Les énumérations en O-C ne peuvent pas être utilisées dans Swift ?
Erreur : le modèle de casse Enum ne peut pas correspondre aux valeurs du type non-énum 'nom de l'énumération'
À partir de la version bêta 5, Swift ne peut mapper que les classes d'énumération définies à l'aide de la macro NS_ENUM dans O-C. Par conséquent, toutes les énumérations O-C définies en mode typedef enum doivent être redéfinies avec NS_NUM :
typedef enum { ChinaMobile = 0, // MNC 00 02 07 ChinaUnicom, // MNC 01 06 ChinaTelecom, // MNC 03 04 ChinaTietong, // MNC 20 Unknown } CarrierName;
114. La macro #ifdef ne peut-elle pas être utilisée dans Swift ?
#if/#else/#endif peut être utilisé dans Swift :
#if DEBUG let a = 2 #else let a = 3 #endif
Mais le symbole DEBUG doit être défini dans d'autres indicateurs Swift :
115. Quelle est la différence entre la méthode textFieldShouldReturn renvoyant OUI ou NON ?
Le retour de OUI déclenchera la correction automatique du texte et la mise en majuscule automatique des premières lettres (le soi-disant comportement par défaut dans la documentation Apple), tandis que le retour de NON ne le fera pas.
116. Comment changer la hauteur de ligne de UITextView ?
Définissez d'abord le layoutManager.delegate de UITextView :
textView.layoutManager.delegate = self; // vous devrez vous déclarer
Ensuite, implémentez la méthode déléguée :
- (CGFloat)layoutManager:(NSLayoutManager *)layoutManagerlineSpacingAfterGlyphAtIndex:(NSUInteger)glyphIndexwithProposedLineFragmentRect:(CGRect)rect { return 4; // 这是行间距 }
117. Modifier la hauteur minimale de UITextView
Peu importe la façon dont vous modifiez la hauteur du cadre de UITextView dans IB, cela ne sert à rien. La hauteur minimale de UITextView est calculée à travers son contenu et sa hauteur minimale est égale à la hauteur d'une seule ligne. Par conséquent, sur iOS 7, vous pouvez modifier la hauteur minimale en définissant son textContainerInset (iOS 6 est contentInset) :
if (NSFoundationVersionNumber >NSFoundationVersionNumber_iOS_6_1) { self.textContainerInset =UIEdgeInsetsMake(4, 10, 4, 10); } else { self.contentInset =UIEdgeInsetsMake(4, 10, 4, 10); }
117 Après avoir inséré une image (NSTextAttachment), la police NSAttribtuedString est inexplicablement. plus petit
Police avant d'insérer l'image :
Après avoir inséré l'image :
C'est parce que NSTextAttachment est inséré sous forme d'exposant , ce qui entraîne la modification de trois attributs : police, baseline, NSSuperscriptAttributeName.
Donc, après avoir inséré l'image, vous devez modifier ces trois valeurspar défaut (la simple modification de la police ne fonctionnera pas) :
[mutableAttrString addAttributes: @{NSFontAttributeName:[UIFontsystemFontOfSize:16],(id)kCTSuperscriptAttributeName:@0,NSBaselineOffsetAttributeName:@0} range:NSMakeRange(0,mutableAttrString.length)];
Notez que NSSuperscriptAttributeName n'est pas valide sous iOS. Par conséquent, vous devez plutôt utiliser le kCTSuperscriptAttributeName de CoreText.
118. Comment insérer deux ViewControllers dans le contrôleur de navigation en même temps ?
Faites simplement ceci :
[viewController1.navigationController pushViewController:viewController2animated:NO]; [viewController2.navigationController pushViewController:viewController3animated:YES];
Le premier PUSH n'a pas d'animation, et le second PUSH en a. pas d'animation. Avec l'animation, l'utilisateur pensera qu'un seul ViewController a été poussé, mais en fait vous en avez poussé deux.
119. Comptez le nombre de lignes de code dans l'ensemble du projet
Ouvrez le terminal, utilisez la commande cd pour localiser le répertoire où se trouve le projet, puis appelez le nom suivant pour compter le nombre de lignes et nombre total de chaque fichier de code source :
find . "(" -name "*.m" -or -name "*.mm" -or-name "*.cpp" -or -name "*.h" -or -name "*.rss"")" -print | xargs wc -l 其中,-name "*.m" 就表示扩展名为.m的文件。同时要统计java文件和xml文件的命令分别是: find . "(" -name "*.java" ")" -print | xargs wc -l find . "(" -name "*.xml" ")" -print | xargs wc -l
120. Comment réduire le délai de la méthode requireGestureRecognizerToFail ?
requireGestureRecognizerToFail est généralement utilisé pour faire la distinction entre la reconnaissance par simple clic et par double clic. Supposons que vous ayez deux gestes, un simple clic et un double clic. Si vous ne souhaitez pas que cela soit reconnu comme un simple clic et un double clic en même temps lorsque l'utilisateur double-clique, vous pouvez utiliser le code suivant :
UITapGestureRecognizer *doubleTapGestureRecognizer =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; doubleTapGestureRecognizer.numberOfTapsRequired = 2; [self addGestureRecognizer:doubleTapGestureRecognizer]; UITapGestureRecognizer *singleTapGestureRecognizer =[[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSingleTap:)]; singleTapGestureRecognizer.numberOfTapsRequired = 1; [singleTapGestureRecognizer requireGestureRecognizerToFail: doubleTapGestureRecognizer]; [selfaddGestureRecognizer:singleTapGestureRecognizer];
Mais cette méthode a un inconvénient fatal. L'inconvénient est que puisque chaque clic doit d'abord être reconnu comme un double-clic, et que la reconnaissance du double-clic doit échouer avant de traiter le clic, il y aura un délai pour chaque clic, généralement ce temps est de 0,35 seconde. Bien que 0,35 seconde soit court, les utilisateurs peuvent ressentir un retard notable. Par conséquent, nous devons surcharger TapGestureRecognizer pour réduire ce délai :
#import <UIKit/UIGestureRecognizerSubclass.h> #define UISHORT_TAP_MAX_DELAY 0.25 @interface UIShortTapGestureRecognizer : UITapGestureRecognizer @property(nonatomic,assign)float maxDelay; @end #import"UIShortTapGestureRecognizer.h" @implementation UIShortTapGestureRecognizer - (instancetype)initWithTarget:(NSObject*)target action:(SEL)selector{ self=[super initWithTarget:targetaction:selector]; if (self) { self.maxDelay=UISHORT_TAP_MAX_DELAY; } return self; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:toucheswithEvent:event]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(self.maxDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^ { // 0.1 秒后,宣告手势识别失败 if (self.state !=UIGestureRecognizerStateRecognized) { self.state= UIGestureRecognizerStateFailed; } }); } @end
Vous pouvez maintenant définir la propriété maxDelay de UIShortTapGestureRecognizer après l'avoir instanciée. Notez que cette valeur ne doit pas être inférieure à 0,2 seconde (l'utilisateur doit être très rapide, sinon l'action de double-clic ne pourra pas être complétée), et la valeur optimale est de 0,25.
Ce qui précède est le contenu des questions de développement iOS (9). Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !