PersonalInfoViewController *person =nil;
for (UIViewController *Vc inself.navigationController.childViewControllers) {
if ([VcisKindOfClass:[PersonalInfoViewControllerclass]]) {
person = (PersonalInfoViewController *)Vc;
}
}
[self.navigationControllerpopToViewController:personanimated:YES];
之前我用的方式就是特别傻的那种
PersonalInfoViewController *person = [PersonalInfoViewController new];
然后pop的时候崩溃,一直找不到原因,其实这就是原因,看来学什么都要学基础,基础不牢固就是不行啊
记录tip要加的东西:
iOS10推送相关
iOS8以后请求相册用photo/photo.h,使用phassets类
自定义view显示button制作一个alert,上面加collection的时候,cell加载图片的时候,又要高清图,又要滑动不卡,设置获取的phases方法里面给target size设置处理
有自定义的cell,上面加载的内容,写到一个比如setRecord方法里,如果有cell上的各种事件需要更新cell,那么就在这个方法里多写一个update的方法,而且要注意外面的viewcontroller不管cell的内容控件加载,只给数据就够了
几个相关页面,如本项目的活动和游戏页,和推送消息里面附带的URL打开后,都要打开一个viewcontroller加载webview,就可以统一用一个viewcontroller来负责加载和显示,里面写一个枚举,根据打开的类型来判断和控制每个内部的控件初始化的大小,以后再加需求,加一个枚举就够了
Unbutton的title,设置的时候不要写btn.titleLabel,text = @“xxx”;这样写会加载不出来title,而且即使设置了颜色也不好使,是因为title的加载需要给一个button的状态,
app支持ios7,在UINavBar里面加入搜索框,结果光标一直出现不了。在stackoverflow网站搜索了一下,竟然有人遇到相同的问题。。。。
解决办法如下:
searchBar.tintColor=[UIColorblueColor];
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 200, 40)];
searchBar.barStyle = UIBarStyleDefault;
searchBar.placeholder = @"搜索家族";
searchBar.delegate = self;
searchBar.showsCancelButton = YES;
searchBar.tintColor=[UIColor lightGrayColor]; //修改searchBar的光标颜色,默认颜色跟背景重复看不出来
for(id cc in [searchBar.subviews[0] subviews]){
if([cc isKindOfClass:[UIButton class]]){
UIButton *btn = (UIButton *)cc;
[btn setTitle:@"搜索" forState:UIControlStateNormal];
}
}
self.navigationItem.titleView = searchBar;
}
iOS10 添加新通知特性使用通知扩展的时候,一定要记得在扩展的target里面 设置最低运行版本是10,否则在9之前的版本运行项目不能安装,因为会加载这个10才有的扩展,9不支持
This app contains an app extension that specifies an extension point identifier that is not supported on this version of iOS for the value of the NSExtensionPointIdentifier key in its Info.plist.
这个是错误提示
将8改成10 就行
uisearchBar的取消按钮的颜色好几种方法,只有一种好使
UIButton *cancleBtn = [searchBar valueForKey:@"cancelButton"];
[cancleBtn setTitleColor:COLOR_PURE_BLUE forState:UIControlStateNormal];
还要记得写在searchBar.showCancelButton = yes的下面 才能起作用
一句话改变searcher中的textfield的背景颜色
UITextField *textField = [searchBar valueForKey:@"_searchField"];
textField.backgroundColor = YCColor(220, 220, 220, 1);
传值的时候,在别的地方重新alloc init了一下,传的值就是空了,在家族跳到搜索的时候就出现了,因为在presenter里面的onenter方法里又初始化了一个record 要注意
切换按钮的时候让那个黄色的线 有动画
: [UIView animateWithDuration:0.25 animations:^{
self.bottomLineLeftCons.constant = bottomLineOffset;
[self.view layoutIfNeeded];
}];
使用masonry后,可以定义MAScontraint,这个类为某个控件的某个约束方向,不使用masonry可以使用NSLayoutConstraint, 但是定完位移后。一定要加layoutIfNeeded才会实现移动动画,否则是直接移动过去了,这句话特别重要
没考虑到的地方要加上:
之前一直都用contentOffset,没出过问题,今天写广告栏想用下scrollRectToVisible这个方法,然后就悲剧了,测试了,一下
CGRect nextRect = CGRectMake(page *scrollW, 0, scrollW, scrollH);
[self.adScrollView scrollRectToVisible:nextRect animated:YES];
NSLog(@"%@",NSStringFromCGRect(nextRect));
打印出来的rect也在滚动,但是画面一直不切换,差点崩溃。。。
废话有点多,上干货:
因为我在设置UIScrollView的ContentSize的时候容易把width或者height设置为0。
解决方法:将相应的width或者height调整为非0.
在一个view内布局的时候,用masonry就一直用masonry 不要和frame掺着用,因为frame是即时生效,代码走过去就出效果,而masonry是延迟生效,块代码结束之后统一处理,在首页的navi导航栏的布局中就有此问题,统一改为了frame布局
// 之前最大的bug 就是这个主页的cell跟美工图不一样,无法改,改了cell的高度后,滑动的时候会出现collection底部会往上抬的情况,因为下面的方法里 是用宏来定义的,其实只要在下面的方法给定高度就可以 不在要宏里面定高度宽度+多少或者-多少,这样不稳
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
return CGSizeMake(SINGER_CELL_WIDTH, SINGER_CELL_HEIGHT+10);
}
判断的时候 if内要用一个能准确表达判断条件的组合的命名来标示,比如要写一个判断if(dd!=nil && aa isKindofclass:xx && a》= 0){
这种判断。写的时候可能知道是什么意思,但是过了一段时间忘了再来看就不知道什么意思了 所以要这么写
bool isValidDic = dd!=nil && aa isKindofclass:xx && a》= 0;
if(isValidDic){。。。}
}
什么能反映你的代码意图?那就是命名,一定要规范,合理,准确。
还有一个 就是判断的时候 尽量不要写 if(aaa)其实这样写的意思就是 判断如果aaa存在 ,但是 有的时候 写程序的人不一样,比如aaa是一个字典,我不用初始化方法来定义,而是用字面量来写,aaa= @{},aaa内容是空,是不存在的,判断里面的代码就不会执行。写代码的时候要写完整,if(aaa!= nil ) 这样写最好
导航栏上的按钮前三个能点击,后三个不能点击 是啥原因?
通常,一个按钮不能接收点击事件原因有以下几个:
- button的 user invalid = no;
- button的点击事件被手势拦截
- button 被透明view覆盖
- button的父view的frame过小,button加载到父view上的时候能照常加载,照常显示,但是不能处理点击事件通常这都是最容易忽略的一点。 经过处理后,将button的父view的frame变大,宽度增加到最后一个button的右边,就可以了。
- 好记性不如烂笔头,一定要记住啊!!!!!
导航栏是一个scroll,然后下面有一个横线,scroll切换位置的时候换视图,就是主页,滑动切屏效果,给底部横线加动画的实现
第一个是滑动隐藏tabbar的实现
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGPoint offset = scrollView.contentOffset;
if ([scrollView isEqual:mOutScroller]) {
if (_historyY < offset.y) {
[self setTabbarHidden:YES];
//当前的滑动位置回到最上方约一个屏幕时,tabbar不隐藏
if (offset.y+300 < SCREEN_HEIGHT) {
[self setTabbarHidden:NO];
}
}else{
[self setTabbarHidden:NO];
}
_historyY = offset.y;
}else if ([scrollView isEqual:mCategorySingerScroller]) {
//为什么要定3个button呢因为button的长度在定义的时候宽度没定死是自适应的,并且间距也没定,所以无法向其他button那样直接拿长宽间距来写,只能找到当前选择的titlebutton做为基准,找到上一个和下一个button。并且注意button的tag为0和最大值的时候btn1和btn2的yo_x都是空就不会连续滑动弹出界面的情况、
UIButton *btn = [mTitleViews objectAtIndex:self.record.selectCategoryTitle];
UIButton * btn1;
if (self.record.selectCategoryTitle < self.record.systemStartRecord.config.tag.count-1) {
btn1 = [mTitleViews objectAtIndex:(self.record.selectCategoryTitle + 1)];
}
UIButton *btn2;
if (self.record.selectCategoryTitle >= 1) {
btn2 = [mTitleViews objectAtIndex:(self.record.selectCategoryTitle - 1)];
}
//这俩rightSlider和leftSlider,是比例的意思,就是当滑动界面的时候找到当前的offset.x值,减去当前title的tag*屏幕宽度后剩余的宽度与屏幕宽度的比值,意思就是看你当前滑动的位置占到了屏幕宽度的多少比例,根据这个比例乘以俩button的距离,就是看到的滑动的平滑效果。应该比较好理解。
CGFloat rightSlider = (offset.x - self.record.selectCategoryTitle * SCREEN_WIDTH) / SCREEN_WIDTH;
CGFloat leftSlider = (self.record.selectCategoryTitle * SCREEN_WIDTH - offset.x) / SCREEN_WIDTH;
[UIView animateWithDuration:0.15 animations:^{
if (_historyX < offset.x) {
if (offset.x <= (self.record.systemStartRecord.config.tag.count -1)*SCREEN_WIDTH) {
mTitleBottomLineView.mj_x = btn.mj_x + (btn1.yo_x - btn.yo_x)* rightSlider;
}
}else{
if (self.record.selectCategoryTitle >= 1) {
mTitleBottomLineView.mj_x = btn.mj_x - (btn.yo_x - btn2.yo_x) *leftSlider;
}
}
}];
_historyX = offset.x;
}
}
-(void)setTabbarHidden:(BOOL)hidden{
UIView *tab = self.tabBarController.view;
CGRect tabRect=self.tabBarController.tabBar.frame;
if ([tab.subviews count] < 2) {
return;
}
UIView *view;
if ([[tab.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]]) {
view = [tab.subviews objectAtIndex:1];
} else {
view = [tab.subviews objectAtIndex:0];
}
if (hidden) {
view.frame = tab.bounds;
tabRect.origin.y=[[UIScreen mainScreen] bounds].size.height+self.tabBarController.tabBar.frame.size.height;
} else {
view.frame = CGRectMake(tab.bounds.origin.x, tab.bounds.origin.y, tab.bounds.size.width, tab.bounds.size.height);
tabRect.origin.y=[[UIScreen mainScreen] bounds].size.height-self.tabBarController.tabBar.frame.size.height;
}
[UIView animateWithDuration:0.5f animations:^{
self.tabBarController.tabBar.frame=tabRect;
}completion:^(BOOL finished) {
}];
}
iOS中的垃圾处理机制是根据一个对象的索引数来处理的,为0的时候表示没有地方使用该对象,则该对象将被清除,而基本数据类型不属于对象,它的创建和使用都是在内存中,超出对应方法体即被清除,所以不需要使用垃圾处理机制,无需记录索引值,所以使用assgin