IOS 开发之xcode对比两个分支中同一个文件对于同一个项目的两个分支,因为两个分支可能各自都做了一些修改,所以通过Source Control中的History...功能是无法查看的,如下图:这个时候,我们需要用到xcode的另外一个功能,如图:操作步骤:1.点击图中标注为1红框中的按钮,中间的界面会出现并排的两个窗口3和4(窗口3为当前分支文件内容)。2.从另外一个分支的xcode窗口中选中同名的文件,然后使用“command+`”切换到当前的xcode窗口。3.拖动文件到图片中标注2红框中的位置,窗口4即为拖动过来文件的内容。4.xcode会自动标注两个文件中不同的部分,这样就可以很方便的查看不同分支同一个文件的不同点啦。注:使用场景为两个分支同一个文件都做了修改的情况以上就是IOS 开发之xcode对比两个分支中同一个文件如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

实现方式没有引入任何依赖,轻量级实现需求效果最近遇到一个需求,需要做一个搜索功能。搜索的内容需要加粗显示。完成了这个功能后,写下此博客,记录一下实现过程效果图首先自定义一个StyleSpan,在StyleSpan里做加粗的等匹配状态的设置@SuppressLint("ParcelCreator")public class SearchStyleSpan extends StyleSpan { public SearchStyleSpan(int style) { super(style); } @Override public void updateDrawState(TextPaint ds) { ds.setFakeBoldText(true); //FIXME 这里还可以做其他差异性设置(修改文字大小等) super.updateDrawState(ds); } @Override public void updateMeasureState(TextPaint paint) { paint.setFakeBoldText(true); super.updateMeasureState(paint); }}监听编辑框的内容变化mEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable editable) { checkSearchContent(mEditText.getText().toString()); } });通过循环,将TextView 里的文字根据匹配内容分段SpannableStringBuilder searchStyle = new SpannableStringBuilder(); int start; while (content.contains(searchContent)) { start = content.indexOf(searchContent); searchStyle.append(getBoldSpannable(content.substring(0, start + searchContent.length()), searchContent)); content = content.substring(start + searchContent.length()); } searchStyle.append(content);将分段好的文字进行加粗处理 int start = content.indexOf(searchContent); SpannableStringBuilder ssb = new SpannableStringBuilder(content); ssb.setSpan(new SearchStyleSpan(Typeface.NORMAL), start, start + searchContent.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);源码地址:https://github.com/TitleZWC/BoldSpannable以上所述是小编给大家介绍的Android 开发中根据搜索内容实现TextView中的文字部分加粗,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

在很多地方我们都会用到纵向列表样式的菜单,比如微信首页的我、发现页面,微博的首页的我页面,QQ的动态页面等等等等,大多数的应用中都会存在这样的页面。我们怎样实现这种页面比较好呢?布局方案完成这样的页面,常见的布局方案有: 1. 用ScrollView+LinearLayout很容易的暴力布局出来,但是这样得到的布局太固定了,如果条目多一点,加载起来很耗时。 2. 用ListView来实现,这种方案比方案一要好上不少,起码数据多点的时候,加载时不会太耗时。但是分割线和中间空白在要求差异化的时候,不太好绘制,用View的话又觉得大材小用。 3. 用RecyclerView来实现。RecyclerView做纵向布局相比ListView在很多方面也更灵活,无论是动画还是分割线上。实现效果三个图片中分割线样式都是比较常见的。使用起来当然是希望以最简单粗暴的方式去使用,比如:mMenuView.setCutLineLeftPadding(30);mMenuView.setCutLineRightPadding(30);mMenuView.setGapLineColor(getResources().getColor(R.color.theme_bg));MenuBean h=new MenuBean();//或者直接指定rootViewh.type=R.layout.head_user;h.menu="美其名曰美";h.info="天道有常,不为尧存,不为桀亡。";mMenuView.addMenu(5,h);mMenuView.addGap(30);addMenu(11,R.mipmap.ic1,"菜单一","新年新气象",true);addMenu(12,R.mipmap.ic2,"菜单二","",false);addMenu(13,R.mipmap.ic3,"菜单三","发现更好的自己",false);mMenuView.addGap(30);addMenu(14,R.mipmap.ic4,"菜单四","",true);addMenu(15,R.mipmap.ic5,"菜单五","",true);mMenuView.addGap(30);addMenu(16,R.mipmap.ic6,"菜单六","",true);addMenu(17,R.mipmap.ic7,"菜单七","",false);addMenu(18,R.mipmap.ic8,"菜单八","开心才是最重要的",true);具体实现实现这样的效果,如果不考虑分割线的话,那么稍微用过RecyclerView的应该都能显示这样的功能,所以重点还是在分割线上了。 RecyclerView有一个增加分割线的方法addItemDecoration,当然,这个方法并不是只能用来增加分割线。类似微信中通讯录按照ABCD顺序排列,并分组同样可以用这个方法来实现。 直接贴上自定义的分割线的代码,在代码中解释:class MenuDecoration extends RecyclerView.ItemDecoration{ //onDraw在每次重绘时都会调用,比如滑动RecyclerView //gap线为从左到右的完整线条,在最开始的item上,最后的item下,或者空白区域的上下 //cut线为两个紧密挨着的两个item之间的线条 @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); //当第一个Item可见的时候,给第一个Item顶上绘一条Gap线 //不用完整可见才绘制,考虑设置paddingTop+clipPadding=false的情况 if(mLayout.findFirstVisibleItemPosition()==0){ int bottom=parent.getChildAt(0).getTop(); paint.setColor(gapLineColor); c.drawLine(parent.getLeft(),bottom-halfLineHeight,parent.getRight(),bottom-halfLineHeight,paint); } int count=parent.getChildCount(); int gap; int end=mData.size()-1; //所有可见的Item下面画线 for (int i=0;i<count;i++){ final View child = parent.getChildAt(i); int position=mLayout.getPosition(child); gap=mGap.get(position); float startY=child.getBottom()+halfLineHeight; //View下面不存在gap且不是最好一个Item的时候,绘制Cut线,否则绘制gap线 if(gap==0&&position!=end){ //绘制cut线的左边线条 if(leftPaddingLine!=0){ paint.setColor(foreLineColor); c.drawLine(parent.getLeft(),startY,parent.getLeft()+leftPaddingLine,startY,paint); } //绘制cut线的右边线条 if(rightPaddingLine!=0){ paint.setColor(foreLineColor); c.drawLine(parent.getRight()-rightPaddingLine,startY,parent.getRight(),startY,paint); } //绘制cut线的中间线条 paint.setColor(cutLineColor); c.drawLine(parent.getLeft()+leftPaddingLine,startY,parent.getRight()-rightPaddingLine,startY,paint); }else{ paint.setColor(gapLineColor); //绘制gap上面的一条线 c.drawLine(parent.getLeft(),child.getBottom()+halfLineHeight,parent.getRight(),child.getBottom()+halfLineHeight,paint); //如果不是最后一个item,绘制gap下面的一条线 if(position<end){ c.drawLine(parent.getLeft(),child.getBottom()+gap+halfLineHeight,parent.getRight(),child.getBottom()+gap+halfLineHeight,paint); } } } } //在每个item加载时调用,用来判断设置每个item上下左边的空白区域,设置内容分别设置到outRect中 @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); int position=mLayout.getPosition(view); //如果是第一个Item,则设置上线条高度,否则不设置上线条高度 //为每个item设置下边线条+gap(如果有的话,没有就为0)的高度 //四个参数分别为左边空白区域,上方空白区域,右边空白区域,下方空白区域 outRect.set(0, position != 0 ? 0 : (int)(halfLineHeight * 2+0.5f),0,(int)(halfLineHeight*2+0.5f)+mGap.get(position)); }}这样我们就得到了一个用来绘制分割线的类了。在需要插入空白的地方addGap,并传入gap的高度:public void addGap(int height){ mGap.put(mData.size()-1,height);}这样分割线和空白的问题就解决了。其他的就是RecyclerView的简单使用了,为了使用方便,我们对RecyclerView和其Adapter简单封装一下,就能实现用addMenu的方式增加菜单项了。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

我知道没人会主动设置这个东西,但是大家一定都遇到过这个问题,下面总结下可能是哪些情况:  1, self.automaticallyAdjustsScrollViewInsets = NO;   这个应该是最常见而且不容易被发现的原因,起因是iOS7在Conttoller中新增了automaticallyAdjustsScrollViewInsets这个属性,当设置为YES时(默认YES),如果视图里面存在唯一一个UIScrollView或其子类View,那么它会自动设置相应的内边距,这样可以让scroll占据整个视图,又不会让导航栏遮盖。  PS:iOS7里面的布局问题挺多的,使用autolayout的时候会遇到好多,大概是因为iOS7新加入autolayout还还不成熟导致的吧。  2,navigationbar设置问题  虽然表面上看是tableview顶部有空白,但实际上可能是因为navigationbar设置问题导致。   self.navigationController.navigationBar.translucent = NO; 这个属性设为no之后,tableview会在上方留出64.f的位置给navigationbar,也有小概率导致这个问题。  3,tableview section header高度设置问题  这个应该是新手遇到的比较多的。起因是iOS奇葩的逻辑,如果你设置header(或者footer)高度是0的话,系统会认为你没设置,然后将其设置为40.f。所以需要将其设置为一个较小的数:- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {return 0.001f;}   4,tableview的header、footer设置问题  和3很像是不是?没发现区别吗?那就再读一次看看。这次是tableview的header视图引起的,而不是section的header高度引起。对于tableview,不仅每个section有header,tableview整体也有header和footer,API如下:@property (nonatomic, strong, nullable) UIView *tableHeaderView; // accessory view for above row content. default is nil. not to be confused with section [email protected] (nonatomic, strong, nullable) UIView *tableFooterView; // accessory view below content. default is nil. not to be confused with section footer   这个header和footer要比section的header要和谐一些,只要你不去主动碰它就没事,但是如果你碰了...哼,哼...基本上会被设置出40.f高的间距。出现如下任意一行代码均会引起这个问题:  self.tableView.tableHeaderView = nil;    self.tableView.tableHeaderView = [[UIView alloc] init];    self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectZero];    self.tableView.tableFooterView = nil;    self.tableView.tableFooterView = [[UIView alloc] init];    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];   对,你没想错,footerView也不能设置,footer和header只要设置了任意一个都会使两个地方都出现空白。不要问我为什么...  当然,如果有的时候真的只需要其中一个view的话该怎么办呢?请如下设置:(似不似傻,自己建一个view呗,非得用着恶心的东西么...)  self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 0.0001f)];self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 0.0001f)];   说白了,还是得设置成一个很小的高度,而不是0才行。  关于tableView顶部空白的总结基本就这些了,如果想屏蔽的话,建议把这些写在baseTableViewController里面,这样就不用每次都扣这些东西了。宏懒得粘了,都是常见的,大家应该都能看懂。navigationbar那个,因为这个东西一般不在这里设置,写在base里面不是一个好的做法。//// HLNBaseTableViewController.m// HLN-IMDemo//// Created by heiline on 15/8/25.// Copyright (c) 2015年 baidu. All rights reserved.//#import "HLNBaseTableViewController.h"@interface HLNBaseTableViewController () @[email protected] HLNBaseTableViewController- (void)viewDidLoad {[super viewDidLoad];self.tableView = [[UITableView alloc] initWithFrame:(CGRect){CGPointZero, kScreenSize} style:_tableViewStyle];[self.view addSubview:self.tableView];self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 0.0001f)];self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 0.0001f)];if (self.navigationController != nil) {self.tableView.height -= kNavBarH + kStatusBarH;}if (self.tabBarController != nil) {if (self.navigationController.childViewControllers.count == 1) {self.tableView.height -= kTabBarH;}}self.tableView.delegate = self;self.tableView.dataSource = self;self.automaticallyAdjustsScrollViewInsets = NO;}- (void)dealloc {self.tableView.dataSource = nil;self.tableView.delegate = nil;}#pragma mark Table View Data Source And delegate Methods-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {return 0;}-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return 0;}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {return [[UITableViewCell alloc] init];}-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {}- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {return nil;}- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {return nil;}- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {return 0.001f;}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {return 40.f;}-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:

在Android上开发一些小应用既可以积累知识又可以增加乐趣,与任务式开发不同,所以想到在Android系统上实现一个简单的涂鸦板,这是我们练手的一种好的方法。       涂鸦板应用的代码实现       新建工程MyWall,修改/res/layout/main.xml文件,在里面添加一个SurfaceView和两个Button,用到了RelativeLayout布局,完整的main.xml文件如下:XML/HTML代码<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <SurfaceView android:id="@+id/surfaceview"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_above="@+id/line"android:layout_alignParentTop="true"/> <LinearLayoutandroid:id="@+id/line"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"> <Buttonandroid:id="@+id/flushbutton"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="清屏"/> <Buttonandroid:id="@+id/colorbutton"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1" android:text="颜色"/></LinearLayout></RelativeLayout>        接着,修改MyWallActivity.java文件,最主要是重写了onTouchEvent()函数,在这个函数里过滤出触屏拖动事件,然后获取其相应的坐标和画线。完整的内容如下:Java代码package com.nan.wall; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.os.Bundle; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; public class MyWallActivity extends Activity { private SurfaceView mSurfaceView = null; private SurfaceHolder mSurfaceHolder = null; private Button cleanButton = null; private Button colorButton = null; private float oldX = 0f; private float oldY = 0f; private boolean canDraw = false; private Paint mPaint = null; //用来记录当前是哪一种颜色 private int whichColor = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mSurfaceView = (SurfaceView)this.findViewById(R.id.surfaceview); mSurfaceHolder = mSurfaceView.getHolder(); mPaint = new Paint(); //画笔的颜色 mPaint.setColor(Color.RED); //画笔的粗细 mPaint.setStrokeWidth(2.0f); cleanButton = (Button)this.findViewById(R.id.flushbutton); //按钮监听 cleanButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //锁定整个SurfaceView Canvas mCanvas = mSurfaceHolder.lockCanvas(); mCanvas.drawColor(Color.BLACK); //绘制完成,提交修改 mSurfaceHolder.unlockCanvasAndPost(mCanvas); //重新锁一次 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0)); mSurfaceHolder.unlockCanvasAndPost(mCanvas); } }); colorButton = (Button)this.findViewById(R.id.colorbutton); //按钮监听 colorButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Dialog mDialog = new AlertDialog.Builder(MyWallActivity.this) .setTitle("颜色设置") .setSingleChoiceItems(new String[]{"红色","绿色","蓝色"}, whichColor, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub switch(which) { case 0: { //画笔的颜色 mPaint.setColor(Color.RED); whichColor = 0; break; } case 1: { //画笔的颜色 mPaint.setColor(Color.GREEN); whichColor = 1; break; } case 2: { //画笔的颜色106 mPaint.setColor(Color.BLUE); whichColor = 2; break; } } } }) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } }) .create(); mDialog.show(); } }); @Override public boolean onTouchEvent(MotionEvent event) { //获取x坐标 float x = event.getX(); //获取y坐标(不知道为什么要减去一个偏移值才对得准屏幕) float y = event.getY()-50; //第一次进来先不管 if(canDraw) { //获取触屏事件 switch(event.getAction()) { //如果是拖动事件 case MotionEvent.ACTION_MOVE: { //锁定整个SurfaceView Canvas mCanvas = mSurfaceHolder.lockCanvas(); mCanvas.drawLine(x, y, oldX, oldY, mPaint); mSurfaceHolder.unlockCanvasAndPost(mCanvas); //重新锁一次 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0)); mSurfaceHolder.unlockCanvasAndPost(mCanvas); break; } } } //保存目前的x坐标值 oldX = x; //保存目前的y坐标值 oldY = y; canDraw = true; return true; } } 应用测试       在模拟器上运行此应用是如下效果:       在Android手机上运行效果则是这样的:        字写的有点丑,但是功能实现了。在获取了Y坐标后减去一个偏移值50,这个值是猜出来的,没想到在模拟器和真机上定位得都还蛮准的。       应用比较简易,但是大家可以在此基础上丰富它的功能,使其成为一个像样的Android应用。       以上就是Android 简单涂鸦板的简单示例,后续继续整理相关资料,谢谢大家对本站的支持!

分类:腾博会手机版下载

时间:2016-08-08 10:06:01