程序员其实就是在不断地学习中进步, 这个帖子会记录一些iOS开发中的小技巧, 我也会不断更新的, until I leave from iOS.
2016.09.02于广州 雨
1.设置UITextField的起始光标位置
解决方法是UITextField有一个leftView属性, 使用改属性即可解决该问题.
UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, wantWidth, searchTextField.my_height)];
searchTextField.leftViewMode = UITextFieldViewModeAlways;
leftView.backgroundColor = [UIColor clearColor];
searchTextField.leftView = leftView;
其中wantSize就是光标距离textField左侧的距离, 而且一定要设置leftViewMode, 否则leftView是不会显示的, 因为leftView是默认UITextFieldViewModeNever.
typedef NS_ENUM(NSInteger, UITextFieldViewMode) {
UITextFieldViewModeNever,
UITextFieldViewModeWhileEditing,
UITextFieldViewModeUnlessEditing,
UITextFieldViewModeAlways
};
这样是不是就好看多了~
2.导航栏的隐藏问题
当从一个没有导航栏的控制器A push一个应该有导航栏的控制器B中.
可以在A的viewWillAppear中写[self.navigationController setNavigationBarHidden:YES];
在B的viewDidLoad中写[self.navigationController setNavigationBarHidden:NO];
乍看之下是解决了这个问题. 可是当你在B控制器中用侧滑返回到一半, 接着又不想返回到A控制器了,再回到B控制器你会发现B的导航栏消失了.
你在网上寻求解决方法, 哦, 原来应该在B控制器中的viewWillAppear中写
[self.navigationController setNavigationBarHidden:NO];
. 你满心欢喜认为问题解决了, 可是你在侧滑返回的时候导航栏仍然是隐藏的, 是因为此时已经触发了A控制器的viewWillAppear方法.下面是解决方法:在不显示导航栏的控制器(A), 遵循导航栏的代理.实现其代理方法:
#pragma mark - UINavigationControllerDelegate
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
BOOL isShowBar = [viewController isKindOfClass:[self class]];
[self.navigationController setNavigationBarHidden:isShowBar animated:YES];
}
�
2016.09.19 最近比较闲,项目等待审核呢,天天自己看看书挺好的
3.在APPDelegate显示UIAlertViewController
UIAlertView
在8.0的时候已经过期了,很多SDK种在APPDelegate中仍使用 UIAlertView
,就会报警告.
因此需要将 UIAlertView
替换为 UIAlertViewController
, 在UIViewController中显示UIAlertViewController
是很简单的,只需要modal就可以.但是如何在APPDelegate显示呢? 下面上代码
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"在APPDelegate中打开UIAlertController" message:@"开~" preferredStyle:UIAlertControllerStyleAlert];
[self.window.rootViewController presentViewController:alert animated:YES completion:nil];
2016.11.02 广州,进步中.
4.改变不同状态下的UIButton的背景颜色
最近要做充值页面, 金额按钮在选中状态的背景颜色需要变成橙色
UIButton只有一个backgroundColor的属性, 无法根据不同状态改变背景颜色.
但是UIButton有这样一个接口, 根据不同状态修改背景图片
- (void)setBackgroundImage:(nullable UIImage *)image forState:(UIControlState)state UI_APPEARANCE_SELECTOR;
所以我们可以将颜色装换成图片, 写一个UIImgae的分类
+ (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
这样就可以完成需求了
[self.selectMoneyBtn setBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor]] forState:UIControlStateNormal];
[self.selectMoneyBtn setBackgroundImage:[UIImage imageWithColor:LHZColor(255, 242, 236)] forState:UIControlStateSelected];
2017.05.02 好久没更新了, 不喜欢转载那些已经被别人转无数次的东西, 自己的积累又不够,导致更新这么慢
5.在NSConcreteValue中取出CGRect的值
KVO监听某一个对象frame的改变, 在- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
这个方法中,通过change这个字典拿到前后改变的frame.
可是当你用[change objectForKey:NSKeyValueChangeNewKey]
或者[change objectForKey:NSKeyValueChangeOldKey]
取值时,却发现得出的类型是NSConcreteValue
.这下该如何是好呢?其实很简单,先将值类型由NSConcreteValue
转为NSString
, 就可以得到CGRect咯/
NSString *oldFrameStr = [NSString stringWithFormat:@"%@", [change objectForKey:NSKeyValueChangeOldKey]];
CGRect oldFrame = CGRectFromString(oldFrameStr);
注意点, 第一步转换的时候不要用NSString *oldFrameStr = (NSString *) [change objectForKey:NSKeyValueChangeOldKey];