Кнопка iOS 7 с круглой рамкой
iOS App Store имеет синюю круглую обрамленную кнопку для покупки/загрузки приложений.
В моем приложении вы можете загрузить дополнительный контент, и я хочу иметь подобную кнопку, просто потому, что она выглядит знакомой пользователю.
Если вы не знаете, что я имею в виду: эти кнопки, например "$ 3.99"
![enter image description here]()
Как это возможно?
Ответы
Ответ 1
Вы можете манипулировать CALayer вашей кнопки, чтобы сделать это довольно легко.
// assuming you have a UIButton or more generally a UIView called buyButton
buyButton.layer.cornerRadius = 2;
buyButton.layer.borderWidth = 1;
buyButton.layer.borderColor = [UIColor blueColor].CGColor;
// (note - may prefer to use the tintColor of the control)
вы можете настроить каждый из них, чтобы получить необходимый цвет и эффект границы.
Вам также нужно будет добавить импорт в любой файл, который вы хотите использовать CALayers
#import <QuartzCore/QuartzCore.h>
Ответ 2
Если вы большой поклонник использования раскадровки для вашего дизайна пользовательского интерфейса с iOS.. вы можете установить радиус угла (и любые другие параметры, как упоминалось в dima answer - хотя, к сожалению, это не цвет, так как у CGColor и Apple в настоящее время нет этой опции во всплывающем окне) в identity inspector
→ user defined runtime attributes
в раскадровке, как показано ниже:
![enter image description here]()
бонус:
вы используете атрибуты runtime для цвета текста UIButton
(см. здесь) и для изменения шрифтов UILabel
, UITextField
и UIButton
(см. здесь)
Ответ 3
Для стандартных элементов управления iOS, таких как UIButton
, UILabel
,
вы должны использовать свойство UIView
tintColor
:
buyButton.layer.borderColor = buyButton.tintColor.CGColor;
Ответ 4
Для простой границы, как вы описали, используйте ответ от Dima, используя CALAyer.
Если вы хотите больше, например округленный прямоугольник с градиентом, используйте этот подход в качестве базы:
Создайте пользовательский вид, который рисует округленный прямоугольник и поместите его над кнопкой.
Используйте функцию поиска здесь, чтобы найти рисованный округленный прямоугольник.
Чертеж работает, рисуя 4 дуги с определенным радиусом (углы) и 4 прямыми линиями.
FTR, вот как вы делаете UIView с правильными закругленными углами iOS7, за Алекса и Брайана.
Я уверен, что CGPathCreateWithRoundedRect не не дает вам "новых" закругленных углов. Вы должны использовать bezierPathWithRoundedRect для "новых" углов.
#import "UIViewWithIOS7RoundedCorners.h"
@implementation UIViewWithIOS7RoundedCorners
-(void)drawRect:(CGRect)rect
{
// for a filled shape...
UIBezierPath* path =
[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:4];
[[UIColor blueColor] setFill];
[path fill];
// for just a border...
int thickness=2;
UIBezierPath* path =
[UIBezierPath bezierPathWithRoundedRect:
CGRectInset(self.bounds, thickness/2, thickness/2)
cornerRadius: 4];
path.lineWidth = thickness;
[[UIColor blueColor] setStroke];
[path stroke];
}
@end
// ps don't forget to set .backgroundColor=[UIColor clearColor]
// perhaps in initWithCoder/initWithFrame
![enter image description here]()
![enter image description here]()
Надеюсь, что это поможет кому-то
Ответ 5
Я применил здесь кнопку стиля AppStore для ссылки: ASButton.m
и проект здесь
Надеемся помочь:]
Ответ 6
Чтобы расширить превосходный ответ на @abbood, на самом деле можно установить цвет рамки и цвет фона слоя с IB, но для этого требуется небольшая подготовительная работа.
Я создал пользовательскую категорию в NSView, CALayer + setUIColor.h.
То, что устанавливает границы границ, имеет только один метод, setBorderUIColor. В качестве входа требуется UIColor, выбирает UIColor, лежащий в основе NSColor, и применяет этот цвет к слою представления.
Затем в IB вы просто добавляете атрибут, определенный пользователем, как это:
Ключевой путь layer.borderUIColor
Тип цвет
Стоимость Желаемый цвет.
Во время выполнения система вызывает ваш метод, передавая в UIColor, который определен в IB. Категория получает CGColor из UIColor и применяет его к слою.
Это можно увидеть в рабочем проекте в проекте github, который называется
RandomBlobs
Я также сделал то же самое для установки свойства цвета фона слоя, но не в вышеупомянутом проекте.
Ответ 7
И для быстрой версии расширения Duncan C ответа abbood:
extension CALayer {
var borderUIColor: UIColor? {
get {
if let borderColor = borderColor {
return UIColor(CGColor: borderColor)
}
return nil
}
set {
borderColor = newValue?.CGColor ?? nil
}
}
}
Ответ 8
В Swift 5.1/iOS 13 вы можете создать подкласс UIButton
, чтобы иметь пользовательскую кнопку, которая будет выглядеть как синяя кнопка с закругленными границами в приложении iOS AppStore.
Следующий код показывает, как правильно управлять цветом оттенка (когда кнопка отображается за затемненным видом UIAlertController
), цветом заголовка, выделенным цветом фона, стилем границы, цветом границы и вставками содержимого.
CustomButton.swift:
import UIKit
class CustomButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
setProperties()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setProperties()
}
func setProperties() {
// Set the layer properties
layer.borderColor = tintColor?.cgColor
layer.borderWidth = 1
layer.cornerRadius = 4
// Set colors for title states
setTitleColor(tintColor, for: .normal)
setTitleColor(.white, for: .highlighted)
// Add some margins between the title (content) and the border
contentEdgeInsets = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
}
override var isHighlighted: Bool {
didSet {
// Toggle the background color according to button highlighted state
backgroundColor = super.isHighlighted ? tintColor : nil
}
}
override func tintColorDidChange() {
super.tintColorDidChange()
// When the tint color is changed by the system (e.g. when the button appears below the dimmed view of a UIAlertController), we have to manually update border color and title text color
layer.borderColor = tintColor?.cgColor
setTitleColor(tintColor, for: .normal)
}
}
ViewController.swift:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .secondarySystemBackground
let button = CustomButton()
button.setTitle("Normal", for: .normal)
button.setTitle("Highlighted", for: .highlighted)
button.addTarget(self, action: #selector(presentAlert(_:)), for: .touchUpInside)
view.addSubview(button)
// auto layout
button.translatesAutoresizingMaskIntoConstraints = false
button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
button.topAnchor.constraint(equalTo: view.topAnchor, constant: 100).isActive = true
}
/// Present alert when button is tapped
@objc func presentAlert(_ sender: UIButton) {
let alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
let alertAction = UIAlertAction(title: "OK", style: .default)
alertController.addAction(alertAction)
present(alertController, animated: true, completion: nil)
}
}
На рисунках ниже показано, как пользовательская кнопка будет выглядеть в нормальном состоянии, когда система tinColor
изменяется (за затемненным обзором UIAlertController
) и в состоянии highlighted
.
![enter image description here]()