写了几天的代码,感觉确实有不少提升。目前基本的UI界面已经搭建的差不多了,但更高级的功能,比如收藏夹,夜间模式,页內搜索,关闭图片都还没有实现。
今天决定总结一下这几天的收获,方便以后查阅。
1.Storyboard 和 self.view 的关系
Storyboard中可以添加控件,self.view也可以做添加控件。那他们一样么?
我在搭建浏览器UI界面时发现:Storyboard添加的控件处于最底层,利用self.view执行addSubview:而得到的控件是覆盖在Storyboard之上的。
2.按键功能的代码实现
在Storyboard中,添加按钮和实现IBAction功能是一件很惬意的事情。鼠标拖拖拽拽,添加几个名称就搞定了。但是如果按钮是用代码initWithFrame:实现的呢?那怎样给按钮添加功能呢?
答案是:
[“按键名称” addTarget:self action:@selector( “方法名称” ) forControlEvents:UIControlEventTouchUpInside];
3.页面跳转的代码实现
和上一条情况类似。
首先得指定Storyboard和其中的对应UIViewController。在Storyboard中设置好对应UIViewController的StoryboardID。
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *targetViewController = [storyBoard instantiateViewControllerWithIdentifier:@"targetViewID"];
[self showViewController:targetViewController sender:self];
4.页面与键盘的随动功能
我的浏览器将地址栏设在屏幕下方,利用self.view执行addSubview:会出现一个bug:点击地址栏弹出的键盘将地址栏给覆盖了,只能盲输。完全不能忍!
Stackoverflow给出了一个很不错的方法:基于苹果官方的代码 ,并作了部分修改。
http://stackoverflow.com/a/4837510/5243422
https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html#//apple_ref/doc/uid/TP40009542-CH5-SW7
这一方案是首先在self.view上添加一个UIScrollView,将WkWebview添加在UIScrollView。只有UIScrollView可以上下移动,其子类有UITableView,UICollectionView等等。
然后在建立self.view的位置执行第一段代码,监听键盘的动作,并执行相应的对策。
#第一段代码
// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden:)
name:UIKeyboardWillHideNotification
object:nil];
}
#第二段代码
// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification {
/*
//苹果官方代码
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
// If active text field is hidden by keyboard, scroll it so it's visible
// Your app might not need or want this behavior.
CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;
if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
[self.scrollView scrollRectToVisible:activeField.frame animated:YES];
}
*/
//StackOverFlow代码
NSDictionary* info = [aNotification userInfo];
CGRect keyPadFrame=[[UIApplication sharedApplication].keyWindow convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:self.view];
CGSize kbSize =keyPadFrame.size;
CGRect activeRect=[self.view convertRect:self.urlTextField.frame fromView:self.urlTextField.superview];
CGRect aRect = self.view.bounds;
aRect.size.height -= (kbSize.height);
CGPoint origin = activeRect.origin;
origin.y -= self.scrollView.contentOffset.y;
if (!CGRectContainsPoint(aRect, origin)) {
CGPoint scrollPoint = CGPointMake(0.0,CGRectGetMaxY(activeRect)-(aRect.size.height));
[self.scrollView setContentOffset:scrollPoint animated:YES];
}
}
#第三段代码
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification {
/* 原代码没用,只是修改页边距,没有执行
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
*/
//我的方案
[self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
}
5.进度条的加载
WkWebview原生提供了API estimatedProgress可以输出当前的加载进度,但是直接执行setProgress: animated:方法是没有用的。
Stackoverflow给出了解决方案
http://stackoverflow.com/q/26198334/5243422
首先给self.webView添加观察事件。
[self.webView addObserver:self forKeyPath:@"estimatedProgress"
options:NSKeyValueObservingOptionNew
context:NULL];
然后执行下列方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"estimatedProgress"] && object == self.webView) {
[self.loadingProgress setAlpha:1.0f];
[self.loadingProgress setProgress:self.webView.estimatedProgress animated:YES];
if(self.webView.estimatedProgress >= 1.0f) {
[UIView animateWithDuration:0.3
delay:0.3
options:UIViewAnimationOptionCurveEaseOut
animations:^ {
[self.loadingProgress setAlpha:0.0f];
}
completion:^(BOOL finished) {
[self.loadingProgress setProgress:0.0f animated:NO];
}
];
}
}else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
这一段是内存管理
- (void)dealloc {
[self.webView removeObserver:self forKeyPath:@"estimatedProgress"];
// if you have set either WKWebView delegate also set these to nil here
[self.webView setNavigationDelegate:nil];
[self.webView setUIDelegate:nil];
}
6、如何改变PickerView中的文字颜色
UIPickerView中不能直接设置文字格式,只能使用属性字符串。
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component{
NSAttributedString *attString = [[NSAttributedString alloc] initWithString:self.searchEnginesList[row] attributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
return attString;
}