zoukankan      html  css  js  c++  java
  • 杂——乱七八糟

    新建工程移除StroyBoard

    每次使用Single View Application模板创建工程之后,总是会有一个Main.storyboard文件,那么,当我们使用代码布局的时候,很显然是不需要它的。那么,如何完整移除它呢?

    1. 移除Main.storyboard文件

    2. 移除LaunchScreen.storyboard

    3. 在TARGETS中,将Main InInterface选项中的值清空

    4. AppDelegate.m 替换以下函数,并 #import "ViewController.h"

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
        ViewController *viewController = [[ViewController alloc] init];
        self.window.rootViewController = viewController;
    
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
    
        return YES;
    }
    View Code

    UIButton 实现左图右文,并固定图文位置

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn setImage:[UIImage imageNamed:@"good_red.png"] forState:UIControlStateNormal];
    [btn setTitle:@"11" forState:UIControlStateNormal];

    UIButton设置了Image和Title后,默认就是左图右文。

    但是当文字变长或变短的时候,UIButton会自动将图文居中,这就造成了图片移动的效果。

    假如要固定图片的位置,只需要如下设置即可

    [btn setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 20)];

    意思是图片相对于superView的上、左、下、右边距。

    同理,假如要固定文字的位置,则

    [btn setTitleEdgeInsets:UIEdgeInsetsMake(10, 0, 0, 0)];

    炫酷地实现UIButton左文右图

    button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
    [button setTitle:videoItem.jce_poster.jce_firstLine forState:UIControlStateNormal];
    [button setImage:LOAD_ICON_USE_POOL_USE_CACHE(@"arrow_go_new.png") forState:UIControlStateNormal];
    button.transform = CGAffineTransformMakeScale(-1.0, 1.0);
    button.titleLabel.transform = CGAffineTransformMakeScale(-1.0, 1.0);
    button.imageView.transform = CGAffineTransformMakeScale(-1.0, 1.0);

    UIButton文字左对齐

    button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;    //设置左对齐
    button.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);    //设置文字左间距

    setNeedsLayout layoutIfNeeded layoutSubviews

    关于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。

    -layoutSubviews方法:这个方法,默认没有做任何事情,You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want. 

    -setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用

    -layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

    如果要立即刷新,不要直接调用 layoutSubviews, 要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局

    在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]

    Do Not Call "layoutSubviews" 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.

    contentInset contentOffset

    假如一个TableView的frame是一个屏幕的大小

    UITableView *tv = [[UITableView alloc] initWithFrame:CGRectMake(0,0,screenWidth,screenHeight)];

    此时将tableView分解为2个部分,一个是容器,容器的大小为tableView的frame;一个是内容视图,内容视图可以在容器中滚动。

    容器的大小就是我们在任意时刻所能看到的内容的大小,而内容视图的大小要依据内容来确定。

    滚动tableView的时候,其实滚动的是内容视图。

    contentOffset是一个坐标,是容器的左上顶点和内容视图的左上顶点的实时的差,滚动时contentOffset是会变化的。(父减子)

    contentInset是一个坐标,是内容视图的左上顶点和容器的左上顶点的初始时的差,滚动时contentInset是不会变化的。即最开始时,内容视图开始的坐标(相对于容器)。(子减父)

    http://blog.sina.com.cn/s/blog_7b9d64af010190h7.html

    有时候设置 UITableView 的 contentInset 之后为什么 UITableView 没有自动滚动到相应位置?

    UITableView 有没有滚动到相应位置,其实是看 contentOffset 有没有设置正确

    如果是在 viewDidLoad 和 viewDidLayoutSubviews 中设置 UITableView 的 contentInset,则系统会自动设置 UITableView 的 contentOffset

    而其他地方手动调用的话,UITableView 虽然改变了 contentInset,但是 contentOffset 依然不会改变

    UITableViewCell里找到其所在的UITableView

    id view = [self superview];
    while (view && [view isKindOfClass:[UITableView class]] == NO)
    {
        view = [view superview];
    }

    UITableView小知识

    1.

    UITableView第一次出现的时候会计算整个TableView上所有cell的高度,即下面这个函数会被调用N次(N为TableView上所有cell的个数)

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

    但是UITableView第一次出现的时候并不会定制整个TableView上所有cell的样式,只会对可见的cell进行定制样式,即下面这个函数会被调用M次(M为TableView上第一次出现的时候可见cell的个数)

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

     

    2.浅谈UITableView的重用机制

    由于一个UITableView上可能有非常多的cell,对每个cell都分配内存在苹果公司看来是不可忍受的,所以苹果采用了重用机制。

    当cell滚出TableView的范围之后(注意TableView的范围并不等同于可见区域,因为TableView可能部分被其他控件遮挡),这个cell会进入一个可重用队列

    然而TableView上的cell种类千千万万,并不是所有的cell之间都可以互相重用,所以cell在进入队列的时候都带上了它的身份证——identifier参数,相同类型的cell共用一个identifier。

    那么当某个cell即将进入TableView的范围内的时候,系统会从可重用队列中根据identifier取可用的cell,被取到的cell就出队列。

     

    - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier;

    这个函数就是根据identifier从可重用队列中取相应的cell,可能返回nil。

     

    - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);

    iOS6及之后,可用该方法,该方法与上面的不同之处在于,返回的结果一定不是nil,即当从可重用队列中取不到的时候,会自动根据identifier创建一个新的cell并返回。当然使用该函数的时候记得先为tableView注册相应identifier的cell类型。

     

    UIImgeView 设置圆角

    imageView.layer.masksToBounds = YES;
    imageView.layer.cornerRadius = imageView.width*0.5;

    必须设置masksToBounds的值为YES哦,才能隐藏掉圆形区域只外的头像,如下图,左边为YES,右边为NO.

    Xcode checkout an existing project 提示 svn:E175013 :unable to connect to a repository at url

    打开Xcode xcode -> preferences ->accounts 删除左边栏的所有数据

    正则表达式去除字符串中的<red></red>

    [self.titleLabel.text stringByReplacingOccurrencesOfRegex:@"<red>(.*?)</red>" withString:@"$1"]

    终端里查找Git的安装目录

    which git

    将简单数据存在本地——NSUserDefaults

    //基本数据类型
    _page = [[NSUserDefaults standardUserDefaults] integerForKey:kMyCinemaPage];
    [[NSUserDefaults standardUserDefaults] setInteger:_page forKey:kMyCinemaPage];
    
    //普通数据类型
    [[NSUserDefaults standardUserDefaults] setObject:_cinimaObj.jce_version forKey:kMyCinemaVersion];
    NSString *version = (NSString *)[[NSUserDefaults standardUserDefaults] objectForKey:kMyCinemaVersion];

    拉伸图片

    当一个图片不适应它的superview的时候,有时候需要对图片进行拉伸处理,同时我们希望图片的某些部分不要被拉伸,比如以下这张图,我们希望拉宽该图片,但是左右两边的圆角不要被拉伸。

    此时可以使用UIImage的方法

    @interface UIImage(UIImageDeprecated)
    
    // use resizableImageWithCapInsets: and capInsets.
    
    - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;
    @property(nonatomic,readonly) NSInteger leftCapWidth;   // default is 0. if non-zero, horiz. stretchable. right cap is calculated as width - leftCapWidth - 1
    @property(nonatomic,readonly) NSInteger topCapHeight;   // default is 0. if non-zero, vert. stretchable. bottom cap is calculated as height - topCapWidth - 1
    
    @end

    leftCapWidth是指图片左边区域不想被拉伸的宽度,而rightCapWidth可以不被指定,系统自动设置为width-leftCapWidth-1;如果是水平拉伸,那么被拉伸的区域在水平上只有1个像素。

    比如下图,红色线条覆盖的部分就是会被水平拉伸的部分,其他部分不会被水平拉伸。

    topCapWidth同理。

    最好不要在layoutSubviews的时候去addSubview或移除subview,layoutSubviews只负责布局 

    判断2个时间是否同一天

    //时间转为NSString
    - (NSString *)curTime
    {
        NSDate *curDate = [NSDate date];
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyy-MM-dd"];
        return [formatter stringFromDate:curDate];
    }
    
    判断是否同一天
    NSString *curTime = [self curTime];
    if ([curTime isEqualToString:lastTime])

    XCode出现clang: error: no such file or directory:和clang: error: no input files

    首先先查找下出现错误的文件是否已经添加到工程中(同时保证Finder中也要有);如果明明已经添加到工程中但编译不过提示以上错误,那么很有可能是该文件没有被添加到需要被编译的目录中,解决方法是:

    XCode中点击工程,在右侧选择Target中的主工程,搜索该文件,如果没有则将该文件拖到Compile Sources;如果Compile Sources中该文件有重复则删除重复的文件

  • 相关阅读:
    Vue使用QrCode插件生成二维码
    简述Vue的路由与视图
    EntityFrameworkCore将数据库Timestamp类型在程序中转为long类型
    Linux常用命令——软件包管理
    Linux常用命令——文本编辑器Vim
    Linux常用命令——关机重启命令
    Linux常用命令——网络命令
    Linux常用命令——压缩解压命令
    Linux常用命令——文件搜索命令
    .NET Core 配置GC工作模式与内存的影响
  • 原文地址:https://www.cnblogs.com/chenyg32/p/4677852.html
Copyright © 2011-2022 走看看