barriers / 阅读 / 详情

如何将AutoLayout和ScrollView很好地融合在一起

2023-07-23 07:14:26
共1条回复
苏萦

在使用storyboard和xib时,我们经常要用到ScrollView,还有自动 布局AutoLayout,但是ScrollView和AutoLayout 结合使用,相对来说有点复杂。根据实践,我说一下我的理解,在故事板或xib中,ScrollView是根据其下面的一个View的大小来确定 ContentSize的大小。

看一下效果

1. 创建一个项目,拖拽一个ScrollView到故事板中,如下图

2. 选中ScrollView,添加约束。

3. 拖拽一个View到ScrollView上, 然后添加上下左右四周约束。

4.添加完之后, 可能会报一个错, 如下图, 这个暂时别去管。

5. 我们先确定一下, 我们是需要水平方向的滚动还是竖直方向的滚动,或者水平方向和竖直方向都需要滚动。

a.水平方向和竖直方向都需要滚动的话, 不用添加

b.水平方向滚动需要添加下面一个约束

c.竖直方向需要添加下面一个约束

6.我们以水平方向滚动为例, 我们需要确定我们想要的宽度, 添加一个固定的宽度的约束。

7.选中View, 更新一下Frame

8.如果是想要动态设置ScrollView的宽度,也就是设置View的宽度约束的值, 我们将其拉成属性, 然后修改其值。

9. 如果是确定的宽度, 可以在- (void)updateViewConstraints这个方法中修改,也可以在别处修改。

10.现在运行,就可以水平滚动了。 竖直方向的滚动和水平方向滚动的设置差不多。 我们来添加两个View, 先拖拽一个View(我设为灰色)到视图上, 然后添加约束, 如下图

11.再拖拽一个View, 背景颜色设为红色,设置好之后, 将frame设置到我们需要的, 我这边将X设置到600。

12.我们给第二个View添加约束,如下图

13.我们还需要设置一个约束, 就是第二个View距离SuperView的距离,就是第二个View的Leading约束

14.然后将这个约束Leading拉成属性,在- (void)updateViewConstraints设置他的值

如下图

这样子就OK了。

相关推荐

什么是 SuperView

意思是超赢指的:大智慧推出的超赢股票分析系统
2023-07-23 00:42:052

iOS判断View是否正显示在当前屏幕上

BOOL值 isShow直接标记,添加到superView时,isShow = YES,从superView移除时,isShow = NO。 某些情况下,需判断当前ViewController是否正在显示,比如后台网络请求报错,我们可能只希望在发起请求的页面弹窗提示用户,当用户已经跳转到其他界面,不做弹窗,减少对用户的干扰。 假如一个UIView对象当前正在显示,那么它的window属性肯定为非空值。虽然官方文档未说明UIView未显示时window属性的取值, 但是经过简单的测试,大部分情况下UIView未显示时,window的值为空,因此依据此判断当前UIViewController是否正在显示。 其原理是将两个view的坐标convert 到相对于同一个view的坐标,再对比
2023-07-23 00:42:131

SuperView超赢数据是个什么样的数据?

具体看查股网的说明http://chaguwang.cn/superview.html
2023-07-23 00:42:214

什么是GoPro HERO3+ Black Edition的 SuperView

SuperView是GoProHERO3+BlackEdition中引入的中一个全新功能,通过这一功能,您可以捕获逼真的广角远景。这一模式采用4:3宽高
2023-07-23 00:42:321

1080p和1080p SuperView区别

高清和超清
2023-07-23 00:42:482

新人请教,gopro hero4银广角怎么设置

首先,手机app连接上gopro,选择进入设置页面,Video Settings(摄像模式)设置:Resolution选择SuperView就是广角模式,关闭就是飞广角模式;Photo Settings(拍照模式)设置:Megapixels里,凡是Wide的都是广角模式,不带Wide的就是非广角模式;可根据自己的拍摄需求进行调整设置。
2023-07-23 00:42:571

赢富数据和超赢数据有什么不同?

都一样。说实话。没什么不同,卖产品的换个说法而已。
2023-07-23 00:43:265

大智慧超赢SuperView数据和指南针全赢TotalView数据哪个准确?

感觉当年的赢富数据挺不错的,所以现在的全赢TotalView数据应该也不会错吧!
2023-07-23 00:43:553

请问如何阻止一个手势事件向父类传递?

假设这里有两个视图,superview为父视图,subview为子视图,根据视图touch事件的传递机制,当subview设置了userInteractionEnabled=NO时,hitTest:withEvent:方法会忽略subview,相当于返回nil,也就是说对superview的所有子视图,hitTest:withEvent:方法返回为空,所以对于superview,hitTest:withEvent:方法将返回self(superview),hit-view此时为superview,然后响应手势对应的方法,基于以上分析,要想阻止这个传递,只需要自定义subview对应的UIView类,重载hitTest:withEvent:方法,返回self即可- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ return self;}
2023-07-23 00:44:051

目前我国空间分辨率最高的遥感卫星是哪颗卫星?

SuperView-1(高景一号)是我国首个商业化运营的0.5米级高分辨率遥感卫星星座,全色分辨率0.5 米,多光谱分辨率2 米,轨道高度530 公里,幅宽12 公里,过境时间为上午10:30。由于SuperView-1 卫星具有很高的敏捷性,可设定拍摄连续条带、多条带拼接、按目标拍摄多种采集模式,此外还可以进行立体采集。SuperView-1 单次最大可拍摄60 km×70 km 影像。
2023-07-23 00:44:122

有免费查询superview超赢数据及dde大单数据深度分析(盘中实时更新)的股票数据网站吗?

www.chaguwang.cn 你百度搜索 查股网
2023-07-23 00:44:284

讲解iOS开发中拖动视图的实现

   预备知识   iOS处理屏幕上的触摸动作,主要涉及到以下几个方法:    复制代码 代码如下:   touchesBegan:withEvent: //触摸屏幕的最开始被调用   touchesMoved:withEvent: //移动过程中被调用   touchesEnded:withEvent: //动作结束时被调用   touchesCancelled:WithEvent:   从方法的命名可以清晰的看出该方法何时被调用,最后一个比较特殊。touchesCancelled:WithEvent:在Cocoa Touch必须响应持续触摸事件的系统中断时调用。   我们只要重写这些方法,来作我们想要作的`事情就可以了。    如何实现拖动视图?   1.设置userInteractionEnabled属性为YES,允许用户交互。   2.在触摸动作开始时记录起始点。   3.在移动过程中,计算当前位置坐标与起始点的差值,即偏移量,并且移动视图中心点至偏移量大小的地方。   4.分别限制x坐标、与y坐标,保证用户不可将视图托出屏幕   备注:分别限制x坐标与y坐标的原因是,即使向右拖动不了了,仍需保证可以向下拖动。   其实,功能比较简单,就是iOS手势动画中的拖动。来看一下基本的写法:    1.注册拖动动画   复制代码 代码如下:   UIPanGestureRecognizer * panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self   action:@selector(doHandlePanAction:)];   [self.vLight addGestureRecognizer:panGestureRecognizer];   注:vLight就是要加入拖动的View子类。    2.拖动处理函数   复制代码 代码如下:   - (void) doHandlePanAction:(UIPanGestureRecognizer *)paramSender{   CGPoint point = [paramSender translationInView:self.view];   NSLog(@"X:%f;Y:%f",point.x,point.y);   paramSender.view.center = CGPointMake(paramSender.view.center.x + point.x, paramSender.view.center.y + point.y);   [paramSender setTranslation:CGPointMake(0, 0) inView:self.view];   }   实现代码   以子类化UIImageView为例   复制代码 代码如下:   #import   @interface GragView : UIImageView   {   CGPoint startPoint;   }   @end   #import "GragView.h"   @implementation GragView   - (id)initWithFrame:(CGRect)frame   {   self = [super initWithFrame:frame];   if (self) {   // Initialization code   //允许用户交互   self.userInteractionEnabled = YES;   }   return self;   }   - (id)initWithImage:(UIImage *)image   {   self = [super initWithImage:image];   if (self) {   //允许用户交互   self.userInteractionEnabled = YES;   }   return self;   }   - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event   {   //保存触摸起始点位置   CGPoint point = [[touches anyObject] locationInView:self];   startPoint = point;   //该view置于最前   [[self superview] bringSubviewToFront:self];   }   -(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event   {   //计算位移=当前位置-起始位置   CGPoint point = [[touches anyObject] locationInView:self];   float dx = point.x - startPoint.x;   float dy = point.y - startPoint.y;   //计算移动后的view中心点   CGPoint newcenter = CGPointMake(self.center.x + dx, self.center.y + dy);   /* 限制用户不可将视图托出屏幕 */   float halfx = CGRectGetMidX(self.bounds);   //x坐标左边界   newcenter.x = MAX(halfx, newcenter.x);   //x坐标右边界   newcenter.x = MIN(self.superview.bounds.size.width - halfx, newcenter.x);   //y坐标同理   float halfy = CGRectGetMidY(self.bounds);   newcenter.y = MAX(halfy, newcenter.y);   newcenter.y = MIN(self.superview.bounds.size.height - halfy, newcenter.y);   //移动view   self.center = newcenter;   }   /*   // Only override drawRect: if you perform custom drawing.   // An empty implementation adversely affects performance during animation.   - (void)drawRect:(CGRect)rect   {   // Drawing code   }   */   @end
2023-07-23 00:44:361

大智慧中在哪里查询superview大资金流向?

收费版的才能查,免费版的查不了那个数据,不过很多网站可以查,只是数据滞后一天。搜索SUPERVIEW查询即可。
2023-07-23 00:44:431

日本JRPASS适用范围日本JRPASS卡适用范围

日本JRPASS卡是一种非常常用的交通卡,几乎可以在全日本使用。不过有两种卡,一种是全国用的,一种是地区用的。所以日本出现的交通卡的选择很重要。下面详细分析一下相关的使用范围。日本JRPASS使用范围日本JRPASS种类和区域日本铁路通票的适用范围路线-日本铁路通票可用于下表所列的铁路、公共汽车和轮渡。铁路:JR集团全线和新干线(除“小望”和“瑞穗”外(均含非预约座位))、特快列车、特快列车、普通列车和BRT(部分列车不能使用)。)你也可以乘坐东京单轨铁路。青森铁路【青森-八公】(但是,乘坐普通列车和特快列车时,只能经过八公-青森、青森-野北、八公-野北之间的车站。除了青森、信北、哈湖,在该路段的青森铁路其他车站下车时,不属于使用范围。)IR石川铁路(金泽和海啸之间)(但是,经过这两个车站时只能使用普通列车和特快列车。除金泽和海啸外,本区段内和本区段外的IR石川铁路其他车站不属于使用范围。)爱诺卡兹富山铁路(富山和高冈之间)[但是,它只限于普通列车,当通过这两个车站时可以使用。除了富山和高冈,在该区段内外的爱峰富山铁路(日语罗马字为爱野泽富山铁路)其他车站下车不在使用范围内。〕公交:JR公交公司所有地方线路(部分地方线路除外)。可用的路线有时会改变。)(JR巴士公司=JR北海道巴士、JR东北巴士、JR关东巴士、JR东海巴士、西日本JR巴士、中国JR巴士、JR四国巴士、JR九州巴士)通票不包括JR公交公司的高速公交线路。轮渡:JR西日本宫岛轮渡(宫岛-宫岛口)门票不含JR九州高速船博多釜山(韩国)的喷气翼船。日本铁路通票的车厢适用范围JR大部分列车有普通车厢(二等座),很多长途列车有绿色车厢(一等座)。绿色汽车通行证可以在绿色汽车和普通汽车上使用,而普通汽车通行证只能在普通汽车上使用,每种都可以使用,无需支付额外费用。请阅读下面的列表。标有的车厢可以使用日本铁路通票。当使用标记的汽车时,将支付额外的费用。1.日本铁路通票不包括新干线“小望”和“瑞穗”的不定期座位和预订座位。2.山阳新干线(新大阪-博多)、“光”和“儿玉”的大部分列车以及九州新干线“樱花”和“筑波”的部分列车没有连接绿色车厢。3.使用“DX绿色汽车”(JR九州的设备)时,需要额外支付“DX绿色汽车”适用的特殊使用费和绿色汽车使用费。4.在使用“一等座”时,由于通票只包含了绿色车厢和普通车厢车票,即只有车票有效,所以你必须支付额外的快车费和一等座车费。山新干线光的部分车厢配有普通单间。Superview舞女(SuperviewOdoriko)等特殊快车都有绿色单间。当使用“家庭班轮”和其他“班轮”,有一个额外的费用。JRPASS分为全国版和区域版地区版:JR北海道,JR东日本,JR东日本,JR西日本,JR四国,JR九州。北海道和四国:使用范围相同,天数不同。九州:范围分为北九州、北九州、全九州,天数只有3天和5天。日本:如果要延伸到新_长野,那就是新_长野关,如果要延伸到东北,那就是东北/南北海道关,尤其是北陆拱门关。日本:种类最多,每张通行证也可以带购使用。东海:是最繁琐的,因为JR东海的关隘有限制路线,所以你要先了解每个关隘的路线,再安排行程。JRPASS全国版从北到南贯穿JR北海道、东日本、东海、西日本、四国、九州等6条JR系统铁路。人群:整个行程跨越了至少两个不同的区域。我计划在日本呆7-21天。行程横跨关东、关西或北海道等多个景点,可节省30%左右的车费。B.计划从东京前往名古屋首都圈和静冈的人只能购买JRPASS国旅通票,因为这些地区没有通票。JR通行证地区版在日本单一地区玩,时间更灵活,价格略低。JR东日本和北海道南通行证地区:东日本,北海道南部;人群:我想玩关东,去北海道南部看看。整个游览周期在7天左右。JR通行证关西铁路旅行通行证地区:整个关西;人群:想逛关西,想连续几天逛几个不同的城市。A.计划在关西主要城市大阪、京都、奈良游玩1~2天,拿回车费;b、计划5天内去西京坂本奈周边玩个小旅行,买4天的代金券,会省不少钱。关西旅游通行证地区:关西(多和海浜、城崎温泉、仓敷、冈山、四国高松地区)人群:深度游览京都、奈良、大阪等大片区域,行程5天以上。JR通行证北海道铁路旅行通行证地区:整个北海道;人群:想在北海道玩3到10天的人。范围:北海道岛内所有JR铁路和部分JR巴士。3天可以存800多元。:注意事项1.各地区的JR公交都可以免费乘坐。2.一些私人铁路和JR线是互联互通的,只需要付很少的车费。CP值很高,关键是便宜。
2023-07-23 00:44:511

中信证券软件下载-中信建投软件下载-中信股票软件下载

建议你在选择一款软件时先到“股。大。亨。网”看下用过人的评价再进行购买空卖空
2023-07-23 00:45:043

在“优势财经网”上查到的大智慧superview超赢数据可信吗

你可以找多个网站的superview对比下,比如说智慧宝superview,看看数据是不是一样咯
2023-07-23 00:45:242

3D激光轮廓仪?

戒酒应该去什
2023-07-23 00:45:344

如何建立config schematic cellview

在自定义UITableViewCell中创建了一个按钮。想在点击该按钮时知道该按钮所在的cell在TableView中的行数。就是cell的 indexPath.row两种方法都很好。-(IBAction):(id)sender{NSLog(@"MyRow:%d",[self.table indexPathForCell:((TableViewCell*)[[sender superview]superview])].row); //这个方便一点点,不用设置tag。NSLog(@"MyRow:%d",((TableViewCell*)[[sender superview]superview]).tag);//这个需要加载cell时设置tag.不过也很方便。}-(UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath{//删除cell.contentView中所有内容,避免以下建立新的重复int i = [[cell.contentView subviews] count] - 1;for(;i >= 0 ; i--){[[[cell.contentView subviews] objectAtIndex:i] removeFromSuperview];}//添加buttonUIButton *but = [UIButton buttonWithType:UIButtonTypeCustom];[but setBackgroundImage:[UIImage imageNamed:@"delete.png"] forState:UIControlStateNormal];[but setFrame:CGRectMake(280, 10, 30, 30)];[but setAlpha:0.8];[but addTarget:self action:@selector(del:) forControlEvents:UIControlEventTouchUpInside];[cell.contentView addSubview:but];//设置Tag为cell 对应的indexPath rowfor(id view in subviews){if([view isKindOfClass:[UIButton class]]){[view setTag:[indexPath row]];//[cell.contentView bringSubviewToFront:view];}}}//Button事件-(void)del:(id)sender{for(UITableViewCell *cell in visiblecells){if(cell.tag == button.tag){//button.tag就是对应的[indexPath.row}
2023-07-23 00:45:491

uimodalpresentationpagesheet怎么实现

一、代码:- (void)viewDidLoad{ CGRect newFrame = CGRectMake(0, 0, POP_WINDOW_WIDTH, POP_WINDOW_HEIGHT); [self.view setFrame:newFrame]; //Now the bounds have changed so we save them to be used later on self.realBounds = self.view.bounds; [super viewDidLoad]; //视图周围一圈加阴影 UIImage *image = [[UIImage imageNamed:@"popup_view_shadow_bg"] stretchableImageWithLeftCapWidth:15 topCapHeight:15]; self.shadowView = [[UIImageView alloc] initWithFrame:CGRectMake(-7, -7, self.view.bounds.size.width + 14, self.view.bounds.size.height + 14)] ; self.shadowView.image = image; [self.navigationController.view.superview addSubview:self.shadowView];}-(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated];//可以对view的边界做些定制,去除圆角等 self.navigationController.view.superview.layer.cornerRadius = 0; self.navigationController.view.layer.cornerRadius = 0; self.navigationController.view.superview.layer.borderColor = [UIColor darkGrayColor].CGColor; self.navigationController.view.superview.layer.borderWidth = 1;//设置bounds self.navigationController.view.superview.bounds = self.realBounds;}二、UIModalPresentationPageSheet:1)宽度:竖屏时的宽度(768) 2)高度:当前屏幕的高度(填充整个高度)  
2023-07-23 00:45:572

android removeView用法

见过无耻的啊,没见过楼上这么无耻的~回答直接复制我回答别人的一个字不落啊!!!http://zhidao.baidu.com/question/255392766.html你好意思么?
2023-07-23 00:46:073

各种液晶技术到底是什么回事,TN、TFT、IPS、VA、LED、LCD、OLED、STN、CGS、TFD都看晕了,求详解。

ips的好
2023-07-23 00:46:184

iOS navigationbar的高度可以修改吗

不行!IOS是一个封闭的非开元系统!
2023-07-23 00:46:351

大智慧机构版可以看见散户线 主力持仓 和超赢资金流 请问它们保存在哪个文件夹里面

在大智慧的userdata文件夹里面!
2023-07-23 00:46:565

uiviewautoresizingflexibleheight啥意思

在 UIView 中有一个autoresizingMask的属性,它对应的是一个枚举的值(如下),属性的意思就是自动调整子控件与父控件中间的位置,宽高。 enum { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutoresizingFlexibleWidth = 1 << 1, UIViewAutoresizingFlexibleRightMargin = 1 << 2, UIViewAutoresizingFlexibleTopMargin = 1 << 3, UIViewAutoresizingFlexibleHeight = 1 << 4, UIViewAutoresizingFlexibleBottomMargin = 1 << 5 }; UIViewAutoresizingNone就是不自动调整。 UIViewAutoresizingFlexibleLeftMargin 自动调整与superView左边的距离,保证与superView右边的距离不变。 UIViewAutoresizingFlexibleRightMargin 自动调整与superView的右边距离,保证与superView左边的距离不变。 UIViewAutoresizingFlexibleTopMargin 自动调整与superView顶部的距离,保证与superView底部的距离不变。 UIViewAutoresizingFlexibleBottomMargin 自动调整与superView底部的距离,也就是说,与superView顶部的距离不变。 UIViewAutoresizingFlexibleWidth 自动调整自己的宽度,保证与superView左边和右边的距离不变。 UIViewAutoresizingFlexibleHeight 自动调整自己的高度,保证与superView顶部和底部的距离不变。 UIViewAutoresizingFlexibleLeftMargin |UIViewAutoresizingFlexibleRightMargin 自动调整与superView左边的距离,保证与左边的距离和右边的距离和原来距左边和右边的距离的比例不变。比如原来距离为20,30,调整后的距离应为68,102,即68/20=102/30。
2023-07-23 00:47:111

ios 8.1为什么removefromsuperview方法不生效

removeFromSuperviewUnlinks the receiver from its superview and its window, and removes it from the responder chain.译:把当前view从它的父view和窗口中移除,同时也把它从响应事件操作的响应者链中移除。分析:这里有两个关键点,可以帮助我们理解在ios当中view是怎么来组织的:a。视图的组织形式;b。响应者链;今天只分析一下视图的组织形式,关于响应者链是和事件处理息息相关的,另文再写。在ios当中,视图的设计模式可以看做是组件模式,即以树作为存储的数据结构,这种数据结构具有明确的两个特点:父子关系分明,从根节点出发,通过叶节点向下扩展,同一枝的上一个节点就是下一个节点的superview,下一个节点就是上一个节点的subview;不同枝如果同层,则为兄弟节点。2.layer关系分明,layer在ios中对事件响应具有举足轻重的作用,通常两个重叠的控件,处在上层的会优先响应;从上面文档的描述,我们可以看到,这两个特性,也是view在操作时候的核心,即一个view的操作关系到两个方面,视图结构和响应者链。removeFromSuperview,类似一个剪枝,执行此函数,就等于在树形结构中找到该节点,剪去该节点及其子节点,而并非只是剪去该节点自己。同时,另一个操作就是把该对象从响应者链中移除。- (void)removeFromSuperviewDiscussionIf the receiver"s superview is not nil, the superview releases the receiver. If you plan to reuse a view, be sure to retain it before calling this method and release it again later as appropriate.译:如果当前view对象的父视图不为空,则父视图会release一次当前视图对象。如果你还想重用当前view,你应该在调用removeFromSuperview之前,retain一次当前view对象,但不要忘记,在恰当的时候要release它,以确保没有内存泄露。Never call this method from inside your view"s drawRect: method.永远不要在你的view的drawRect方法中调用removeFromSuperview;
2023-07-23 00:47:301

masonry 两个label怎么相对布局

masonry是label的它的高级部分,也就是说masonry是比labels高级的。这是第一点;第二点是label是对于masonry这个名词包含的job的名称化的代指。所以只是说label是masonry这个东西,它是个label of masonry,它就是个label。第三部分的解释是:如果masonry是某项工作的名称,那么它的label就是这个名称的title,也就是指称。我们可以通过label来汇集工作群的关键词,但是真正的关键词所包含的内容是这个关键词之包含,它并不包含它的label,但是label可以指关键词相关关联的所反指被,也就是相当于refer-ential作为名词时的referential而不是refer或者它只是一个reference,即使是再说它是一个reference的时候,一个衍生的时候,也是对于高级的工作概念masonry来说的label反向所指被非法衍生出来的东西叫做label——是它,masonry的非所属所指向问题所反渡的关挂。于是在工作的过程中可以不看label,但是一直看labels肯定有什么毛病,但是通过分析label和masonry的这个问案,可以解决关于lebel的进攻错误或者错误反挂的攻击,这样就形成了对大概念性能力产生的完成,但是过程是无法逃避的,而且关于分析能力正确,也可以达到实际的效果:人的进步就是机器时代的福音,而且通过学术工作分析问题的发生真正通过分析找到解决问题的觉悟是发生在当时的,当下的,现在的,即将的,某种延伸你自己作为的有效振动。这有助于你找到女朋友。在我们专业上,masonry只是一项工作的名称,而且它的内容即是它的定义依赖的活动词组成的形容,而且如果masonry是一个label的话,那么必然不是学术的某个人,而是这些人都是由label的,它们的lebal总称叫做job title或者worker names,但是你知道,一个masonry是人也是工作活动的执行工种,所以谁都不会把人和职责活动产生物体性完成当作不是这个工作的名称所误解的白痴化非的事实,准确地来说,如果符号不严格,那么严格地名称应该是masonary,简单讲。有时候修改也是靠品味。
2023-07-23 00:47:382

苹果审核新规:用LaunchScreen.storyboard设置启动页

背景:从2020年四月起提交至App Store的app, 必须使用Xcode的Storyboard搭建启动页 。在这条新规下,我们就不能使用原来的 Assets.xcassets u27a1ufe0f LaunchImage 来设置启动图了,必须换成 LaunchScreen.storyboard 来实现。 首先,要在项目中进行配置。 1、在General—> App Icons and Launch Images—>Launch Screen File中选择LaunchScreen 2、选中LaunchScreen.storyboard,勾选 Use as Launch Screen 的选项 3、在LaunchScreen.storyboard中添加一个UIImageView的控件 4、为新添加的UIImageView添加约束 5、设置约束 选中上下左右的约束(点击短横线),并将数值都设为0,最后点击Add按钮,如下图所示 6、修改约束 经过步骤5之后,效果如下: 从上图可以看出,默认的 Safe Area 会在iPhoneX系列的机型上,使启动图没有覆盖整个屏幕。 7、解决留白问题 在左窗口选中底部约束—>点击右侧的First item—>选择 Superview —>将 Constant 设置为 0 ,如下所示: 修改完成的效果如下: 同样的方式,修改顶部约束: 修改完后的效果: 8、查看不同机型的效果(这里以背景色代替了图片) 9、图片适配问题 不同机型,启动图的大小和宽高比不一样,如何解决呢? 由于系统类UIImageView,不能根据尺寸配置多张图片。那是否能将启动图改为自定义的类呢? 答案是: 在LaunchScreen.storyboard中不能使用自定义类 那么,如何解决启动图的适配问题呢? 场景1:启动图为全屏的图片 解决办法:选5.5寸的启动图(因为宽度最大),并将填充模式设为等比例填充,如下图所示 场景2:启动图的内容在底部 如凤凰新闻,启动图为底部的文字logo,其余的留白。此时该图片就不是全屏的。约束应该改为:宽度填充满,高度=宽度*固定比例,再设置一个底部的约束,如下图所示 10、如果遇到了真机不生效的问题 如果遇到跑到真机上效果不对的问题,记得先删除Xcode的缓存,再clean一下项目,最后卸载手机上的app,重新安装即可(本人就遇到了在iPhoneX上不生效的问题)
2023-07-23 00:47:451

iOS之事件的传递和响应机制-原理篇

注 意 : 如果父控件不能接受触摸事件,那么子控件就不可能接收到触摸事件 UIView不能接收触摸事件的三种情况: 注 意 :默认UIImageView不能接受触摸事件,因为不允许交互,即userInteractionEnabled = NO。所以如果希望UIImageView可以交互,需要设置UIImageView的userInteractionEnabled = YES。 1.点击一个UIView或产生一个触摸事件A,这个触摸事件A会被添加到由UIApplication管理的事件队列中(即,首先接收到事件的是UIApplication)。 2.UIApplication会从事件对列中取出最前面的事件(此处假设为触摸事件A),把事件A传递给应用程序的主窗口(keyWindow)。 3.窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件。(至此,第一步已完成) 如果想让某个view不能处理事件(或者说,事件传递到某个view那里就断了),那么可以通过刚才提到的三种方式。比如,设置其userInteractionEnabled = NO;那么传递下来的事件就会由该view的父控件处理。 例如,不想让蓝色的view接收事件,那么可以设置蓝色的view的userInteractionEnabled = NO;那么点击黄色的view或者蓝色的view所产生的事件,最终会由橙色的view处理,橙色的view就会成为最合适的view。 所以,不管视图能不能处理事件,只要点击了视图就都会产生事件,关键在于该事件最终是由谁来处理!也就是说,如果蓝色视图不能处理事件,点击蓝色视图产生的触摸事件不会由被点击的视图(蓝色视图)处理! 注意:如果设置父控件的透明度或者hidden,会直接影响到子控件的透明度和hidden。如果父控件的透明度为0或者hidden = YES,那么子控件也是不可见的! 应用如何找到最合适的控件来处理事件? 1.首先判断主窗口(keyWindow)自己是否能接受触摸事件 2.触摸点是否在自己身上 3.从后往前遍历子控件,重复前面的两个步骤(首先查找数组中最后一个元素) 4.如果没有符合条件的子控件,那么就认为自己最合适处理 详述:1.主窗口接收到应用程序传递过来的事件后,首先判断自己能否接手触摸事件。如果能,那么在判断触摸点在不在窗口自己身上    2.如果触摸点也在窗口身上,那么窗口会从后往前遍历自己的子控件(遍历自己的子控件只是为了寻找出来最合适的view)    3.遍历到每一个子控件后,又会重复上面的两个步骤(传递事件给子控件,1.判断子控件能否接受事件,2.点在不在子控件上)    4.如此循环遍历子控件,直到找到最合适的view,如果没有更合适的子控件,那么自己就成为最合适的view。 找到最合适的view后,就会调用该view的touches方法处理具体的事件。所以,只有找到最合适的view,把事件传递给最合适的view后,才会调用touches方法进行接下来的事件处理。找不到最合适的view,就不会调用touches方法进行事件处理。 注意:之所以会采取从后往前遍历子控件的方式寻找最合适的view只是为了做一些循环优化。因为相比较之下,后添加的view在上面,降低循环次数。 两个重要的方法: hitTest:withEvent: 方法 pointInside 方法 什么时候调用? 作用 注 意 :不管这个控件能不能处理事件,也不管触摸点在不在这个控件上,事件都会先传递给这个控件,随后再调用hitTest:withEvent:方法 拦截事件的处理 事件传递给谁,就会调用谁的hitTest:withEvent:方法。 注 意 :如果hitTest:withEvent:方法中返回nil,那么调用该方法的控件本身和其子控件都不是最合适的view,也就是在自己身上没有找到更合适的view。那么最合适的view就是该控件的父控件。 所以事件的传递顺序是这样的:   产生触摸事件->UIApplication事件队列->[UIWindow hitTest:withEvent:]->返回 更合适 的view->[子控件 hitTest:withEvent:]->返回 最合适 的view 事件传递给窗口或控件的后,就调用hitTest:withEvent:方法寻找更合适的view。所以是,先传递事件,再根据事件在自己身上找更合适的view。 不管子控件是不是最合适的view,系统默认都要先把事件传递给子控件,经过子控件调用子控件自己的hitTest:withEvent:方法验证后才知道有没有更合适的view。即便父控件是最合适的view了,子控件的hitTest:withEvent:方法还是会调用,不然怎么知道有没有更合适的!即,如果确定最终父控件是最合适的view,那么该父控件的子控件的hitTest:withEvent:方法也是会被调用的。 技巧: 想让谁成为最合适的view就重写谁自己的父控件的hitTest:withEvent:方法返回指定的子控件,或者重写自己的hitTest:withEvent:方法 return self。但是, 建议在父控件的hitTest:withEvent:中返回子控件作为最合适的view! 原因 在于在自己的hitTest:withEvent:方法中返回自己有时候会出现问题。因为会存在这么一种情况:当遍历子控件时,如果触摸点不在子控件A自己身上而是在子控件B身上,还要要求返回子控件A作为最合适的view,采用返回自己的方法可能会导致还没有来得及遍历A自己,就有可能已经遍历了点真正所在的view,也就是B。这就导致了返回的不是自己而是触摸点真正所在的view。所以还是建议在父控件的hitTest:withEvent:中返回子控件作为最合适的view! 例如: whiteView有redView和greenView两个子控件。redView先添加,greenView后添加。如果要求无论点击那里都要让redView作为最合适的view(把事件交给redView来处理)那么只能在whiteView的hitTest:withEvent:方法中return self.subViews[0];这种情况下在redView的hitTest:withEvent:方法中return self;是不好使的! 特殊情况: 谁都不能处理事件,窗口也不能处理。 只能有窗口处理事件。 return nil的含义: hitTest:withEvent:中return nil的意思是调用当前hitTest:withEvent:方法的view不是合适的view,子控件也不是合适的view。如果同级的兄弟控件也没有合适的view,那么最合适的view就是父控件。 寻找最合适的view底层剖析之hitTest:withEvent:方法底层做法 /************************************************ hitTest:withEvent:方法底层实现************************************************/ hit:withEvent:方法底层会调用pointInside:withEvent:方法判断点在不在方法调用者的坐标系上。 pointInside:withEvent:方法判断点在不在当前view上(方法调用者的坐标系上)如果返回YES,代表点在方法调用者的坐标系上;返回NO代表点不在方法调用者的坐标系上,那么方法调用者也就不能处理事件。 屏幕上现在有一个viewA,viewA有一个subView叫做viewB,要求触摸viewB时,viewB会响应事件,而触摸viewA本身,不会响应该事件。如何实现? 1>用户点击屏幕后产生的一个触摸事件,经过一系列的传递过程后,会找到最合适的视图控件来处理这个事件2>找到最合适的视图控件后,就会调用控件的touches方法来作具体的事件处理touchesBegan…touchesMoved…touchedEnded…3>这些touches方法的默认做法是将事件顺着响应者链条向上传递(也就是touch方法默认不处理事件,只传递事件),将事件交给上一个响应者进行处理 响应者链条: 在iOS程序中无论是最后面的UIWindow还是最前面的某个按钮,它们的摆放是有前后关系的,一个控件可以放到另一个控件上面或下面,那么用户点击某个控件时是触发上面的控件还是下面的控件呢,这种先后关系构成一个链条就叫“响应者链”。也可以说,响应者链是由多个响应者对象连接起来的链条。在iOS中响应者链的关系可以用下图表示: 响应者对象: 能处理事件的对象,也就是继承自UIResponder的对象 作用: 能很清楚的看见每个响应者之间的联系,并且可以让一个事件多个对象处理。 如何判断上一个响应者 响应者链的事件传递过程: 事件处理的整个流程总结:   1.触摸屏幕产生触摸事件后,触摸事件会被添加到由UIApplication管理的事件队列中(即,首先接收到事件的是UIApplication)。   2.UIApplication会从事件队列中取出最前面的事件,把事件传递给应用程序的主窗口(keyWindow)。   3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件。(至此,第一步已完成)   4.最合适的view会调用自己的touches方法处理事件   5.touches默认做法是把事件顺着响应者链条向上抛。 touches的默认做法: 事件的传递与响应: 1、当一个事件发生后,事件会从父控件传给子控件,也就是说由UIApplication -> UIWindow -> UIView -> initial view,以上就是事件的传递,也就是寻找最合适的view的过程。 2、接下来是事件的响应。首先看initial view能否处理这个事件,如果不能则会将事件传递给其上级视图(inital view的superView);如果上级视图仍然无法处理则会继续往上传递;一直传递到视图控制器view controller,首先判断视图控制器的根视图view是否能处理此事件;如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传 递;(对于第二个图视图控制器本身还在另一个视图控制器中,则继续交给父视图控制器的根视图,如果根视图不能处理则交给父视图控制器处理);一直到 window,如果window还是不能处理此事件则继续交给application处理,如果最后application还是不能处理此事件则将其丢弃 3、在事件的响应中,如果某个控件实现了touches...方法,则这个事件将由该控件来接受,如果调用了[supertouches….];就会将事件顺着响应者链条往上传递,传递给上一个响应者;接着就会调用上一个响应者的touches….方法 如何做到一个事件多个对象处理: 因为系统默认做法是把事件上抛给父控件,所以可以通过重写自己的touches方法和父控件的touches方法来达到一个事件多个对象处理的目的。 事件的传递和响应的区别: 事件的传递是从上到下(父控件到子控件),事件的响应是从下到上(顺着响应者链条向上传递:子控件到父控件。
2023-07-23 00:47:521

精密机械厂的测量工具有哪些?是如何使用的?

数字化精密测量技术是数字化制造技术中的关键技术之一。开发亚微米、纳米级高精度测量仪器,提高环境适应能力,增强鲁棒性,使精密测量装备进入生产现场,集成到加工机床和制造系统,形成先进的数字化闭环制造系统,是当今精密测量技术的发展趋势。 美国FARO技术公司的FaroARM系列便携式三坐标测量臂在工业界首次实现测量臂与激光扫描头的完美结合,在同一坐标系下实现非接触式快速扫描和接触式测量。特点:非接触式灵活快速扫描,获取曲线曲面的点云数据,点云无分层;接触式测量,把握关键特征尺寸与轮廓的精度;非接触式与接触式测量在同一坐标系下完美结合,扫描没有任何分层;扫描头与测量臂及测量软件同为FARO公司产品,技术完全共享,服务更加方便。在实际应用中为客户大大缩短设计生产制造周期,降低成本,质量控制可以在内部完成,自动生成的报告适用于网络应用,从而改善了各生产职能部门之间及实际不同地点间的沟通;提高了准确性,做产品检验时用户通常通过5到10个点来定义曲面,使得用户可以检验由数以万计的点云定义的曲面质量;自动化的SPC可对多个样品进行自动化的统计过程控制。 美国CIMCORE公司推出了配备有先进激光扫描测量系统的关节臂测量机。材料采用碳纤维,INFINITE系列还具有无线通讯功能。用于反求工程时,不仅测量速度快,而且可实现测量过程的实时显示和补漏测量数据的无缝拼接。该仪器可用于三坐标测量、三维造型、产品测绘、反求工程、现场测量以及模具设计制造等涉及到设计、制造、过程检测、在线检测以及产品最终检测等测量工作。 瑞士TESA公司的Scan系列用2个线阵CCD组件,通过工件的回转和轴向移动对工件进行投影扫描,可实现对轴类零件位置误差和形状误差的精确检测、对截面形状和轮廓度的评估比较以及统计质量分析,还能对零件的局部(如过渡曲线、微小沟槽等)进行放大测量。对螺纹、蜗杆、丝杆等能够进行全参数精度的精确测量。 德国SCHNEIDER的WMM系列轴类及工具测量仪操作简单、测量速度高,特别适用于车间检查站。仪器采用高分辨力的 Matrix摄像头,可以快速获取测量数据。仪器数显分辨力为0.0001mm,长度测量不确定度为E2=(2.0+L/200)08m(L单位为mm)。 数控机床的精度和性能检测领域中,国外著名厂商Renishaw、API及HP等公司生产的激光干涉仪测量系统和球杆仪等在数控机床的几何精度和运动精度的检测和监控中,无论在机床制造厂还是机床使用厂,都得到了广泛的应用。Renishaw公司的激光干涉测量系统,配备了高精度、高灵敏度的温度、气压、湿度传感器及EC10环境补偿装置,在工作环境下测量精度得到进一步提高;API公司的Rmtea六维激光测量系统可同时测量6个数控机床精度项目的误差,缩短了检测时间,为生产现场数控机床的检测和诊断提供了更为快速高效的精密测量手段。成都工具研究所的MJS系列双频激光干涉仪,分辨力0.0108m,测量软件覆盖了我国和世界主要工业国的数控机床精度标准评定方法和指标,动态采样功能可用于自动补偿。 在非接触扫描测量,三坐标测量机方面LEITZ公司的精密三坐标测量机用于测量大型齿轮。瑞典HEXAGON集团所属DEA公司的PRIMA C1系列水平臂测量机配备有光学/激光式非接触扫描传感器,可适应不同测量环境和任务的要求。德国ZEISS公司的PROR Premium坐标测量机配备有EagleEye导航系统和可控测座可实施高速精密测量。 美国光动(Optodyne)公司近年推出的基于体对角线的激光矢量测量技术是快速测量和补偿数控机床、加工中心三维空间位置误差的一个新途径。该技术由美国光动公司发明并获得专利,它遵循了ASME B5.54。我国西安爱德华测量机公司自主开发的柔性关节臂测量机的样机。 德国帝目机械设备有限公司(teamtechnik)提供的测试系统解决方案。基于设备功能组成部分的模块化。独立于所测试的零件,功能元件被标准化为模块,并在应用过程中始终保持一致。设备以被测试的零件为中心,这样经过试用检验的技术就能够不断的积累和提高。 想了解更多请见:
2023-07-23 00:48:122

ios中drawrect和layoutsubviews的区别

  关于这两个方法的区别 还是有点意思的。    UIView的setNeedsDisplay和setNeedsLayout方法。首先两个方法都是异步执行的。setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。  综上两个方法都是异步执行的,layoutSubviews方便数据计算,drawRect方便视图重绘。    先大概看下ios layout机制相关的这几个方法:  - (CGSize)sizeThatFits:(CGSize)size  - (void)sizeToFit  ——————-  - (void)layoutSubviews  - (void)layoutIfNeeded  - (void)setNeedsLayout  ——————–  - (void)setNeedsDisplay  - (void)drawRect    一、  layoutSubviews在以下情况下会被调用:  1、init初始化不会触发layoutSubviews。  2、addSubview会触发layoutSubviews。  3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。  4、滚动一个UIScrollView会触发layoutSubviews。  5、旋转Screen会触发父UIView上的layoutSubviews事件。  6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。  7、直接调用setLayoutSubviews。  8、直接调用setNeedsLayout。  在苹果的官方文档中强调:You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.  layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。  反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。    刷新子对象布局  -layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写  -setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用  -layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)  如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局  在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]    二、  drawRect在以下情况下会被调用:  1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect 掉用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在 控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量 值).  2、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。  sizeToFit会自动调用sizeThatFits方法;  sizeToFit不应该在子类中被重写,应该重写sizeThatFits  sizeThatFits传入的参数是receiver当前的size,返回一个适合的size  sizeToFit可以被手动直接调用  sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己  3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。  4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。  -setNeedsDisplay方法:标记为需要重绘,异步调用drawRect  -setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘  以上1,2推荐;而3,4不提倡    drawRect方法使用注意点:  1、 若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate 的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或 者 setNeedsDisplayInRect,让系统自动调该方法。  2、若使用calayer绘图,只能在drawInContext: 中(类似鱼drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法  3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕    三、  layoutSubviews对subviews重新布局  layoutSubviews方法调用先于drawRect  setNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews  layoutIfNeeded方法如其名,UIKit会判断该receiver是否需要layout.根据Apple官方文档,layoutIfNeeded方法应该是这样的  layoutIfNeeded遍历的不是superview链,应该是subviews链  drawRect是对receiver的重绘,能获得context  setNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘,iphone device的刷新频率是60hz,也就是1/60秒后重绘
2023-07-23 00:49:041

OC中的UItableView代理什么时候执行,如何执行

就拿UITableView来说。将一个controller设置为它的代理。UITableView在绘制表的时候并不知道要绘制几个section和几个row。这个时候他就会向它的代理询问这些信息。这个时候在controller中的代理方法就会被执行。告诉UITableView去怎样的绘制。在绘制每个CELL的时候,UITableView也不知道应该怎样去绘制,这个时候它会去询问他的代理。代理方法再告诉它去绘制一个怎样的cell。也就是说代理方法是在View需要一些信息的时候在它的delegate中被执行的。这样主要是为了MVC的设计结构。就说tableView的dataSource代理中的,numberOfSectionsInTableView等代理函数,在转屏的时候肯定内部会调用,而在tableView的frame发生改变的时候,也对被调用。在Xcode中调试可以查看堆栈调用顺序:第一次初始化:#0 0x0000a0b2 in -[ViewController numberOfSectionsInTableView:] at*******/ViewController.m:95#1 0x319742d0 in -[UITableViewRowData(UITableViewRowDataPrivate) _updateNumSections] ()#2 0x3197421c in -[UITableViewRowData invalidateAllSections] ()#3 0x31988a48 in -[UITableView(_UITableViewPrivate) _updateRowData] ()#4 0x319888da in -[UITableView noteNumberOfRowsChanged] ()#5 0x319884f8 in -[UITableView reloadData] ()#6 0x3198671a in -[UITableView layoutSubviews] ()#7 0x3194280a in -[UIView(CALayerDelegate) layoutSublayersOfLayer:] ()#8 0x335a5d62 in -[CALayer layoutSublayers] ()#9 0x335a5900 in CA::Layer::layout_if_needed(CA::Transaction*) ()#10 0x335d47a6 in -[CALayer layoutIfNeeded] ()#11 0x319ec0d0 in -[UIViewController window:setupWithInterfaceOrientation:] ()#12 0x319eb2bc in -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:] ()#13 0x319ea48e in -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] ()#14 0x319ea418 in -[UIWindow _setRotatableViewOrientation:duration:force:] ()#15 0x31b20180 in __57-[UIWindow _updateToInterfaceOrientation:duration:force:]_block_invoke_0 ()#16 0x319a8680 in -[UIWindow _updateToInterfaceOrientation:duration:force:] ()#17 0x319a83c4 in -[UIWindow setAutorotates:forceUpdateInterfaceOrientation:] ()#18 0x319a7d32 in -[UIViewController _tryBecomeRootViewControllerInWindow:] ()#19 0x3199eeaa in -[UIWindow addRootViewControllerViewIfPossible] ()#20 0x3199aaec in -[UIWindow _setHidden:forced:] ()#21 0x319dc1d0 in -[UIWindow makeKeyAndVisible] ()#22 0x00009c36 in -[AppDelegate application:didFinishLaunchingWithOptions:] ()转屏调用堆栈:#0 0x0000a0b2 in -[ViewController numberOfSectionsInTableView:] at *****/ViewController.m:95#1 0x319742d0 in -[UITableViewRowData(UITableViewRowDataPrivate) _updateNumSections] ()#2 0x3197421c in -[UITableViewRowData invalidateAllSections] ()#3 0x319a9504 in -[UITableView setFrame:] ()#4 0x319a29d0 in -[UIView(Geometry) _applyAutoresizingMaskWithOldSuperviewSize:] ()#5 0x319a273a in -[UIView(Geometry) _resizeWithOldSuperviewSize:] ()#6 0x31b2bb2e in -[UIScrollView _resizeWithOldSuperviewSize:] ()#7 0x34b9baee in __NSArrayChunkIterate ()#8 0x34b94a78 in __NSArrayEnumerate ()#9 0x34af6b6a in -[NSArray enumerateObjectsWithOptions:usingBlock:] ()#10 0x3195b0aa in -[UIView(Geometry) resizeSubviewsWithOldSize:] ()#11 0x319a34ba in -[UIView(Geometry) setBounds:] ()#12 0x31acad94 in -[UIViewController window:willAnimateRotationToInterfaceOrientation:duration:] ()#13 0x319eb2bc in -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:] ()#14 0x319ea48e in -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] ()#15 0x319ea418 in -[UIWindow _setRotatableViewOrientation:duration:force:] ()#16 0x31b20180 in __57-[UIWindow _updateToInterfaceOrientation:duration:force:]_block_invoke_0 ()#17 0x319a8680 in -[UIWindow _updateToInterfaceOrientation:duration:force:] ()#18 0x319b1d2c in -[UIWindow _updateInterfaceOrientationFromDeviceOrientation:] ()重新设置frame等:#0 0x0000a0b2 in -[ViewController numberOfSectionsInTableView:] at ***/ViewController.m:95#1 0x319742d0 in -[UITableViewRowData(UITableViewRowDataPrivate) _updateNumSections] ()#2 0x3197421c in -[UITableViewRowData invalidateAllSections] ()#3 0x319a9504 in -[UITableView setFrame:] ()
2023-07-23 00:49:111

怎么看大盘板块的资金流量

告诉你最简单的,你用邮箱订阅和讯“财富速递”每天收盘的资金流向都有统计,而且是免费的…………
2023-07-23 00:49:194

怎么判断两个view 有没有重叠部分

UIView *superView1 = [[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 200.0f, 300.0f)] autorelease];superView1.backgroundColor = [UIColor blueColor];UIView *subView1 = [[[UIView alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 50.0f, 50.0f)] autorelease];subView1.backgroundColor = [UIColor greenColor];[superView1 addSubview:subView1];[self.view addSubview:superView1];UIView *superView2 = [[[UIView alloc] initWithFrame:CGRectMake(100.0f, 100.0f, 200.0f, 300.0f)] autorelease];superView2.backgroundColor = [UIColor yellowColor];UIView *subView2 = [[[UIView alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 50.0f, 50.0f)] autorelease];subView2.backgroundColor = [UIColor brownColor];[superView2 addSubview:subView2];[self.view addSubview:superView2];在这种情况下 CGRectIntersectsRect(subView1.frame, subView2.frame) 是有问题的, 是吧如果是这样的话, 可以试试CGRectIntersectsRect([superView1 convertRect:subView1.frame toView:self.view], [superView2 convertRect:subView2.frame toView:self.view])
2023-07-23 00:49:441

招商证券官方网站-招商证券手机版-招商证券软件下载

招商证券官方网站详细资料地址:http://135135.uul.cc招商证券软件下载详细资料地址:http://www.135135.uul.cc1.多市场行情和套利分析 采用全推送行情技术,沪深.港股.期货.外汇.全球市场.2.资讯分析系统 全球新闻财经.实时滚动资讯.权威研究报告.新闻关注排行.3.DDE深度数据挖掘决策系统 基于新行情,对已成交委托单的统计和分析功能.4.SuperView(超赢)数据分析系5.大智慧超赢股票池6.主力资金流向实时监控 盘中实时计算主力资金流向的板块和个股.7.新股能量潮 新股主力建仓能量图.8.创新分析功能 公式编辑器.自编译技术指标、自编译交易系统、自编译条件选股、定位分析、模式匹配分析、预测分析、交易系统评测和成功率测试、任意分析周期、盘中及时预警、时空隧道与模拟K线、分笔成交再现、历史分时图系统指示等等.招商证券牛网 招商证券全能版 招商证券总裁 招商证券下载 招商证券 王岩 招商证券香港 牛网 newone 招商证券 辞职 招商证券 余维佳
2023-07-23 00:49:531

大通证券官方网站大通证券软件下载大通证券神通版下载?

直接在百度搜索就KO
2023-07-23 00:50:083

华泰证券软件下载-华泰证券官网-华泰证券专业版2下载

下载的步骤是什么?
2023-07-23 00:50:174

信达证券软件下载-信达证券专业版-信达证券通达信

手机下载办法有:1.百度搜索信达证券,然后下载到手机即可2.用APP市场或者手机助手也可以下载电脑下载办法:1.登录信达证券官网下载2.百度搜索信达证券,然后可以通过百度助手下载
2023-07-23 00:50:262

swift - 将指定的视图推送到最前面

将button放在视图层级的最前面 superView.bringSubViewToFront(button)
2023-07-23 00:50:321

如何对使用了autolayout的UIView添加动画

 首先来看一眼storyboard中view的层级结构:如下图所示,从图中我们可以看到,整个view的布局相当简单,就两级:根view和我们的 date picker view,其中date picker view包含了一个完成按钮和系统的date picker。这样的话,要实现整个view和date picker view同时上移的效果,我们只需要对根view和date picker view同时做动画即可。
2023-07-23 00:50:402

泰阳证券同花顺-泰阳证券下载-泰阳证券官网

泰阳证券同花顺下载详细资料地址:http://135135.uul.cc泰阳证券官网下载详细资料地址:http://www.135135.uul.cc1.多市场行情和套利分析 采用全推送行情技术,沪深.港股.期货.外汇.全球市场.2.资讯分析系统 全球新闻财经.实时滚动资讯.权威研究报告.新闻关注排行.3.DDE深度数据挖掘决策系统 基于新行情,对已成交委托单的统计和分析功能.4.SuperView(超赢)数据分析系5.大智慧超赢股票池6.主力资金流向实时监控 盘中实时计算主力资金流向的板块和个股.7.新股能量潮 新股主力建仓能量图.8.创新分析功能 公式编辑器.自编译技术指标、自编译交易系统、自编译条件选股、定位分析、模式匹配分析、预测分析、交易系统评测和成功率测试、任意分析周期、盘中及时预警、时空隧道与模拟K线、分笔成交再现、历史分时图系统指示等等. 方正泰阳证券 泰阳证券官网 泰阳证券下载 泰阳证券同花顺 泰阳证券手机版 泰阳证券免费下载 湖南证券 泰阳证券完美版 方正泰阳证券下载 泰阳证券软件下载
2023-07-23 00:50:481

如何清空画在scrollview上的子视图

  ScrollView上的子View都removeFormSuperView  [self.homeRecommendScrollView subviews]没有removeFormSuperView方法啊,scrollview本身到是有的,祝你愉快,满意请采纳哦
2023-07-23 00:51:061

广发华福证券官方网站-广发华福证券大智慧-广发华福证券下载

挺好的 还是航海家的好 还便宜 你们的第一信号很贵的我们这些小股民没有那么多钱!
2023-07-23 00:51:132

100分求高手帮编信达通的选股公式

楼上都写了你选他们的吧
2023-07-23 00:51:216

uitableview头部多出来一块

这个是IOS7以后 UIScrollview自己添加的 系统会判断UIScrollerview是否是superview 的第一个子view 如果是 会有偏移量 uitableview继承自uiscrollerview 所有有这个问题 你可以建一个frame 0 0 0 0的空白view放在uitableview前面 这是个取巧的办法
2023-07-23 00:51:421

ios uiviewcontroller 位置移动会调用哪个方法

UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, viewWillAppear, viewDidAppear, viewWillLayoutSubviews,viewDidLayoutSubviews,viewWillDisappear, viewDidDisappear方法,按照调用顺序说明如下:调试日志:1234567892013-07-1412:15:49.048VCTest[13412:907]initWithNibName:bundle / initWithCoder#如果使用的StoryBoard2013-07-1412:15:49.056VCTest[13412:907]loadView2013-07-1412:15:49.059VCTest[13412:907]viewDidLoad2013-07-1412:15:49.061VCTest[13412:907]viewWillAppear2013-07-1412:15:49.078VCTest[13412:907]viewWillLayoutSubviews2013-07-1412:15:49.083VCTest[13412:907]viewDidLayoutSubviews2013-07-1412:15:49.445VCTest[13412:907]viewDidAppear2013-07-1412:16:00.624VCTest[13412:907]viewWillDisappear2013-07-1412:16:00.997VCTest[13412:907]viewDidDisappear1. initWithNibName:bundle:初始化UIViewController,执行关键数据初始化操作,注意这里不要做view相关操作,view在loadView方法中才初始化,这时loadView还未调用。如果使用StoryBoard进行视图管理,程序不会直接初始化一个UIViewController,StoryBoard会自动初始化或在segue被触发时自动初始化,因此方法initWithNibName:bundle:不会被调用。如果在代码里面使用instantiateViewControllerWithIdentifier:方法显示初始化一个UIViewController,则initWithCoder方法会被调用。如果是通过调用initWithNibName:bundle指定nib文件名初始化的话,ViewController会根据此nib来创建View。如果name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib:1)如果ViewController的类名以“Controller”结尾,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;2)找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib2. loadView当访问UIViewController的view属性时,view如果此时是nil,那么VC会自动调用loadView方法来初始化一个UIView并赋值给view属性。此方法用在初始化关键view,需要注意的是,在view初始化之前,不能先调用view的getter方法,否则将导致死循环(除非先调用了[supper loadView];)。123456789101112-(void)loadView{ NSLog(@"loadView"); //错误,将导致死循环,因此此时view=nil,VC会再次调用loadView来初始化view self.view.backgroundColor=[UIColorgreenColor];}-(void)loadView{ NSLog(@"loadView"); //正确,先初始化view self.view=[[MyViewalloc]init]; self.view.backgroundColor=[UIColorgreenColor];}如果没有重载loadView方法,则UIViewController会从nib或StoryBoard中查找默认的loadView,默认的loadView会返回一个空白的UIView对象。3. viewDidLoad当VC的view对象载入内存后调用,用于对view进行额外的初始化操作4. viewWillAppear在view即将添加到视图层级中(显示给用户)且任意显示动画切换之前调用(这个时候supperView还是nil)。这个方法中完成任何与视图显示相关的任务,例如改变视图方向、状态栏方向、视图显示样式等5. viewDidAppear在view被添加到视图层级中,显示动画切换之后调用(这时view已经添加到supperView中)。在这个方法中执行视图显示相关附件任务,如果重载了这个方法,必须在方法中调用[supper viewDidAppear];6. viewWillLayoutSubviewsview即将布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),要调整Subviews的位置,在调整之前要做的一些工作就可以在该方法中实现。7. viewDidLayoutSubviewsview已经布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),已经调整Subviews的位置,在调整完成之后要做的一些工作就可以在该方法中实现。8. viewWillDisappearview即将从superView中移除且移除动画切换之前,此时还没有调用removeFromSuperview。9. viewDidDisappearview从superView中移除,移除动画切换之后调用,此时已调用removeFromSuperview。10. viewWillUnload在VC的view对象从内存中释放之前调用,可以在view被释放前做一些资源清理操作。在iOS6.0开始就废弃了,该方法不再会调用11. viewDidUnload在VC的view对象从内存中释放之后调用,可以在view被释放后做一些view相关的引用清理操作,此时view为nil。在iOS6.0开始就废弃了,该方法不再会调用当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反 1、viewWillDisappear 视图将被从屏幕上移除之前执行 2、viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图了 3、dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
2023-07-23 00:51:491

swift如何让UI Image View全屏显示

不考虑图像缩放长宽比没保持一致的情况的话,直接在 xib 中对 UIImageView 加自动布局约束,约束上下左右对齐 superview 的上下左右。简单来说按着鼠标右键在 uiimageview 向上下左右拖动然后送开鼠标就看到操作提示了。或者在左边控件树上鼠标右键按着拖动 uiimageview 到根 view 上。
2023-07-23 00:51:561

ios里的enbed in里有两个选项是什么意思 scroll view stack view

scrollView:1. 介绍scrollView一些属性 1>.要想使用scrollView必须做两件事 1).设置scrollView内容 2).设置contentSize (滚动范围)2>.其他属性 1). contentOffset(滚动位置) 2). contentInset(额外增加的滚动区域) 3). bounces (设置UIScrollView是否需要弹簧效果) 4). crollEnabled (设置UIScrollView是否能滚动) 5). showsHorizontalScrollIndicator (是否显示水平滚动条) 6). showsVerticalScrollIndicator (是否显示垂直滚动条)2. 代理 1>代理思想两个思想 1).监听思想:B监听A发生了什么事情 2).通知思想:A发生了一些事情,要通知B去做 2>scrollView的代理使用 1).如何成为代理(三步) *声明协议 *设置代理对象self.scrollView.delegate = self; *实现协议方法 2).代理监听scrollView的拖拽事件// 开始拖拽 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView; // 结束拖拽 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate; // scrollView滚动时执行 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 3).用代理实现缩放*成为UIScrollView的代理() *设置缩放对象(通过viewForZoomingInScrollView方法) *设置缩放为范围(maximumZoomScale、minimumZoomScale)3. 定时器创建两种方式1>. self.timer = [NSTimer scheduledTimerWithTimeInterval:1.f target:self selector:@selector(方法) userInfo:nil repeats:YES]; 当另一个scrollView运行时,会停止定时器的scrollView,只能执行一个scrollView. 2>. self.timer = [NSTimer timerWithTimeInterval:1.f target:self selector:@selector(方法) userInfo:nil repeats:YES]; [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];4. 自定义协议并使用1>.定义协议(三步) *定义protocol(两种optional[代理对象可不实现]、required[代理对象必须实现]) *增加代理属性(weak) @property (weak, nonatomic) id<LFAppInfoViewDelegate> delegate; *给代理发消息,调用代理的方法(需要判断代理对象是否实现了该方法,不判断调用后(编译时不会)会报错) 注意:定义协议的名称命名[类名+Delegate]、协议方法的命名规范[方法名称需要去掉前缀,并且将自己作为参数]2>.使用代理(三步)*声明协议 *设置代理对象 *实现协议方法(本例是在代理对象[控制器] 添加一个UILabel)tableView:1. UITableView 需要设置数据源才能显示数据 1>.会向数据源查询一共多少组,每组多少行,每行显示什么数据 2>.数据源必须遵守UITableViewDateSource协议 3> 一共有多少组 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{} 第section组有多少行 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{} 每一行显示什么内容 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{} 第section组头部显示什么标题 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{} 第section组底部显示什么标题 - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{} 当每一行的cell的高度不一致的时候就使用代理方法设置cell的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{} 当每一行的cell高度一致的时候使用属性设置cell的高度 self.tableView.rowHeight = 60; 可以优化内存的可变数组定义 NSMutableArray *models = [NSMutableArray arrayWithCapacity : (NSUInteger)]2. cell常见属性 1>.cell.textLabel.text 标题 2>.cell.detailTextLabel.text 介绍 3>.cell.imageView.image 图片 4>.cell.accessoryView 辅助视图 5>.cell.accessoryView 自定义辅助视图 6>.cell.backgroundView 设置cell的背景颜色 1).通过backgroundColor 和 backgroundView都可以设置cell的背景 2).但是backgroundView 的优先级比 backgroundColor的高 3).所以如果同时设置了backgroundColor和backgroundView, backgroundView会盖住backgroundColor7>.cell.selectedBackgroundView 设置选中状态的背景3. UITableView常见属性 1>. tableview.separatorStyle 设置分割线样式 2>. tableview.separatorColor 设置分割线颜色 自定义颜色 [UIColor colorWithRed:色值/255.f green:色值/255.f blue:色值/255.f alpha:色值/255.f];获取屏幕宽度: [UIScreen mainScreen].bounds.size.width;3>. tableview.tableHeaderView 设置tableView的头部视图 一般用于放广告 4>. tableview.tableFooterView 设置tableView的底部视图 一般用于放置加载更多按钮 5>. [self.tableView reloadData]; 刷新表格 // 刷新指定行 NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:0]; [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationRight];4. 优化cell的方法 1>.先去缓存池中查找是否有满足条件的Cell UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];2>.如果缓存池中没有符合条件的cell,就自己创建一个Cell if (nil == cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier]; }3>.创建Cell, 并且设置一个唯一的标记 : identifier 注 : 定义变量 NSString *identifier 推荐用 static定义静态局部变量,不推荐用宏.4>.设置cell数据并返回cell5. tableView代理方法 1>. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{} //当某一行被选中的时候调用 2>. - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{} //当某一行取消选中的时候调用 3>. UIAlertView的一些属性和代理方法 1). UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"修改数据" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil]; //创建一个弹窗 2). alert.alertViewStyle = UIAlertViewStyle...; //设置alert的样式, 让alert显示出uitextfield3). UITextField *textField = [alert textFieldAtIndex:0]; //获取alert中的textfield4). [alert show]; //显示弹窗 5). - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{} // alertView的按钮被点击的时候就会调用6. 自定义cell两种方式 1>. 纯代码:每个cell子控件的个数和位置不一样 2>. 通过xib: cell一样且固定的界面 加载xib的方式:1). [[[NSBundle mainBundle] loadNibNamed:@"xib名" owner:nil options:nil] firstObject];2).UINib *nib = [UINib nibWithNibName:@"xib名" bundle:nil]; UIView *view = [[nib instantiateWithOwner:nil options:nil]firstObject]; 3>. 延迟调用 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ }); 4>.init方法只有通过代码创建控件的时候才会调用; awakeFromNib方法在控件通过xib或者storyboard创建的时候才会调用 5>. 协议规范 协议名称 : 控件名称 + Delegate 协议方法名称:控件名称去掉前缀 + 含义 在协议方法中将自己(触发发放的)控件传出去的目的是方便用于区分哪个控件触发了该方法 6>. 代码创建的子控件,添加到contentView中 [self.contentView addSubview:子控件];7>. 计算文字宽高 CGSize *maxSize = CGSizeMake(300, MAXFLOAT); // 设置文字范围 NSDictionary *dict = @{NSFontAttributeName : font}; // 字体 // 如果将来计算的文字的范围超出了指定的范围,返回的就是指定的范围 // 如果将来计算的文字的范围小于指定的范围, 返回的就是真实的范围 CGSize size = [NSString *str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size; // 计算文字宽高 8>.通过代码自定义cell的方法 1).新建一个继承自UITableViewCell的类 2).重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据和frame, 子控件要添加到contentView中) 进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体固定的图片)3).提供2个模型 数据模型: 存放文字数据图片数据 frame模型: 存放数据模型所有子控件的framecell的高度 4).cell拥有一个frame模型(不要直接拥有数据模型)5).重写frame模型属性的setter方法: 在这个方法中设置子控件的显示数据和frame6).frame模型数据的初始化已经采取懒加载的方式(每一个cell对应的frame模型数据只加载一次)7. 通知机制 1>. 通知中心(NSNotificationCenter) 每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信 创建通知中心 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];2>. 一个完整的通知一般包含3个属性: - (NSString *)name; // 通知的名称 - (id)object; // 通知发布者(是谁要发布通知) - (NSDictionary *)userInfo; // 一些额外的信息(通知发布者传递给通知接收者的信息内容)3>. 初始化一个通知(NSNotification)对象 + (instancetype)notificationWithName:(NSString *)aName object:(id)anObject; + (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo; - (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;4>. 通知中心(NSNotificationCenter)提供了相应的方法来发布通知 - (void)postNotification:(NSNotification *)notification; // 发布一个notification通知,可在notification对象中设置通知的名称、通知发布者、额外信息等 - (void)postNotificationName:(NSString *)aName object:(id)anObject; // 发布一个名称为aName的通知,anObject为这个通知的发布者 - (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo; // 发布一个名称为aName的通知,anObject为这个通知的发布者,aUserInfo为额外信息 5>.注册通知监听器(Observer) - (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject; observer:监听器,即谁要接收这个通知 aSelector:收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入 aName:通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知 anObject:通知发布者。如果为anObject和aName都为nil,监听器都收到所有的通知 6>. 取消注册通知监听器 通知中心不会保留(retain)监听器对象,在通知中心注册过的对象,必须在该对象释放前取消注册。否则,当相应的通知再次出现时,通知中心仍然会向该监听器发送消息。因为相应的监听器对象已经被释放了,所以可能会导致应用崩溃 - (void)removeObserver:(id)observer; - (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject; 一般在监听器销毁之前取消注册(如在监听器中加入下列代码): - (void)dealloc { //[super dealloc]; 非ARC中需要调用此句 [[NSNotificationCenter defaultCenter] removeObserver:self]; }7>. 通知和代理的选择 1).共同点 利用通知和代理都能完成对象之间的通信 2).不同点 代理 : 一对一关系(1个对象只能告诉另1个对象发生了什么事情)通知 : 多对多关系(1个对象能告诉N个对象发生了什么事情, 1个对象能得知N个对象发生了什么事情)8. 键盘通知 UIKeyboardWillShowNotification // 键盘即将显示 UIKeyboardDidShowNotification // 键盘显示完毕 UIKeyboardWillHideNotification // 键盘即将隐藏 UIKeyboardDidHideNotification // 键盘隐藏完毕 UIKeyboardWillChangeFrameNotification // 键盘的位置尺寸即将发生改变 UIKeyboardDidChangeFrameNotification // 键盘的位置尺寸改变完毕 附带跟键盘有关的额外信息(字典),字典常见的key如下: UIKeyboardFrameBeginUserInfoKey // 键盘刚开始的frame UIKeyboardFrameEndUserInfoKey // 键盘最终的frame(动画执行完毕后) UIKeyboardAnimationDurationUserInfoKey // 键盘动画的时间 UIKeyboardAnimationCurveUserInfoKey // 键盘动画的执行节奏(快慢) 9. 其他 1>. 子控件不显示排错方法 1).查看是否调用添加的方法 2).frame为空(没有设置frame)3).hidden 是否为yes4).alpha <=0.15).没有添加到父控件中 6).查看夫控件有没有以上几点 但凡在init方法中获取到的frame都是0 - (void)layoutSubviews { [super layoutSubviews]; // 该方法在控件的frame被改变的时候就会调用 // 该方法一般用于调整子控件的位置 } 2>. // 已经被添加到父视图上的时候会调用 - (void)didMoveToSuperview { } // 即将被添加到父视图上的时候会调用 - (void)willMoveToSuperview:(UIView *)newSuperview { }3> UITextField中添加左右视图 self.textField.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 0)]; // 设置左边视图的显示模式 self.textField.leftViewMode = UITextFieldViewModeAlways; self.textField.rightView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 0)]; // 设置右边视图的显示模式 self.textField.rightViewMode = UITextFieldViewModeAlways;4>. // 设置btn中的图片不填充整个imageview btn.imageView.contentMode = UIViewContentModeCenter; // 超出范围的图片不要剪切 // btn.imageView.clipsToBounds = NO; btn.imageView.layer.masksToBounds = NO;
2023-07-23 00:52:051

ios tableview 为什么滚动条滑不到最下面

问题解决了方法就是content size 设置为实际tableview的行数x行高,然后tableview设置高度为mainFrame的高度减去navigationBar的高度.即可
2023-07-23 00:52:123

UITapGestureRecognizer怎么获取父视图的tag

查看UIGestureRecognizer源码发现了问题,已经给我们做了封装。获取他的父视图不是通过superview,而是在UIGestureRecognizer中声明了一个属性view,通过这个属性就可以获取它的父视图。
2023-07-23 00:52:301

泰勒光学轮廓仪 sa表示什么

SRa 面粗糙度的意思
2023-07-23 00:52:482