111. Warum ist das Setzen von „layer.borderColor“ in IB nutzlos?
Ich habe die Runtime-Eigenschaft von UIView in IB so eingestellt, dass ein Rechteckeffekt mit abgerundeten Ecken und einem roten Rand erzielt wird, wie unten gezeigt:
Die Eigenschaft borderColor scheint jedoch ungültig zu sein Ja, der Rand kann nicht angezeigt werden.
layer.borderColor ist eine CGColorRef-Eigenschaft, und das Farbfeld der Runtime-Eigenschaft kann nur die UIColor-Eigenschaft abrufen, sodass Sie borderColor nicht in IB, sondern nur über Code festlegen können.
112. Können Sie weiterhin DLog-Makros und ALog-Makros in Swift verwenden?
Komplexe Makros, die in C und Objective-C verwendet werden, können in Swift nicht verwendet werden. Komplexe Makros sind Makros zusätzlich zu Konstantendefinitionen, einschließlich Funktionsmakros mit Klammern. Wir können stattdessen globale Funktionen definieren:
func dLog(message: String, filename: String = __FILE__, function: String =__FUNCTION__, line: Int = __LINE__) { if DEBUG==1 { println("[\(filename.lastPathComponent):\(line)] \(function) -\(message)") } }
113. Aufzählungen in O-C können nicht in Swift verwendet werden?
Fehler: Enum-Case-Muster kann nicht mit Werten des Nicht-Enum-Typs „Enumerationsname“ übereinstimmen
Ab Beta 5 kann Swift nur Enumerationsklassen zuordnen, die mit dem NS_ENUM-Makro in O-C definiert wurden. Daher müssen alle im Typedef-Enum-Modus definierten O-C-Enumerationen mit NS_NUM neu definiert werden:
typedef enum { ChinaMobile = 0, // MNC 00 02 07 ChinaUnicom, // MNC 01 06 ChinaTelecom, // MNC 03 04 ChinaTietong, // MNC 20 Unknown } CarrierName;
114 Kann das #ifdef-Makro nicht in Swift verwendet werden?
#if/#else/#endif kann in Swift verwendet werden:
#if DEBUG let a = 2 #else let a = 3 #endif
Aber das DEBUG-Symbol muss in anderen Swift-Flags definiert werden:
115. Was ist der Unterschied zwischen der textFieldShouldReturn-Methode, die JA oder NEIN zurückgibt?
Die Rückgabe von „YES“ löst eine automatische Textkorrektur und eine automatische Großschreibung des Anfangsbuchstabens aus (das sogenannte Standardverhalten in der Apple-Dokumentation), die Rückgabe von „NO“ nicht.
116. Wie ändere ich die Zeilenhöhe von UITextView?
Setzen Sie zuerst den layoutManager.delegate von UITextView ein:
textView.layoutManager.delegate = self; // Sie müssen Sie deklarieren
Dann implementieren Sie die Delegate-Methode:
- (CGFloat)layoutManager:(NSLayoutManager *)layoutManagerlineSpacingAfterGlyphAtIndex:(NSUInteger)glyphIndexwithProposedLineFragmentRect:(CGRect)rect { return 4; // 这是行间距 }
117. Ändern Sie die Mindesthöhe von UITextView
Egal wie Sie die Rahmenhöhe von UITextView in IB ändern, es ist nutzlos. Die Mindesthöhe von UITextView wird anhand seines Inhalts berechnet und seine Mindesthöhe entspricht der Höhe einer einzelnen Zeile. Daher können Sie unter iOS 7 die Mindesthöhe ändern, indem Sie dessen textContainerInset festlegen (iOS 6 ist contentInset):
if (NSFoundationVersionNumber >NSFoundationVersionNumber_iOS_6_1) { self.textContainerInset =UIEdgeInsetsMake(4, 10, 4, 10); } else { self.contentInset =UIEdgeInsetsMake(4, 10, 4, 10); }
117. Nach dem Einfügen eines Bildes (NSTextAttachment) ist die Schriftart NSAttribtuedString unerklärlich kleiner
Schriftart vor dem Einfügen des Bildes:
Nach dem Einfügen des Bildes:
Dies liegt daran, dass NSTextAttachment in hochgestellter Form eingefügt wird , was dazu führt, dass drei Attribute geändert werden: Schriftart, Grundlinie, NSSuperscriptAttributeName.
Nach dem Einfügen des Bildes müssen Sie diese drei Werte auf die Standardwerte ändern (ein einfaches Ändern der Schriftart funktioniert nicht):
[mutableAttrString addAttributes: @{NSFontAttributeName:[UIFontsystemFontOfSize:16],(id)kCTSuperscriptAttributeName:@0,NSBaselineOffsetAttributeName:@0} range:NSMakeRange(0,mutableAttrString.length)];
Beachten Sie, dass NSSuperscriptAttributeName ungültig ist in iOS. Daher müssen Sie stattdessen kCTSuperscriptAttributeName von CoreText verwenden.
118. Wie schiebe ich zwei ViewController gleichzeitig in den Navigationscontroller?
Tun Sie dies einfach:
[viewController1.navigationController pushViewController:viewController2animated:NO]; [viewController2.navigationController pushViewController:viewController3animated:YES];
Der erste PUSH hat keine Animation, der zweite PUSH jedoch Keine Animation. Bei Animation wird der Benutzer denken, dass nur ein ViewController gepusht wurde, aber tatsächlich haben Sie zwei gepusht.
119. Zählen Sie die Anzahl der Codezeilen im gesamten Projekt.
Öffnen Sie das Terminal, suchen Sie mit dem Befehl cd das Verzeichnis, in dem sich das Projekt befindet, und rufen Sie dann die folgende Benennung auf, um die Anzahl der Zeilen zu zählen Gesamtzahl jeder Quellcodedatei:
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. Wie kann die Verzögerung der requireGestureRecognizerToFail-Methode reduziert werden?
requireGestureRecognizerToFail wird im Allgemeinen verwendet, um zwischen Einzelklick- und Doppelklickerkennung zu unterscheiden. Angenommen, Sie haben zwei Gesten, einen Einzelklick und einen Doppelklick. Wenn Sie nicht möchten, dass beim Doppelklicken des Benutzers gleichzeitig ein Einzelklick und ein Doppelklick erkannt werden, können Sie den folgenden Code verwenden:
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];
Aber diese Methode hat einen fatalen Nachteil: Da jeder Klick zuerst als Doppelklick erkannt werden muss und die Doppelklickerkennung fehlschlägt, bevor der Klick verarbeitet wird, wird ein Fehler auftreten Verzögerung für jeden Klick, im Allgemeinen beträgt diese Zeit 0,35 Sekunden. Obwohl 0,35 Sekunden kurz sind, können Benutzer eine spürbare Verzögerung spüren. Daher müssen wir TapGestureRecognizer überladen, um diese Verzögerung zu reduzieren:
#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
Jetzt können Sie die maxDelay-Eigenschaft von UIShortTapGestureRecognizer festlegen, nachdem Sie es instanziiert haben. Beachten Sie, dass dieser Wert nicht weniger als 0,2 Sekunden betragen sollte (der Benutzer muss sehr schnell sein, sonst kann die Doppelklick-Aktion nicht abgeschlossen werden) und der optimale Wert 0,25 beträgt.
Das Obige ist der Inhalt der iOS-Entwicklungsfragen (9). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!