UISegmentedControl去掉背景色与UIScrollView联动

Posted 卢二牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UISegmentedControl去掉背景色与UIScrollView联动相关的知识,希望对你有一定的参考价值。

UISegmentControl分段控制器是UIKit框架提供的一组按钮栏,提供多个可选的按钮,只能激活其中的一个,响应事件。主要用来在同一层次重要性下不同的信息展示或者不同的界面展示之间切换。例如手机QQ的主界面的消息和电话两个选项卡。

技术分享

我们看一下UISegmentedControl的继承结构:

UISegmentedControl-->UIControl-->UIView-->UIResponder-->NSObject

ios事件相关类中我们知道UIControl将触摸事件转换成了带接收方的控件事件,它本身是个抽象类,只能实例化它的子类来处理控件事件。UISegmentedControl继承自UIControl,它具有所有UIControl的属性和方法。

  • 属性

    @property(nonatomic) UISegmentedControlStyle segmentedControlStyle NS_DEPRECATED_IOS(2_0, 7_0, "The segmentedControlStyle property no longer has any effect") __TVOS_PROHIBITED;
    @property(nonatomic,getter=isMomentary) BOOL momentary;             // if set, then we don‘t keep showing selected state after tracking ends. default is NO
    @property(nonatomic,readonly) NSUInteger numberOfSegments;
    @property(nonatomic) BOOL apportionsSegmentWidthsByContent NS_AVAILABLE_IOS(5_0);
    @property(nonatomic) NSInteger selectedSegmentIndex;
    @property(null_resettable,nonatomic,strong) UIColor *tintColor;

    iOS7之后采用扁平化设计风格,segmentedControlStyle被废弃,设置了也没有效果。momentary设置点击之后是否恢复原样,默认是NO。numberOfSegments表示选项卡的个数。apportionSegmentWidthsByContent默认为NO,如果设置为YES,对于宽度为0的segment它将根据其内容自动调整segment的宽度。selectedSegmentIndex表示当前选中的segment的索引。 tintColor描述View中线条轮廓的颜色,它默认会一直从最底部的View向上层传递,直到某个子View修改了tintColor,传递链断开,新的tintColor继续向上层传递。更多关于tintColorbackgroundColorforegroundColor的区别参考iOS字体颜色图片部分。

  • 对象方法

      - (instancetype)initWithItems:(nullable NSArray *)items; // items can be NSStrings or UIImages. control is automatically sized to fit content
       - (void)insertSegmentWithTitle:(nullable NSString *)title atIndex:(NSUInteger)segment animated:(BOOL)animated; // insert before segment number. 0..#segments. value pinned
       - (void)insertSegmentWithImage:(nullable UIImage *)image  atIndex:(NSUInteger)segment animated:(BOOL)animated;
       - (void)removeSegmentAtIndex:(NSUInteger)segment animated:(BOOL)animated;
       - (void)removeAllSegments;
       - (void)setTitle:(nullable NSString *)title forSegmentAtIndex:(NSUInteger)segment;      // can only have image or title, not both. must be 0..#segments - 1 (or ignored). default is nil
       - (nullable NSString *)titleForSegmentAtIndex:(NSUInteger)segment;
       - (void)setImage:(nullable UIImage *)image forSegmentAtIndex:(NSUInteger)segment;       // can only have image or title, not both. must be 0..#segments - 1 (or ignored). default is nil
       - (nullable UIImage *)imageForSegmentAtIndex:(NSUInteger)segment;
       - (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment;         // set to 0.0 width to autosize. default is 0.0
       - (CGFloat)widthForSegmentAtIndex:(NSUInteger)segment;
       - (void)setContentOffset:(CGSize)offset forSegmentAtIndex:(NSUInteger)segment; // adjust offset of image or text inside the segment. default is (0,0)
       - (CGSize)contentOffsetForSegmentAtIndex:(NSUInteger)segment;
       - (void)setEnabled:(BOOL)enabled forSegmentAtIndex:(NSUInteger)segment;        // default is YES
       - (BOOL)isEnabledForSegmentAtIndex:(NSUInteger)segment;

    以上方法比较简单,根据方法名字就知道它的具体功能。需要注意的是initWithItems的数组参数既可以是字符串也可以是图片,segmentedControl会根据文字或者图片的宽高自动设置自己的宽高。setContentOffset设置图片或者文字内容相对于单个segment的坐标原点也就是左上角的偏移量,默认是(0,0).更多关于offset,inset的内容请参考iOS基本框架UIKit之几何形状setEnabled forSegmentAtIndex用来设置指定的索引的segment能否被选中。

  • 1.懒加载分段选择器,并且去掉分段选择器的选中蓝色渲染特效
//分段选择器
-(UISegmentedControl *)switchBtn{
    if (!_switchBtn) {
        _switchBtn=[[UISegmentedControl alloc]initWithItems:@[@"第1页",@"第2页",@"第3页"]];
        [self.view addSubview:_switchBtn];
        _switchBtn.backgroundColor=[UIColor whiteColor];
        _switchBtn.layer.borderColor=[UIColor whiteColor].CGColor;
        _switchBtn.tintColor=[UIColor whiteColor];
        [_switchBtn addTarget:self action:@selector(actionSwitchBtn:) forControlEvents:UIControlEventValueChanged];
        //设置分段选择器选中颜色
        [_switchBtn setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor blackColor]} forState:UIControlStateNormal];
        [_switchBtn setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor blueColor]} forState:UIControlStateSelected];
        _switchBtn.selectedSegmentIndex=0;
    }
    return _switchBtn;
}
  • 2.分段选择器与UIScrollView联动方法:
-(void)actionSwitchBtn:(UISegmentedControl*)segmentedControl{
    self.scrollView.contentOffset=CGPointMake(self.view.frame.size.width*self.switchBtn.selectedSegmentIndex, 0);
}
#pragma -mark scrollview的代理方法
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    self.switchBtn.selectedSegmentIndex=self.scrollView.contentOffset.x/self.scrollView.frame.size.width;
}

以上是关于UISegmentedControl去掉背景色与UIScrollView联动的主要内容,如果未能解决你的问题,请参考以下文章

CSS 表格行背景色与表格背景色

背景色与WM_ERASEBKGND

使用交替背景色与过程报告

Python背景色与语法高亮主题配置

更改黑色 UISegmentedControl 上的 selectedSegment 背景颜色

tvos UISegmentedControl 焦点样式不变