深入淺出了解frame和bounds

frame

frame的官方解釋如下:

The frame rectangle, which describes the view’s location and size in its superview’s coordinate system.

This rectangle defines the size and position of the view in its superview’s coordinate system. Use this rectangle during layout operations to set the size and position the view. Setting this property changes the point specified by the center property and changes the size in the bounds rectangle accordingly. The coordinates of the frame rectangle are always specified in points.

它定義了一個(gè)view相對于父視圖坐標(biāo)系的位置和大小燃领,它會影響center屬性和bounds屬性的size宴倍。
先看一下它究竟是什么?
它是一個(gè)CGRect類型,如下:

struct CGRect {
    CGPoint origin;
    CGSize size;
};
typedef struct CG_BOXABLE CGRect CGRect;

struct CGPoint {
    CGFloat x;
    CGFloat y;
};
typedef struct CG_BOXABLE CGPoint CGPoint;

/* Sizes. */

struct CGSize {
    CGFloat width;
    CGFloat height;
};
typedef struct CG_BOXABLE CGSize CGSize;

其中的origin就是該view的位置厘熟,它是一個(gè)CGPoint類型匹厘,也是一個(gè)結(jié)構(gòu)體嘀趟,包含了我們熟知的常用二維坐標(biāo)系的x、y愈诚。根據(jù)x她按、y可以在坐標(biāo)系里面唯一確定一個(gè)點(diǎn)牛隅。如下圖:


frame

這個(gè)坐標(biāo)系和我們平時(shí)接觸的還不太一樣,它是向右向下為正方向酌泰。所以對于window來說媒佣,其原點(diǎn)是左上角,比如現(xiàn)在的頭像的起始坐標(biāo)就是(200陵刹,40)默伍。按照原來常規(guī)的坐標(biāo)系來說,應(yīng)該是(200衰琐,-40)也糊。
在設(shè)置一個(gè)CGRect的時(shí)候,用到的方法是CGRectMake,其實(shí)現(xiàn)如下:

CG_INLINE CGRect
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
  CGRect rect;
  rect.origin.x = x; rect.origin.y = y;
  rect.size.width = width; rect.size.height = height;
  return rect;
}

也就是自己在實(shí)現(xiàn)部分創(chuàng)建了一個(gè)rect羡宙,然后逐個(gè)賦值狸剃。
關(guān)于frame,這里要注意的一點(diǎn)就是:frame是相對于父視圖的坐標(biāo)系來定位的狗热。如果你這樣設(shè)置frame:(0,0,100,200),也就是在父視圖左上角添加了一個(gè)寬100捕捂,高200的子視圖(前提是沒有改變父視圖的bounds,接下來會有介紹bounds)斗搞。

bounds

The bounds rectangle, which describes the view’s location and size in its own coordinate system.

The default bounds origin is (0,0) and the size is the same as the size of the rectangle in the frame property. Changing the size portion of this rectangle grows or shrinks the view relative to its center point. Changing the size also changes the size of the rectangle in the frame property to match. The coordinates of the bounds rectangle are always specified in points.

Changing the bounds rectangle automatically redisplays the view without calling its drawRect: method. If you want UIKit to call the drawRect: method, set the contentMode property to UIViewContentModeRedraw.
Changes to this property can be animated.

它也是描述的是視圖的位置和大小,只不過是在自己的坐標(biāo)系上慷妙。也就是說它描述的是當(dāng)前視圖相對于自身坐標(biāo)系的位置和大小僻焚。
舉個(gè)例子:

- (void)viewDidLoad {
    [super viewDidLoad];
   
    CGRect rect  = self.view.frame;
    self.parentView = [[ParentView alloc] initWithFrame:CGRectMake(60, 80, rect.size.width-120, rect.size.height - 160)];
    self.parentView.backgroundColor = [UIColor redColor];
    [self.view addSubview:_parentView];
    NSLog(@"frame:%@",NSStringFromCGRect(self.parentView.frame));
    NSLog(@"bounds:%@",NSStringFromCGRect(self.parentView.bounds));
    NSLog(@"center:%@",NSStringFromCGPoint(self.parentView.center));
    
}

輸出的結(jié)果如下:

frame:{{60, 80}, {200, 408}}
bounds:{{0, 0}, {200, 408}}
center:{160, 284}

由此可見,如果我們沒有去更改bounds的值膝擂,它默認(rèn)的位置坐標(biāo)點(diǎn)是(0,0)虑啤。

center

The center point of the view's frame rectangle.

The center point is specified in points in the coordinate system of its superview. Setting this property updates the origin of the rectangle in the frame property appropriately.

Use this property, instead of the frame property, when you want to change the position of a view. The center point is always valid, even when scaling or rotation factors are applied to the view's transform.

Changes to this property can be animated.

center是view的中點(diǎn)。該屬性是想歸于父類的坐標(biāo)系確定的架馋。從bounds小節(jié)里面的例子可以看到center的值狞山,其計(jì)算方法為:

center.x = frame.origin.x + frame.size.width/2
center.y = frame.origin.y + frame.size.height/2

transform

Specifies the transform applied to the view, relative to the center of its bounds.
Use this property to scale or rotate the view's frame rectangle within its superview's coordinate system. (To change the position of the view, modify the center property instead.) The default value of this property is CGAffineTransformIdentity.

Transformations occur relative to the view's anchor point. By default, the anchor point is equal to the center point of the frame rectangle. To change the anchor point, modify the anchorPoint property of the view's underlying CALayer object.

Changes to this property can be animated.

In iOS 8.0 and later, the transform property does not affect Auto Layout. Auto layout calculates a view’s alignment rectangle based on its untransformed frame.

它用于指定視圖的變換。使用這個(gè)屬性可以放大或者旋轉(zhuǎn)視圖叉寂,它的frame會因此改變萍启,是以中心點(diǎn)為變換的∑流ⅲ看例子:

- (void)viewDidLoad {
    [super viewDidLoad];
   
    CGRect rect  = self.view.frame;
    self.parentView = [[ParentView alloc] initWithFrame:CGRectMake(60, 80, rect.size.width-120, rect.size.height - 160)];
    self.parentView.backgroundColor = [UIColor redColor];
    [self.view addSubview:_parentView];
    NSLog(@"frame:%@",NSStringFromCGRect(self.parentView.frame));
    NSLog(@"bounds:%@",NSStringFromCGRect(self.parentView.bounds));
    NSLog(@"center:%@",NSStringFromCGPoint(self.parentView.center));
    
    self.parentView.transform = CGAffineTransformMakeRotation(60);
   
    NSLog(@"after change transform,frame:%@",NSStringFromCGRect(self.parentView.frame));
    NSLog(@"after change transform,bounds:%@",NSStringFromCGRect(self.parentView.bounds));
    NSLog(@"after change transform,center:%@",NSStringFromCGPoint(self.parentView.center));
}

看輸出的結(jié)果:

frame:{{60, 80}, {200, 408}}
bounds:{{0, 0}, {200, 408}}
center:{160, 284}
after change transform,frame:{{2.5773352536321568, 59.226689885086444}, {314.84532949273569, 449.54662022982711}}
after change transform,bounds:{{0, 0}, {200, 408}}
after change transform,center:{160, 284}

如圖:


transform

可以看出勘纯,當(dāng)我們對圖像通過旋轉(zhuǎn),旋轉(zhuǎn)后的圖片的frame已經(jīng)變成了{(lán)(2.5773352536321568, 59.226689885086444), (314.84532949273569, 449.54662022982711)},此時(shí)的起始位置為圖上旋轉(zhuǎn)后標(biāo)的(2.58,59.2),大小也變成了雙箭頭黑線標(biāo)注的大小。
因此得出結(jié)論:進(jìn)行了transform變換钓瞭,其frame改變了驳遵,但是其bounds和center并沒有修改。此時(shí)bounds的size和frame的size已經(jīng)沒有關(guān)系了山涡。當(dāng)沒有進(jìn)行任何transform時(shí)堤结,frame的size總是和bounds相等唆迁。

以上便是對frame、bounds竞穷、center和transform做了一個(gè)簡單的介紹唐责。

bounds的使用

接下來看一個(gè)例子(例子A):

- (void)viewDidLoad {
    [super viewDidLoad];
   
    CGRect rect  = self.view.frame;
    self.parentView = [[ParentView alloc] initWithFrame:CGRectMake(60, 80, rect.size.width-120, rect.size.height - 160)];
    self.parentView.backgroundColor = [UIColor redColor];
    [self.view addSubview:_parentView];
    NSLog(@"frame:%@",NSStringFromCGRect(self.parentView.frame));
    NSLog(@"bounds:%@",NSStringFromCGRect(self.parentView.bounds));
    NSLog(@"center:%@",NSStringFromCGPoint(self.parentView.center));
 
    self.parentView.bounds = CGRectMake(-40, -40, self.parentView.frame.size.width, self.parentView.frame.size.height);
    NSLog(@"parent change bound ,frame:%@",NSStringFromCGRect(self.parentView.frame));
    NSLog(@"parent change bound ,bounds:%@",NSStringFromCGRect(self.parentView.bounds));
    NSLog(@"parent change bound ,center:%@",NSStringFromCGPoint(self.parentView.center));

    self.childView = [[ChildView alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];
    self.childView.backgroundColor = [UIColor yellowColor];
    [self.parentView addSubview:_childView];
   
    NSLog(@"childView frame:%@",NSStringFromCGRect(self.childView.frame));
    NSLog(@"childView ounds:%@",NSStringFromCGRect(self.childView.bounds));
    NSLog(@"childView center:%@",NSStringFromCGPoint(self.childView.center));
}

這里在parentView上添加了一個(gè)childView,然后對parentView的bounds進(jìn)行修改和不修改進(jìn)行了測試,結(jié)果如下:


change bounds

你會發(fā)現(xiàn)當(dāng)修改了parentView的bounds之后来庭,發(fā)現(xiàn)childView缺向右向下做了偏移妒蔚。這里設(shè)置parentView的bounds的origin為(-40,-40)為何會發(fā)生這種情況呢?接下來先看一下下面這張圖:


坐標(biāo)系

+代表正方向月弛,-代表負(fù)方向肴盏。

如果此時(shí)我們沒有改變圖中O的坐標(biāo),那么此時(shí)A的坐標(biāo)是(20,20)帽衙,如果我們更改了O的坐標(biāo)為(-20,-20)菜皂,那么原來A點(diǎn)的坐標(biāo)就成了A'(0,0),但是A坐標(biāo)是不變的,所以它會到黑色A處厉萝。所以你改變了原點(diǎn)坐標(biāo)為負(fù)之后恍飘,A點(diǎn)會移動(dòng)到黑色A。相反如果你設(shè)置了坐標(biāo)原點(diǎn)為(20,20)谴垫,那么A點(diǎn)就會和坐標(biāo)原點(diǎn)重合章母。
這就是為什么childView會向右向下移動(dòng)的原因。
接下來再做如下操作(例子B):

- (void)viewDidLoad {
    [super viewDidLoad];
   
    CGRect rect  = self.view.frame;
    self.parentView = [[ParentView alloc] initWithFrame:CGRectMake(60, 80, rect.size.width-120, rect.size.height - 160)];
    self.parentView.backgroundColor = [UIColor redColor];
    [self.view addSubview:_parentView];
     
    NSLog(@"parent change bound ,frame:%@",NSStringFromCGRect(self.parentView.frame));
    NSLog(@"parent change bound ,bounds:%@",NSStringFromCGRect(self.parentView.bounds));
    NSLog(@"parent change bound ,center:%@",NSStringFromCGPoint(self.parentView.center));

    self.childView = [[ChildView alloc] initWithFrame:CGRectMake(self.parentView.frame.origin.x, self.parentView.frame.origin.y+self.parentView.frame.size.height-200, 100, 100)];
    self.childView.backgroundColor = [UIColor yellowColor];
    [self.parentView addSubview:_childView];
   
    
    NSLog(@"childView frame:%@",NSStringFromCGRect(self.childView.frame));
    NSLog(@"childView ounds:%@",NSStringFromCGRect(self.childView.bounds));
    NSLog(@"childView center:%@",NSStringFromCGPoint(self.childView.center));
    NSLog(@"\n--------\n");
    CGRect parentBounds = self.parentView.bounds;
    [UIView animateWithDuration:2 animations:^{
        
        self.parentView.bounds = CGRectMake(parentBounds.origin.x, 400, parentBounds.size.width, parentBounds.size.height);
    } completion:^(BOOL finished) {
        NSLog(@"anim finished,parentView frame:%@",NSStringFromCGRect(self.parentView.frame));
        NSLog(@"anim finished,parentView ounds:%@",NSStringFromCGRect(self.parentView.bounds));
        NSLog(@"anim finished,parentView center:%@",NSStringFromCGPoint(self.parentView.center));
        NSLog(@"anim finished,childView frame:%@",NSStringFromCGRect(self.childView.frame));
        NSLog(@"anim finished,childView bounds:%@",NSStringFromCGRect(self.childView.bounds));
        NSLog(@"anim finished,childView center:%@",NSStringFromCGPoint(self.childView.center));
    }];
}

輸出結(jié)果如下:

parent change bound ,frame:{{60, 80}, {200, 408}}
parent change bound ,bounds:{{0, 0}, {200, 408}}
parent change bound ,center:{160, 284}
childView frame:{{60, 288}, {100, 100}}
childView ounds:{{0, 0}, {100, 100}}
childView center:{110, 338}
--------
anim finished,parentView frame:{{60, 80}, {200, 408}}
anim finished,parentView ounds:{{0, 400}, {200, 408}}
anim finished,parentView center:{160, 284}
anim finished,childView frame:{{60, 288}, {100, 100}}
anim finished,childView bounds:{{0, 0}, {100, 100}}
anim finished,childView center:{110, 338}

運(yùn)行效果是childView向上移動(dòng)翩剪,然后停止乳怎。結(jié)果前后對比圖如下:


animation bounds

直觀來看,按說childView的frame改變了前弯,但是從console輸出的結(jié)果來看蚪缀,childView的frame/bounds/center都沒有改變,但是直觀來看其位置卻改變了恕出。再看一下parentView,只有bounds改變了询枚,frame和center卻沒變,從直觀來看parentView沒有任何更改浙巫。所以很有可能是parentView的bounds修改引起了childView的位置更改金蜀。這是為什么呢?這里先不說明為什么的畴,再看一下最常用的UIScrollView:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.scrollView = [[ZGUIScrolLView alloc] initWithFrame:self.view.frame];
    self.scrollView.delegate = self;
    [self.view addSubview:_scrollView];
    NSLog(@"scrollview frame:%@",NSStringFromCGRect(_scrollView.frame));
    NSLog(@"scrollview bounds:%@",NSStringFromCGRect(_scrollView.bounds));
    NSLog(@"scrollview center:%@",NSStringFromCGPoint(_scrollView.center));
    self.scrollView.contentSize = CGSizeMake(800, 800);
    self.parentView = [[ParentView alloc] initWithFrame:CGRectMake(20, 100, 250, 300)];
    self.parentView.backgroundColor = [UIColor redColor];
    [self.scrollView addSubview:_parentView];
    NSLog(@"parentView frame:%@",NSStringFromCGRect(_parentView.frame));
    NSLog(@"parentView bounds:%@",NSStringFromCGRect(_parentView.bounds));
    NSLog(@"parentView center:%@",NSStringFromCGPoint(_parentView.center));
    
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSLog(@"didScroll scrollview frame:%@",NSStringFromCGRect(_scrollView.frame));
    NSLog(@"didScroll scrollview bounds:%@",NSStringFromCGRect(_scrollView.bounds));
    NSLog(@"didScroll scrollview center:%@",NSStringFromCGPoint(_scrollView.center));
    NSLog(@"didScroll parentView frame:%@",NSStringFromCGRect(_parentView.frame));
    NSLog(@"didScroll parentView bounds:%@",NSStringFromCGRect(_parentView.bounds));
    NSLog(@"didScroll parentView center:%@",NSStringFromCGPoint(_parentView.center));
    printf("\n-------------------------------------------\n");
}

當(dāng)滾動(dòng)視圖的時(shí)候廉油,console輸出結(jié)果如下:

scrollview frame:{{0, 0}, {320, 568}}
scrollview bounds:{{0, 0}, {320, 568}}
scrollview center:{160, 284}
parentView frame:{{20, 100}, {250, 300}}
parentView bounds:{{0, 0}, {250, 300}}
parentView center:{145, 250}
didScroll scrollview frame:{{0, 0}, {320, 568}}
didScroll scrollview bounds:{{0, -20}, {320, 568}}
didScroll scrollview center:{160, 284}
didScroll parentView frame:{{20, 100}, {250, 300}}
didScroll parentView bounds:{{0, 0}, {250, 300}}
didScroll parentView center:{145, 250}
-------------------------------------------
didScroll scrollview frame:{{0, 0}, {320, 568}}
didScroll scrollview bounds:{{8.5, 31.5}, {320, 568}}
didScroll scrollview center:{160, 284}
didScroll parentView frame:{{20, 100}, {250, 300}}
didScroll parentView bounds:{{0, 0}, {250, 300}}
didScroll parentView center:{145, 250}
-------------------------------------------
didScroll scrollview frame:{{0, 0}, {320, 568}}
didScroll scrollview bounds:{{25.5, 162}, {320, 568}}
didScroll scrollview center:{160, 284}
didScroll parentView frame:{{20, 100}, {250, 300}}
didScroll parentView bounds:{{0, 0}, {250, 300}}
didScroll parentView center:{145, 250}

根據(jù)輸出結(jié)果可以看到,parentView的center苗傅、frame抒线、bounds在滾動(dòng)過程中都沒有作出更改,但是我們看到的它的位置的確改變了渣慕。而對于scrollView來說嘶炭,其frame和center也沒有更改抱慌,但是bounds更改了。
這種現(xiàn)象和上面提到的(例子B)的現(xiàn)象一樣眨猎,都是對bounds進(jìn)行了修改抑进。然后子視圖從新進(jìn)行了布局。說道子視圖重新布局睡陪,讓我想到了一個(gè)方法:

- (void)layoutSubviews;

從字面意思看就是布局某個(gè)視圖的子視圖寺渗,那么會不會和這個(gè)方法有關(guān)呢?因此我在自定義的ZGUIScrollView里面實(shí)現(xiàn)了該方法:

- (void)layoutSubviews {
    NSLog(@"scrollview's layoutSubViews called");
    [super layoutSubviews];
}

再次滾動(dòng)界面兰迫,發(fā)現(xiàn)每次滾動(dòng)都會調(diào)用scrollview的layoutSubViews方法信殊。蘋果官方文檔介紹:

Lays out subviews.

The default implementation of this method does nothing on iOS 5.1 and earlier. Otherwise, the default implementation uses any constraints you have set to determine the size and position of any subviews.

Subclasses can override this method as needed to perform more precise layout of their subviews. You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want. You can use your implementation to set the frame rectangles of your subviews directly.

You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.

它的作用就是布局一個(gè)視圖上的子視圖。確定子視圖的大小和位置汁果。如果你想強(qiáng)制布局更新涡拘,你不能直接去調(diào)用這個(gè)方法,而是在下次更新圖形之前調(diào)用setNeedsLayout方法据德,如果你要立即更新視圖布局鳄乏,調(diào)用layoutIfNeeded方法。

由此可知棘利,UIScrollView的實(shí)現(xiàn)就是通過bounds來實(shí)現(xiàn)的橱野。contentOffset是bounds的origin。然后當(dāng)bounds修改之后善玫,會在layoutSubviews方法里面對子視圖進(jìn)行布局水援。對子類進(jìn)行更新
另外蝌焚,我們還可以用bounds實(shí)現(xiàn)如下效果:

bounds to set cell

圖上右側(cè)便是使用了bounds實(shí)現(xiàn)的效果。實(shí)現(xiàn)方式就是在自定義cell中重寫drawReact:

- (void)drawRect:(CGRect)rect {
     self.bounds = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.frame.size.width-20, self.frame.size.height - 5);
    [super drawRect:rect];
}

其實(shí)UITableView(它是UIScrollView)的實(shí)現(xiàn)也是類似誓斥,更改了bounds,來實(shí)現(xiàn)滾動(dòng)加載cell只洒。

總結(jié)

對bounds和frame的理解就是這些,其實(shí)系統(tǒng)用bounds的地方還是很多的劳坑。例如UIScrollView的實(shí)現(xiàn)就用到了毕谴。有疑問的話可以留言交流。

注:轉(zhuǎn)贊請標(biāo)明來源:張貴的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末距芬,一起剝皮案震驚了整個(gè)濱河市涝开,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌框仔,老刑警劉巖舀武,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異离斩,居然都是意外死亡银舱,警方通過查閱死者的電腦和手機(jī)瘪匿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寻馏,“玉大人棋弥,你說我怎么就攤上這事〕锨罚” “怎么了顽染?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長轰绵。 經(jīng)常有香客問我粉寞,道長,這世上最難降的妖魔是什么藏澳? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任仁锯,我火速辦了婚禮,結(jié)果婚禮上翔悠,老公的妹妹穿的比我還像新娘业崖。我一直安慰自己,他們只是感情好蓄愁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布双炕。 她就那樣靜靜地躺著撮抓,像睡著了一般丹拯。 火紅的嫁衣襯著肌膚如雪死相。 梳的紋絲不亂的頭發(fā)上算撮,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天倒彰,我揣著相機(jī)與錄音待讳,去河邊找鬼。 笑死酥馍,一個(gè)胖子當(dāng)著我的面吹牛旨袒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播必孤,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼幢哨,長吁一口氣:“原來是場噩夢啊……” “哼捞镰!你這毒婦竟也來了践樱?” 一聲冷哼從身側(cè)響起拷邢,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抛人,失蹤者是張志新(化名)和其女友劉穎妖枚,沒想到半個(gè)月后绝页,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體续誉,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饰躲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泊愧。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛮艰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情聪富,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布阵面,位于F島的核電站样刷,受9級特大地震影響仑扑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜置鼻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一镇饮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箕母,春花似錦盒让、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俊啼,卻和暖如春喂分,著一層夾襖步出監(jiān)牢的瞬間柒爸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叁执,地道東北人编曼。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓晕鹊,卻偏偏與公主長得像浅浮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子芥映,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容