ホームページ  >  記事  >  バックエンド開発  >  iOS 開発に関する質問 (9)

iOS 開発に関する質問 (9)

黄舟
黄舟オリジナル
2017-01-20 09:50:111363ブラウズ

111. IB での Layer.borderColor の設定が役に立たないのはなぜですか?
IB の UIView の Runtime プロパティを設定して、以下の図に示すように、角が丸く赤い境界線を持つ長方形の効果を取得します。



ただし、borderColor プロパティが無効であるようで、境界線を表示できません。
layer.borderColor は CGColorRef プロパティであり、Runtime プロパティのカラー パネルは UIColor プロパティのみを取得できるため、IB で borderColor を設定することはできず、コードを通じてのみ設定できます。
112. Swift では DLog マクロと ALog マクロを引き続き使用できますか?
C および Objective-C で使用される複雑なマクロは、Swift では使用できません。複雑なマクロは、括弧付きの関数マクロなど、定数定義に追加されたマクロです。代わりにグローバル関数を定義できます:

func dLog(message: String, filename: String = __FILE__, function: String =__FUNCTION__, line: Int = __LINE__) {
if DEBUG==1 { 
println("[\(filename.lastPathComponent):\(line)] \(function) -\(message)")
}
}

113 O-C の列挙型は Swift では使用できません。
エラー: 列挙型ケースのパターンは非列挙型「列挙名」の値と一致できません
Beta 5 の時点では、Swift は O-C の NS_ENUM マクロを使用して定義された列挙型クラスのみをマップできます。したがって、typedef enum モードで定義されたすべての O-C 列挙は NS_NUM:

typedef enum {
ChinaMobile = 0, // MNC 00 02 07
ChinaUnicom, // MNC 01 06
ChinaTelecom, // MNC 03 04
ChinaTietong, // MNC 20
Unknown
} CarrierName;

114 で再定義する必要があります。#ifdef マクロは Swift では使用できませんか?
#if/#else/#endif は Swift で使用できます:

#if DEBUG
let a = 2
#else
let a = 3
#endif

ただし、DEBUG シンボルは他の Swift フラグで定義する必要があります:



115 YES または NO を返す textFieldShouldReturn メソッドの違いは何ですか?
YES を返すと自動テキスト修正と自動最初の文字の大文字化 (Apple ドキュメントのいわゆるデフォルト動作) がトリガーされますが、NO を返すとトリガーされません。
116. UITextViewの行の高さを変更するには?
最初に UITextView のlayoutManager.delegateを設定します:
textView.layoutManager.delegate = self; // 宣言する必要があります:
次にデリゲートメソッドを実装します:

- (CGFloat)layoutManager:(NSLayoutManager *)layoutManagerlineSpacingAfterGlyphAtIndex:(NSUInteger)glyphIndexwithProposedLineFragmentRect:(CGRect)rect
{
return 4; // 这是行间距
}

117。 UITextViewの最小の高さを変更します。どうやってもIBでUITextViewのフレームの高さを変更しても無駄です。 UITextView の最小の高さはそのコンテンツを通じて計算され、その最小の高さは 1 つの行の高さと同じになります。したがって、iOS 7 では、textContainerInset (iOS 6 は contentInset) を設定することで最小の高さを変更できます:

if (NSFoundationVersionNumber >NSFoundationVersionNumber_iOS_6_1) {
self.textContainerInset =UIEdgeInsetsMake(4, 10, 4, 10);
} else {
self.contentInset =UIEdgeInsetsMake(4, 10, 4, 10);
}

117 画像 (NSTextAttachment) を挿入すると、NSAttribtuedString フォントが不可解にも小さくなります

画像を挿入する前のフォント:



画像の挿入後:



これは、NSTextAttachment が上付き形式で挿入されるため、フォント、ベースライン、NSSuperscriptAttributeName の 3 つの属性が変更されます。
そのため、画像を挿入した後、これら 3 つの値をデフォルトに変更する必要があります (フォントを変更するだけでは機能しません):

[mutableAttrString addAttributes:
@{NSFontAttributeName:[UIFontsystemFontOfSize:16],(id)kCTSuperscriptAttributeName:@0,NSBaselineOffsetAttributeName:@0} range:NSMakeRange(0,mutableAttrString.length)];

NSSuperscriptAttributeName は iOS では無効であることに注意してください。したがって、代わりに CoreText の kCTSuperscriptAttributeName を使用する必要があります。

118. 一度に 2 つの ViewController をナビゲーション コントローラーにプッシュするにはどうすればよいですか?
これを行うだけです:

[viewController1.navigationController pushViewController:viewController2animated:NO];
[viewController2.navigationController pushViewController:viewController3animated:YES];

最初の PUSH にはアニメーションがあり、2 番目の PUSH にはアニメーションがあり、ユーザーは 1 つだけをプッシュしたように感じます。 ViewController を PUSH しました。実際には 2 つを PUSH しました。

119. プロジェクト全体のコードの行数を数えます
ターミナルを開き、cd コマンドを使用してプロジェクトが配置されているディレクトリを見つけ、次の名前を呼び出して各行の数と合計数を数えます。ソースコードファイル:

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 requireGestureRecognizerToFail メソッドの遅延を減らすにはどうすればよいですか?

requireGestureRecognizerToFail は通常、シングルクリック認識とダブルクリック認識を区別するために使用されます。シングルクリックとダブルクリックという 2 つのジェスチャがあるとします。ユーザーがダブルクリックしたときに、同時にシングルクリックとダブルクリックとして認識されたくない場合は、次のコードを使用できます。

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];

しかし、この方法には致命的な欠点があり、クリックするたびにダブルクリック認識を最初に実行し、ダブルクリック認識が失敗した後にシングルクリック処理を実行する必要があるため、一般にクリックごとに遅延が発生します。タイムは0.35秒。 0.35 秒は短いですが、ユーザーは顕著な遅延を感じることができます。したがって、この遅延を減らすために TapGestureRecognizer をオーバーロードする必要があります:

#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

これで、UIShortTapGestureRecognizer をインスタンス化した後にその maxDelay プロパティを設定できるようになりました。この値は 0.2 秒未満であってはなりません (ユーザーは非常に速くなければなりません。そうしないとダブルクリック操作が完了できません)。最適な値は 0.25 です。


上記は iOS 開発に関する質問 (9) の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。