>  기사  >  백엔드 개발  >  iOS 개발 질문 (9)

iOS 개발 질문 (9)

黄舟
黄舟원래의
2017-01-20 09:50:111410검색

111. IB에서 layer.borderColor를 설정하는 것이 왜 쓸모가 없나요?
아래 그림과 같이 둥근 모서리와 빨간색 테두리가 있는 직사각형 효과를 얻기 위해 IB에서 UIView의 런타임 속성을 설정했습니다.



그런데 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에서 사용할 수 없나요?
오류: 열거형 케이스 패턴은 열거형이 아닌 '열거형 이름'의 값과 일치할 수 없습니다.
베타 5부터 Swift는 O-C에서 NS_ENUM 매크로를 사용하여 정의된 열거형 클래스만 매핑할 수 있습니다. 따라서 typedef 열거형 모드에 정의된 모든 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의 레이아웃Manager.delegate를 설정합니다.
textView.layoutManager.delegate = self; // 선언해야 합니다.
그런 다음 대리자 메서드를 구현합니다.

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

117. UITextView의 최소 높이 수정
IB에서 UITextView의 프레임 높이를 어떻게 수정해도 소용이 없습니다. UITextView의 최소 높이는 콘텐츠를 통해 계산되며 최소 높이는 단일 행의 높이와 같습니다. 따라서 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.
따라서 이미지를 삽입한 후 이 세 가지 값을 기본값으로 변경해야 합니다(글꼴만 수정하면 작동하지 않음).

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

NSSuperscriptAttributeName은 iOS에서 유효하지 않습니다. . 따라서 대신 CoreText의 kCTSuperscriptAttributeName을 사용해야 합니다.

118. 두 개의 ViewController를 탐색 컨트롤러에 동시에 푸시하는 방법은 무엇입니까?
다음과 같이 하세요.

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

첫 번째 PUSH에는 애니메이션이 없고 두 번째 PUSH에는 애니메이션이 있습니다. 애니메이션 - 사용자는 ViewController가 하나만 푸시되었다고 생각하지만 실제로는 두 개를 푸시했습니다.

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은 일반적으로 단일 클릭 인식과 더블 클릭 인식을 구별하는 데 사용됩니다. 싱글클릭과 더블클릭 두 가지 동작이 있다고 가정해 보겠습니다. 사용자가 더블클릭을 했을 때 싱글클릭과 더블클릭을 동시에 인식하고 싶지 않다면 다음 코드를 사용하면 됩니다. 🎜>

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 중국어 홈페이지(www.php.cn)를 참고해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.