RelativeLayout 居中显示

Alt none

XML方式

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin"
                tools:context=".MainActivity">

    <TextView
        android:id="@+id/center"
        android:background="@android:color/holo_red_light"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_centerInParent="true"
        android:text="Center"
        android:gravity="center" />


    <TextView
        android:id="@+id/left"
        android:background="@android:color/background_dark"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignTop="@id/center"
        android:layout_toLeftOf="@id/center"
        android:text="Left"
        android:textColor="@android:color/white"
        android:gravity="center"
        />


    <TextView
        android:id="@+id/right"
        android:background="@android:color/holo_purple"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignTop="@id/center"
        android:layout_toRightOf="@id/center"
        android:text="Right"
        android:textColor="@android:color/white"
        android:gravity="center"
        />
</RelativeLayout>

Java方式

centerLayoutParam.addRule(RelativeLayout.CENTER_IN_PARENT);//把center TextView居中显示

leftLayoutParam.addRule(RelativeLayout.LEFT_OF, R.id.one);//把left TextView控件放在center TextView左侧显示,并且距离center TextView为50px
((MarginLayoutParams) LayoutParam).rightMargin = 50;

...

这种方法的好处是可以把某一个控件先居中显示,然后再根据相对位置来摆放其他控件。

Android 引用自定义布局

对非内部类的引用

<com.android.notepad.MyEditText
  id="@+id/note"
  ... />

对内部类的引用

<view
  class="com.android.notepad.NoteEditor$MyEditText" 
  id="@+id/note"
  ... />

iOS Segue 跳转

需求

现在有2个View,第一个View(SummaryView)中包含了一个TableView,第二个View(DetailView)中包含了一个TextView,其内容显示的是对应第一个TableView中的某一行的详细内容。当点击SummaryView中的某一行后,跳转到DetailView显示其详细信息。 Alt none

显示摘要信息的TableView Alt none

显示详细信息的View

自动跳转

自动跳转的方式极其简单,甚至不需要自己写任何一行代码,但是它存在一些数据传递的问题,这个问题的下次在说。 选中TableView中的TableViewCell,使用快捷键(Ctrl + 3指)跟DetailView中的DetailViewController建立一个Segue,在弹出的菜单中选择Push。建立Segue后如下图: Alt none

Segue

选中Segue打开Attribute inspector,设置Identifier为showDetail。 Alt none

选择Segue

Alt none

设置Segue标识

prepareForSegue:sender方法会在View跳转的时候被回调, 可以在这里处理一些跳转过程事务:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showDetail"]) {
        NSLog(@"prepareForSegue:sender invoked: %@", self.description);
    }
}

前面说过使用自动跳转的方法会有一些局限性,比如数据的传递问题。很多时候还是需要使用代码的方式来手动跳转。

手动跳转

同样的需要在SummaryView和DetailView之间建立Segue,但是这次不是在TableViewCell和DetailViewController之间,而是在SummaryViewController(TableView所在的ViewController)和DetailViewController之间建立Segue。 选中SummaryViewController,使用快捷键(Ctrl + 3指)跟DetailViewController建立一个Segue,在弹出的菜单中选择Push。 Alt none

选中SummaryViewController Alt none

建立Segue后的状态

跟第一种方法一样设置Segue的Identifier为showDetail。

最后调用performSegueWithIdentifier:sender:实现View跳转:

[self performSegueWithIdentifier:@"showDetail" sender:self];

iOS CGRectInset

dx, dy为正

    UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 500, 500)];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    
    UIView *blueView = [[UIView alloc]init];
    blueView.frame = CGRectInset(redView.frame, 50, 50);
    blueView.backgroundColor = [UIColor blueColor];
    [self.view addSubview:blueView];

Alt none

dx, dy为负

    UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 500, 500)];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    
    UIView *blueView = [[UIView alloc]init];
    blueView.frame = CGRectInset(redView.frame, -50, -50);
    blueView.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:0.5];
    [self.view addSubview:blueView];

注意blueView加了50%的透明,否则redView被完全覆盖 Alt none

Objc 中 nil Nil NULL NSNull 之间的区别

nil

#ifndef nil
     #define nil __DARWIN_NULL    /* id of Nil instance */
#endif

Nil

#ifndef Nil
     #define Nil __DARWIN_NULL    /* id of Nil class */
#endif

NULL

#ifndef NULL
    #define NULL    __DARWIN_NULL
#endif /* ! NULL */

NSNull

NSNull is a class defines a singleton object used to represent null values in collection objects (which don’t allow nil values).

[NSNull null]: The singleton instance of NSNull.
#import <Foundation/NSObject.h>
@interface NSNull : NSObject <NSCopying, NSCoding>
   + (NSNull *)null;
@end