Home  >  Article  >  Backend Development  >  iOS development questions (9)

iOS development questions (9)

黄舟
黄舟Original
2017-01-20 09:50:111273browse

111. Why is it useless to set layer.borderColor in IB?
I set the Runtime property of UIView in IB to obtain a rectangle effect with rounded corners and a red border, as shown in the figure below:



However, the borderColor property seems to be invalid Yes, the border cannot be displayed.
layer.borderColor is a CGColorRef property, and the color panel of the Runtime property can only get the UIColor property, so you cannot set borderColor in IB, but can only set it through code.
112. Can you still use DLog macros and ALog macros in Swift?
Complex macros used in C and Objective-C cannot be used in Swift. Complex macros are macros in addition to constant definitions, including function macros with parentheses. We can define a global function instead:

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

113. Enumerations in O-C cannot be used in Swift?
Error: Enum case pattern cannot match values ​​of the non-enum type 'enumeration name'
As of Beta 5, Swift can only map enumeration classes defined using the NS_ENUM macro in O-C. Therefore, all O-C enumerations defined in typedef enum mode need to be redefined with NS_NUM:

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

114. Can the #ifdef macro not be used in Swift? #if/#else/#endif can be used in
Swift:

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

But the DEBUG symbol must be defined in Other Swift Flags:



115. What is the difference between textFieldShouldReturn method returning YES or NO?
Returning YES will trigger automatic text correction and automatic first letter capitalization (the so-called default behavior in Apple documentation), returning NO will not.
116. How to change the row height of UITextView?
First set the layoutManager.delegate of UITextView:
textView.layoutManager.delegate = self; // you'll need to declare you
Then implement the delegate method:

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

117. Modify the minimum height of UITextView
No matter how you modify the frame height of UITextView in IB, it is useless. UITextView's minimum height is calculated through its content, and its minimum height is equal to the height of a single row. Therefore, on iOS 7, you can modify the minimum height by setting its textContainerInset (iOS 6 is contentInset):

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

117. After inserting a picture (NSTextAttachment), the NSAttribtuedString font is inexplicably smaller
Font before inserting the picture:



After inserting the picture:



This is because NSTextAttachment is inserted in superscript form, which results in three Attributes modified: font, baseline, NSSuperscriptAttributeName.
So after inserting the picture, you need to change these three values ​​​​to the default (just modifying the font will not work):

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

Note that NSSuperscriptAttributeName is invalid in iOS. Therefore, you need to use CoreText's kCTSuperscriptAttributeName instead.
118. How to push two ViewControllers into the navigation controller at one time?
Just do this:

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

The first PUSH will not have animation, and the second PUSH will have animation Animation, so that the user will think that only one ViewController has been pushed, but in fact you have pushed two.
119. Count the number of lines of code in the entire project
Open the terminal, use the cd command to locate the directory where the project is located, and then call the following naming to count the number of lines and total number of each source code file:

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. How to reduce the delay of requireGestureRecognizerToFail method?
requireGestureRecognizerToFail is generally used to distinguish between single-click and double-click recognition. Suppose you have two gestures, a single click and a double click. If you don’t want it to be recognized as a single click and double click at the same time when the user double-clicks, you can use the following code:

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

But this method has a fatal flaw , since each click must first be recognized as a double-click, and the double-click recognition must fail before the click is processed, resulting in a delay for each click, generally this time is 0.35 seconds. Although 0.35 seconds is short, users can feel a noticeable delay. Therefore, we need to overload TapGestureRecognizer to reduce this delay:

#import 
#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

Now you can set its maxDelay property after instantiating UIShortTapGestureRecognizer. Note that this value should not be less than 0.2 seconds (the user must be very fast, otherwise the double-click action cannot be completed), and the optimal value is 0.25.

The above is the content of iOS Development Questions (9). For more related content, please pay attention to the PHP Chinese website (www.php.cn)!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact [email protected]