开发过程中的小知识点总结(六)
1、UITextField中禁止复制粘贴
封装UITextField,重写canPerformAction方法
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
例:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(paste:)) //禁止粘贴
return NO;
if (action == @selector(copy:)) // 禁止复制
return NO;
return [super canPerformAction:action withSender:sender];
}
整体禁用,建议
//建议整体禁用(复制、粘贴、全选等都被禁用了)
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
UIMenuController *menuController = [UIMenuController sharedMenuController];
if (menuController) {
[UIMenuController sharedMenuController].menuVisible = NO;
}
return NO;
}
扩展
cut: // 剪切
copy: // 拷贝
select: // 选择
selectAll: // 全选
paste: // 粘贴
delete: // 删除
_promptForReplace: // Replace...
_transliterateChinese: // 简<=>繁
_showTextStyleOptions: // B/<u>U</u>
_define: // Define
_addShortcut: // Learn...
_accessibilitySpeak: // Speak
_accessibilitySpeakLanguageSelection: // Speak...
_accessibilityPauseSpeaking: // Pause
_share: // 共享...
makeTextWritingDirectionRightToLeft: // 往右缩进
makeTextWritingDirectionLeftToRight: // 往左缩进
2、UITextField的输入限制(仅使用于英文和数字)
实现UITextFieldDelegate的代理方法,
#pragma mark - UITextFieldDelegate Methods
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField == self.portTextField && (textField.text.length + string.length) > 20) {
return NO;
}
if (string.length == 0) {
return YES;
}
return YES;
}
3、设置UILabel文本里某几个字为特殊颜色的效果
NSString *string = @"扫机身二维码/扫登录二维码";
NSMutableAttributedString *hintString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range = [[hintString string] rangeOfString:@"机身二维码"];
[hintString addAttribute:@{ NSFontAttributeName : [UIFont systemFontOfSize:constantFromPhone6(17) weight:UIFontWeightSemibold],
NSForegroundColorAttributeName : [UIColor colorWithHexString:@"#2283E2"] } range:range];
_tipsLabel.attributedText = hintString;
参考链接:https://www.jianshu.com/p/8c7dd7d8501b
4、UILabel调整行间距
-(NSAttributedString*)getAttributedStringWithLineSpace:(CGFloat)lineSpace kern:(CGFloat)kern {
NSMutableParagraphStyle*paragraphStyle = [NSMutableParagraphStylenew];
//调整行间距
paragraphStyle.lineSpacing= lineSpace;
NSDictionary*attriDict =@{NSParagraphStyleAttributeName:paragraphStyle,NSKernAttributeName:@(kern)};
NSMutableAttributedString*attributedString = [[NSMutableAttributedStringalloc]initWithString:selfattributes:attriDict];
returnattributedString;
}
5、校验字符串是否是IP地址
例: 写一个NSString的分类,在分类里定义校验方法
- (BOOL)isIPAddress
{
NSString *pattern = @"((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:self];
return isMatch;
}
6、对NSMutableDictionary设置键值对时setObject和setValue的区别
setObject :值必须是不为空的任意类型(nonnull),若value为空,会导致NSMutableDictionary出现崩溃现象。 key值可以传入不为空的id类型。
setValue方法中,值可以为空值(nullable),并且在setValue方法中,假如你传的值为空的话,那么他会调用- (void)removeObjectForKey:(id)aKey;这个方法。所以用setValue方法可以有效的防止值为空所出现的崩溃现象。 key必须是不为空的字符串(nonnull NSString)。