FragmentTransaction有三个add方法
分别是
add(int containerViewId, Fragment fragment)
Calls add(int, Fragment, String) with a null tag.
add(Fragment fragment, String tag)
Calls add(int, Fragment, String) with a 0 containerViewId.
add(int containerViewId, Fragment fragment, String tag)
Add a fragment to the activity state.
如果想把一个带有UI的Fragment添加到当前的Activity里面,需要使用add(int containerViewId, Fragment fragment)或者 add(int containerViewId, Fragment fragment, String tag)这两个方法,containerViewId一定是fragment的容器视图的id,而非是fragment的id,也就是说 这个id如果通过 FragmentManager.findFragmentById()是找不到的,只有通过FragmentManager.findFragmentByTag 设定的Tag才能找到的。
首先导入CoreText.framework,并在需要使用的文件中导入:
#import<CoreText/CoreText.h>
创建一个NSMutableAttributedString:
非常常规的创建方式,接下来我们给它配置属性:
这样就算是配置好了,但是我们可以发现NSAttributedString继承于NSObject,并且不支持任何draw的方法,那我们就只能自己draw了。写一个UIView的子类(假设命名为TView),在initWithFrame中把背景色设为透明(self.backgroundColor = [UIColor clearColor]),然后在重写drawRect方法:
在代码中我们调整了CTM(current transformation matrix),这是因为Quartz 2D的坐标系统不同,比如(10, 10)到(20, 20)的直线坐标:
坐标类似于数学中的坐标,可以先不调整CTM,看它是什么样子的,下面两种调整方法是完全一样的:
==
CTFramesetter是CTFrame的创建工厂,NSAttributedString需要通过CTFrame绘制到界面上,得到CTFramesetter后,创建path(绘制路径),然后得到CTFrame,最后通过CTFrameDraw方法绘制到界面上。
如果想要计算NSAttributedString所要的size,就需要用到这个API:
CTFramesetterSuggestFrameSizeWithConstraints,用NSString的sizeWithFont算多行时会算不准的,因为在CoreText里,行间距也是你来控制的。
设置行间距和换行模式都是设置一个属性:kCTParagraphStyleAttributeName,这个属性里面又分为很多子
属性,其中就包括
- kCTLineBreakByCharWrapping
- kCTParagraphStyleSpecifierLineSpacingAdjustment
-----------------------------------------猥琐的分界线-----------------------------------------
这并不是唯一的方法,还有另一种替代方案:
CATextLayer可以直接支持NSAttributedString!
-----------------------------------------猥琐的分界线-----------------------------------------
效果图:
package cn.com.jdsc; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.View; import android.view.View.OnClickListener; import android.widget.RadioButton; public class MainActivity extends FragmentActivity implements OnClickListener{ public static final int TAB_HOME = 0; public static final int TAB_CATAGORY = 1; public static final int TAB_CAR = 2; public static final int TAB_BUY = 3; public static final int TAB_MORE = 4; private ViewPager viewPager; private RadioButton main_tab_home, main_tab_catagory, main_tab_car, main_tab_buy, main_tab_more; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragmentmain); initView(); addListener(); } private void initView() { viewPager = (ViewPager) findViewById(R.id.viewpager); main_tab_home = (RadioButton) findViewById(R.id.main_tab_home); main_tab_catagory = (RadioButton) findViewById(R.id.main_tab_catagory); main_tab_car = (RadioButton) findViewById(R.id.main_tab_car); main_tab_buy = (RadioButton) findViewById(R.id.main_tab_buy); main_tab_more = (RadioButton) findViewById(R.id.main_tab_more); main_tab_home.setOnClickListener(this); main_tab_catagory.setOnClickListener(this); main_tab_car.setOnClickListener(this); main_tab_buy.setOnClickListener(this); main_tab_more.setOnClickListener(this); FragmentAdapter adapter = new FragmentAdapter( getSupportFragmentManager()); viewPager.setAdapter(adapter); } private void addListener() { viewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int id) { switch (id) { case TAB_HOME: main_tab_home.setChecked(true); break; case TAB_CATAGORY: main_tab_catagory.setChecked(true); break; case TAB_CAR: main_tab_car.setChecked(true); break; case TAB_BUY: main_tab_buy.setChecked(true); break; case TAB_MORE: main_tab_more.setChecked(true); break; default: break; } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.main_tab_home: viewPager.setCurrentItem(TAB_HOME); break; case R.id.main_tab_catagory: viewPager.setCurrentItem(TAB_CATAGORY); break; case R.id.main_tab_car: viewPager.setCurrentItem(TAB_CAR); break; case R.id.main_tab_buy: viewPager.setCurrentItem(TAB_BUY); break; case R.id.main_tab_more: viewPager.setCurrentItem(TAB_MORE); break; default: break; } } }
各个Fragment
package cn.com.jdsc; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class HomeFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { System.out.println("HomeFragment"); return inflater.inflate(R.layout.main_home, container, false); } }
下载地址:http://download.csdn.net/detail/qq634416025/6392371