为uibutton ios使用表视图显示风格

我有一个自定义的视图,我想模仿在表格视图单元格中发现的披露指标。 这可能吗 ? 有反正提取图像?

请注意, 您必须使用透明背景

以下是我可以在photoshop文件中获得的最佳匹配:

请注意,它包含下面的REAL iOS IMAGE(从屏幕截图)作为图层,因此您可以比较。

http://www.filedropper.com/fakearrowiosnov2013psd


看来VBK想要UITableView集合中的单个人字形。 这就是所谓的“披露指标”,而不是UIButton的“ 明细披露”。

我想你想要这样的东西:

按钮的UITableView披露指标图像

它是50×80透明背景。 在button或UIImageView的顶部使用此图像。 将其大小调整为您希望button的大小。 苹果build议不低于40×40的命中目标。 我在故事板中将其大小设置为10×16,但是我使用的是透明的button叠加,因此大小无关紧要。

图像镜像: http : //imgur.com/X00qn0Z.png


但请注意,这不是iOS7中使用的图像 。 (2013年11月)。要获得确切的图像,只需在模拟器中的视网膜中运行一个应用程序,并做一个截图。

这可以通过在UIButton放置带有揭示指示符的UITableViewCell完全用代码完成:

 UITableViewCell *disclosure = [[UITableViewCell alloc] init]; disclosure.frame = button.bounds; disclosure.accessoryType = UITableViewCellAccessoryDisclosureIndicator; disclosure.userInteractionEnabled = NO; [button addSubview:disclosure]; 

迅速:

 let disclosure = UITableViewCell() disclosure.frame = button.bounds disclosure.accessoryType = .disclosureIndicator disclosure.isUserInteractionEnabled = false button.addSubview(disclosure) 

你可以使用这个Xcode项目从Xcode模拟器提取graphics图像 – https://github.com/0xced/iOS-Artwork-Extractor

这对我工作:

 UITableViewCell *disclosure = [[UITableViewCell alloc] init]; disclosure.accessoryType = UITableViewCellAccessoryDisclosureIndicator; for (UIView*v1 in disclosure.subviews) { if ([v1 isKindOfClass:[UIButton class]]) { for (UIView*v2 in v1.subviews) { if ([v2 isKindOfClass:[UIImageView class]]) { return ((UIImageView*)v2).image; } } } } 

我喜欢做的是使用UIBezierPath来绘制它。 这让我可以自由调整,如果我想,而不会失去清晰度。 如果没有照片编辑器,这也是我需要改变颜色的机会。原则是通用的,适用于任何给定的path。 用法很简单:

 //suppose we want to apply disclosure arrow image to this button: @IBOutlet weak var btnDisclosure: UIButton! 

我现在需要做的是:

 //get an image from UIBezierPath, resize it for the button and stroke with white: let arrowImage = UIImage.imageWithBezierPath(UIBezierPath.disclosureArrowPath().scaleToAspectFitRect(CGRect(x: 0, y: 0, width: 22, height: 22)), fillColor: UIColor.clearColor(), strokeColor: UIColor.whiteColor()) //assign disclosure arrow image to the button: btnDisclosure.setImage(arrowImage, forState: .Normal) 

因此,一个用于绘制UIBezierPath的代码看起来像披露button:

 extension UIBezierPath { ///Disclosure arrow path. Use scaleToAspectFitRect to resize it to any given rect. class func disclosureArrowPath() -> UIBezierPath { //// arrow Drawing let arrowPath = UIBezierPath() arrowPath.moveToPoint(CGPointMake(4, 4)) arrowPath.addLineToPoint(CGPointMake(26.5, 25.24)) arrowPath.addLineToPoint(CGPointMake(4, 47.5)) arrowPath.lineWidth = 3 return arrowPath } ///Makes a path scalable to any size. ///- parameter newRect: The path will be resized to aspect fit into this rectangle. func scaleToAspectFitRect(newRect: CGRect) -> UIBezierPath { var scaleFactor : CGFloat = 1.0 //this is probably only the case of scale factor < 1: if bounds.width > bounds.height { //fit witdth: scaleFactor = newRect.width/bounds.width } else { //fit height: scaleFactor = newRect.height/bounds.height } //scale to aspect fill rect: self.applyTransform(CGAffineTransformMakeScale(scaleFactor, scaleFactor)) return self } } 

接下来,你需要一种方法来UIImage UIBezierPath获取UIImage 。 再次,你可以添加扩展到UIImage,将这样做:

 extension UIImage { ///Custom fill and stroke colours for our image based on UIBezierPath class func imageWithBezierPath(path: UIBezierPath, fillColor: UIColor, strokeColor: UIColor) -> UIImage { //enlarge the rect so that stroke line is not clipped: let rect = CGRectInset(path.bounds, -path.lineWidth / 2, -path.lineWidth / 2) UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) //size of the image, opaque, and scale (set to screen default with 0) let bezierLayer = CAShapeLayer() bezierLayer.path = path.CGPath; bezierLayer.fillColor = fillColor.CGColor bezierLayer.strokeColor = strokeColor.CGColor bezierLayer.lineWidth = path.lineWidth; let imgViewTmp = UIImageView(frame: path.bounds) imgViewTmp.layer.addSublayer(bezierLayer); imgViewTmp.layer.renderInContext(UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() //UIGraphicsEndImageContext() return image } } 

这对于这个特定的任务可能看起来过于矫枉过正,但是它是通用的。 如果你处理大小调整,试图找出正确的devise等,真的很方便。

对于Xamarin.iOS

 //create your button var systolicWell = new UIButton(UIButtonType.RoundedRect); systolicWell.BackgroundColor = UIColor.White; //create the UITableViewCell var systolicDisclosure = new UITableViewCell(); systolicDisclosure.Accessory = UITableViewCellAccessory.DisclosureIndicator; systolicDisclosure.UserInteractionEnabled = false; //add the button, then the UITableViewCell to the View View.AddSubviews(systolicWell, systolicDisclosure); //using FluentLayout https://github.com/slodge/Cirrious.FluentLayout View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints(); View.AddConstraints( systolicWell.AtTopOf(View).Plus(5), systolicWell.Width().EqualTo().WidthOf(View), systolicWell.Height().EqualTo(10), systolicDisclosure.WithSameTop(systolicWell), systolicDisclosure.WithSameWidth(systolicWell), systolicDisclosure.WithSameHeight(systolicWell)); 

Swift3 / Swift4:

信息披露指标button

  let disclosureIndicator = UITableViewCell(style: .value1, reuseIdentifier: nil) let theWidth = UIScreen.main.bounds.width let theHeight = yourButton.frame.height yourButton.frame = CGRect(0,0, theWidth, theHeight) disclosureIndicator.textLabel?.text = "title" disclosureIndicator.detailTextLabel?.textColor = .black disclosureIndicator.detailTextLabel?.text = "subtitle" disclosureIndicator.accessoryType = .disclosureIndicator disclosureIndicator.isUserInteractionEnabled = false disclosureIndicator.frame = yourButton.bounds yourButton.addSubview(disclosureIndicator) 

为CGRect添加这个扩展

 extension CGRect { init(_ x:CGFloat, _ y:CGFloat, _ w:CGFloat, _ h:CGFloat) { self.init(x:x, y:y, width:w, height:h) } } 

您可以用一行代码在UITableViewCell的右侧添加任何自定义图像:

尝试这个:

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell.accessoryView = [[UIImageView alloc]initWithImage: [UIImage imageNamed:@"blueButton.png"]]; }