0%

照着书上的Demo(iOS 5.0的教程),在- (void)viewDidLoad里设置scrollView的contentsize,让它大于屏幕的高度,却发现在模拟器中没用,还是不能滚。经过一翻搜索,发现,这是因为iOS 6.0中新增的AutoLayout机制引起的,viewDidLoad后,AutoLayout会再一次把scrollView的contentSize设为屏幕的宽高度,所以,我们的设置就无效了。 解决方法:把设置ContentSize的代码放到viewDidAppear里。

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [_scrollView setContentSize:CGSizeMake(500, 1800)];
}

xCode,IDE而已,不同版本之间变化要不要这么大?

UIImageView并不像UIButton一样,点点鼠标就可以关联点击事件,也不像Android里有onClickListener,这里需要借助于UITapGestureRecognizer类。从类名上就可以看出,这个类就是用于处理tap(单击)事件的。 bbc和voaspecial是UIImageView对象

    [bbc setUserInteractionEnabled:YES];
    [voaspecial setUserInteractionEnabled:YES];
    [bbc addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickCategory:)]];
    [voaspecial addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickCategory:)]];

经测试,多个UIImageView不能共用一个UITapGestureRecognizer对象,之前调用的会没效果。 根据点击的view判断来自谁的点击。

-(void)clickCategory:(UITapGestureRecognizer *)gestureRecognizer
{
    NSLog(@"click");
    NSLog(@"%hhd",[gestureRecognizer isMemberOfClass:[UITapGestureRecognizer class]]);
    
    UIView *viewClicked=[gestureRecognizer view];
    if (viewClicked==bbc) {
        NSLog(@"bbc");
    }else if(viewClicked==voaspecial)
    {
        NSLog(@"voaspecial");
    }
  
}

原理,在TextView的onTouch事件里,取到点击的座标,再根据y座标,找出第几行,再根据行号,找出该行显示的字符串,然后根据x座标,计算点击处的字符。如果处理中文,找到即可,找英文单词的话,在该字符前后查找,看其是否属于同一个单词。 根据x座标行内查找这里,应该有更快的算法,因为我用的的最笨的方法,希望得到高人指点。

textView.setOnTouchListener(new OnTouchListener() {
            
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO 自动生成的方法存根
                switch(event.getAction())
                {
                case MotionEvent.ACTION_DOWN:
                    float x=event.getX();
                    float y=event.getY();
                    //因为行设置行间距后,文本在顶部,空白在底部,加上一半的行间距,可以实现与文本垂直居中一样的效果
                    y=y+textView.getLineSpacingExtra()/2-textView.getPaddingTop();
                    //在顶部padding空白处点击
                    if(y<0)
                        return false;
                    int singleLineHeight=textView.getLineHeight();
                    StaticLayout layout=(StaticLayout)textView.getLayout();
                
                    int lineNumber=Math.round(y/singleLineHeight)-1;
                    if(lineNumber<0)
                        lineNumber=0;
                    if(lineNumber>textView.getLineCount()-1)
                        lineNumber-=1;
                    int start=layout.getLineStart(lineNumber);
                    int end=layout.getLineEnd(lineNumber);
                    
                    String str=textView.getText().toString().substring(start, end);
                 	Paint paint=new Paint();
                	paint.setTextSize(textView.getTextSize());//设置字符大小
                	//单字节占宽度
                	int sigleByteWidth=(int)paint.measureText("1", 0, 1);
                    
                	//减掉padding
                	float realX=x-textView.getPaddingLeft();
                	//在左侧padding空白处点击
                	if(realX<0)
                	{
                		return false;
                	}
                	//字符串可能的最大长度
                	//这里应该有更好更快的算法
                	int maxLength=(int)Math.floor(realX/sigleByteWidth);
                	//一般不会有字符显示超过两个1的宽度
                	int miniLenth=maxLength/2;
                	int strLength=str.length();
                	for(int i=strLength;i>=miniLenth;i--)
                	{
                		//字符串显示的宽度
                		float displayWidth=paint.measureText(str, 0, i);
                		if(Math.abs(displayWidth-realX)90&&clickChar<97)||clickChar>122)
                			{
                				return false;
                			}
                			//取单词,这段只针对英文,中文需要海量词库,太复杂了,前后看是不是空格或符号
                			StringBuilder sb=new StringBuilder();
                			sb.append(str.substring(i-1,i));
                			//查找前后的字符是否是同一个单词
                			String strBefore=str.substring(0,i-1);
                			String strAfter=str.substring(i,str.length());
                			
                			String strBeforeReverse=reverseStr(strBefore);
                			Pattern p1=Pattern.compile("(^[a-zA-Z]+)");
                			//正则
                			Matcher m1=p1.matcher(strBeforeReverse);
                			if(m1.find())
                			{
                				sb.insert(0, reverseStr(m1.group(1)));
                			}
                			
                			m1=p1.matcher(strAfter);
                			if(m1.find())
                			{
                				sb.append(m1.group(1));
                			}
                			System.out.println("点击单词"+sb.toString());
                			break;
                		}
                	}
                    break;
                }
                return false;
            }
        });



    /**
     * 反转字符串
     * @param s
     * @return
     */
    public String reverseStr(String s) {
        StringBuilder sb = new StringBuilder();
        for (int i = s.length() - 1; i >= 0; i--) {
            sb.append(s.charAt(i));
        }
        return sb.toString();
    }

Paint paint = new Paint();
paint.setTextSize(fontSize);
FontMetrics fm = paint.getFontMetrics();
int textHeight=(int) Math.ceil(fm.descent - fm.top) ;

如果要排除某些文件不提交,可以写规则到.gitignore文件中,但是.gitignore不能忽略自身,而我又不想把这个文件提交到server上,怎么办呢?可以编辑.git/info/exclude文件,语法与.gitignore一致。两个文件区别在于,exclude只用于设置本地需要忽略的文件,而.gitignore是公共需要排除的。

ctrl+command+left/right 编辑器中打开过的文件切换 command+click 在方法名或类名上操作,打开相应的头文件 option+click 在方法名或类名上操作,打开一个小窗口,提示该类或方法的信息。 command+/ 选中行或光标所在行注释 command+. 代码提示 command+r 编译运行 command+option+shift+? 打开帮助文档 command+option+2 在右侧工具面板显示Quick Help command+option+1 在右侧工具面板显示File Inspector(默认,与编辑内容相关) command+shift+2 打开Organizer窗口(Devices,Projects,Archives) command+1,2,3,4,5,6,7,8,右侧导航面板在Project Navigator,Symbol Navigator,Find Navigator,Issue Navigator,Test Navigator,Debug Navigator,Breakpoint Navigator,Log Navigator间切换 command+left/right 将光标移动到所在行的开始或结束,相当于windows里的Home和End的功能。好像home和end,pageup,pagedown在xcode中无效 command+backspace 将光标所在行中,光标前的内容删除。如果先command+right,再command+backspace,就是删除整行。 不定期更新…

默认情况下,command+click是在当前的tab中打开h头文件,这样要回到原来编辑的文件,就比较麻烦,如果可以像eclipse中一样,能开个新的tab,就很方便了。 解决方案: 第一种:command+t,复制一个当前tab,然后再command+click 第二种: 打开Perferences–Navigation,设置Double Click Navigation为Use Separate Tab,如果需要在新tab中打开头文件,可以command+double click

结果是: Integer.toString(i)>String.valueOf(i)>””+i 好吧,我是看到””+1这种奇葩写法才想确认一下哪种效率最高。

我的机器是mac mini,Debug时狂按F5,F6没反应,打开eclipse设置重新设置快捷键,发现可以输入ctrl+f5,但就是不能输入f5,应该是快捷键与系统冲突了。打开系统快捷键设置,果然,F5,F6被设成了调节亮度,但因为我的机器不是笔记本,不能调节外接显示器亮度,所以按了没反应,果断取消。

这应该是TextView的一个BUG,本来设置android:ellipsize=“end”以后,当字符串宽度超出TextView宽度,会在截断String,加上…,但是当字符串只超出1个字符时,最后一个字符被截断,却没有加…,网上搜索了好久也没找到适用的解决方案。最后,我们牛B的PM一句话解决,字符串结尾加空格!如果字符串占用宽度刚好等于TextView宽度,多一个空格,相当于只多一个字符,自动被截断,跟没加效果相同。如果字符串占用宽度比TextView的宽度,还要多一个字符,再加一个空格,相当于多了两个字符,就会截断加上…