Swift-두 줄의 텍스트가있는 UIButton
두 줄의 텍스트로 UIButton을 만들 수 있는지 궁금합니다. 다른 글꼴 크기를 가지려면 각 줄이 필요합니다. 첫 번째 라인은 17 포인트가되고 두 번째 라인은 11 포인트가됩니다. UIButton 내부에 두 개의 레이블을 넣는 것을 엉망으로 만들었지 만 단추 경계 안에 머물도록 만들 수 없습니다.
프로그래밍 방식이 아닌 UI 빌더에서이 모든 작업을 수행하려고합니다.
감사
두 가지 질문이 있습니다.
두 줄의 텍스트로 UIButton을 만들 수 있는지 궁금합니다.
이것은 스토리 보드를 사용하거나 프로그래밍 방식으로 가능합니다.
스토리 보드 :
에 '줄 바꿈 모드'로 변경 문자 랩 또는 줄 바꿈을 하고 사용 Alt 키 / 옵션 + Enter를 있는 UIButton의 제목 필드에 새 줄을 입력 키를.
프로그래밍 방식 :
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
btnTwoLine?.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping;
}
다른 글꼴 크기를 가지려면 각 줄이 필요합니다 1
최악의 경우는 사용자 정의 UIButton
클래스를 사용하고 그 안에 두 개의 레이블을 추가 할 수 있다는 것입니다.
더 좋은 방법은 NSMutableAttributedString
. 이것은 프로그래밍 방식으로 만 달성 할 수 있습니다.
@IBOutlet weak var btnTwoLine: UIButton?
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
//applying the line break mode
btnTwoLine?.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping;
var buttonText: NSString = "hello\nthere"
//getting the range to separate the button title strings
var newlineRange: NSRange = buttonText.rangeOfString("\n")
//getting both substrings
var substring1: NSString = ""
var substring2: NSString = ""
if(newlineRange.location != NSNotFound) {
substring1 = buttonText.substringToIndex(newlineRange.location)
substring2 = buttonText.substringFromIndex(newlineRange.location)
}
//assigning diffrent fonts to both substrings
let font:UIFont? = UIFont(name: "Arial", size: 17.0)
let attrString = NSMutableAttributedString(
string: substring1 as String,
attributes: NSDictionary(
object: font!,
forKey: NSFontAttributeName) as [NSObject : AnyObject])
let font1:UIFont? = UIFont(name: "Arial", size: 11.0)
let attrString1 = NSMutableAttributedString(
string: substring2 as String,
attributes: NSDictionary(
object: font1!,
forKey: NSFontAttributeName) as [NSObject : AnyObject])
//appending both attributed strings
attrString.appendAttributedString(attrString1)
//assigning the resultant attributed strings to the button
btnTwoLine?.setAttributedTitle(attrString, forState: UIControlState.Normal)
}
산출
두 가지 다른 글꼴 크기가 필요하지 않다는 점을 제외하면 거의 동일한 주제를 찾고있었습니다. 누군가가 간단한 해결책을 찾고있는 경우 :
let button = UIButton()
button.titleLabel?.numberOfLines = 0
button.titleLabel?.lineBreakMode = .byWordWrapping
button.setTitle("Foo\nBar", for: .normal)
button.titleLabel?.textAlignment = .center
button.sizeToFit()
button.addTarget(self, action: #selector(rightBarButtonTapped), for: .allEvents)
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button)
대부분의 솔루션에서 줄 바꿈 모드를 "문자 줄 바꿈"으로 만드는 동안 두 번째 줄이 첫 번째 줄에 정렬되는 문제를 발견했습니다.
모든 선을 중앙에 배치합니다. 제목을 Plain에서 Attributed로 변경 한 다음 각 줄을 가운데로 만들 수 있습니다.
SWIFT 3 구문
let str = NSMutableAttributedString(string: "First line\nSecond Line")
str.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 17), range: NSMakeRange(0, 10))
str.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 12), range: NSMakeRange(11, 11))
button.setAttributedTitle(str, for: .normal)
change line break to character wrap , select your button and in attribute inspector go to line break and change it to character wrap
I have fixed this and my solution it was only in the Storyboard.
Changes:
It added in Identity Inspector -> User Defined Runtime Attributes (these KeyPaths):
- numberOfLines = 2
- titleLabel.textAlignment = 1
User Defined Runtime Attributes
I added this in attributes inspector:
- line break = word wrap
You need to do some of this in code. you can't set 2 different fonts in IB. In addition to changing the line break mode to character wrap, you need something like this to set the title,
override func viewDidLoad() {
super.viewDidLoad()
var str = NSMutableAttributedString(string: "First line\nSecond Line")
str.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(17), range: NSMakeRange(0, 10))
str.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(12), range: NSMakeRange(11, 11))
button.setAttributedTitle(str, forState: .Normal)
}
One way to do it is with labels, I guess. I did this, and it seems to work ok. I could create this as a UIButton and then expose the labels, I guess. I don't know if this makes any sense.
let firstLabel = UILabel()
firstLabel.backgroundColor = UIColor.lightGrayColor()
firstLabel.text = "Hi"
firstLabel.textColor = UIColor.blueColor()
firstLabel.textAlignment = NSTextAlignment.Center
firstLabel.frame = CGRectMake(0, testButton.frame.height * 0.25, testButton.frame.width, testButton.frame.height * 0.2)
testButton.addSubview(firstLabel)
let secondLabel = UILabel()
secondLabel.backgroundColor = UIColor.lightGrayColor()
secondLabel.textColor = UIColor.blueColor()
secondLabel.font = UIFont(name: "Arial", size: 12)
secondLabel.text = "There"
secondLabel.textAlignment = NSTextAlignment.Center
secondLabel.frame = CGRectMake(0, testButton.frame.height * 0.5, testButton.frame.width, testButton.frame.height * 0.2)
testButton.addSubview(secondLabel)
참고 URL : https://stackoverflow.com/questions/30679370/swift-uibutton-with-two-lines-of-text
'Programing' 카테고리의 다른 글
SQL Server에서 중복 레코드를 삭제 하시겠습니까? (0) | 2020.09.17 |
---|---|
jQuery AJAX 호출에 대한 로딩 표시기 구현 (0) | 2020.09.17 |
io.reactivex.Observable에 대한 통화 어댑터를 만들 수 없습니다. (0) | 2020.09.17 |
숫자의 Excel과 유사한 열 이름을 얻는 알고리즘 (0) | 2020.09.17 |
Web API에서 응답을 직렬화하지 못했습니다. (0) | 2020.09.17 |