2016-01-25 2 views
0

Я пытаюсь добавить верхнюю и правую границу к моей кнопке, но не внизу или влево. Я просмотрел его и нашел предложение сделать это, добавив виды, чтобы они выглядели как границы.Frame.size.width Не возвращает правильную ширину UIButton

//Add borders 
    let topBorder = UIView(frame: CGRectMake(0, 0, editorBox.frame.size.width/3, 1)) 
    let rightBorder = UIView(frame: CGRectMake(cancel.frame.size.width, 0, 1, cancel.frame.size.height)) 
    topBorder.backgroundColor = UIColor(red: 220/255.0, green: 220/255.0, blue: 220/255.0, alpha: 1.0) 
    rightBorder.backgroundColor = UIColor(red: 220/255.0, green: 220/255.0, blue: 220/255.0, alpha: 1.0) 
    cancel.addSubview(topBorder) 
    cancel.addSubview(rightBorder) 

Но в результате испытаний Simulator выглядит следующим образом:

Button border size is not correct

UIButton border size not correct

Однако кнопка, безусловно, не то, что большой, потому что вы не можете нажать кнопку в правой стороне Это. Ограничения автоматического макета подтверждают, что кнопка не такая большая.

Autolayout constraints

Я просто хочу каждую кнопку, чтобы иметь границу вокруг его фактической 1/3 размер ширины, как указано в ограничениях. Может ли кто-нибудь сказать мне, что происходит и как это исправить?

ответ

0

Оказывается, что другой ответ не решить мою проблему границы самого по себе. Вот код, я использую, на основе @tbondwilkinson ответа:

//Add borders 
    let borderColor = UIColor(red: 200/255.0, green: 200/255.0, blue: 200/255.0, alpha: 1.0).CGColor 
    func formatTopBorder (buttonToFormat: UIButton,borderToFormat: CALayer) { 
     buttonToFormat.clipsToBounds = true 
     borderToFormat.borderColor = borderColor 
     borderToFormat.borderWidth = 2 
     borderToFormat.frame = CGRectMake(0, 0, CGRectGetWidth(cancel.frame), 2) 
    } 
    let topBorder: CALayer = CALayer() 
    let topBorder2: CALayer = CALayer() 
    let topBorder3: CALayer = CALayer() 
    let rightBorder: CALayer = CALayer() 
    let leftBorder: CALayer = CALayer() 

    formatTopBorder(cancel, borderToFormat: topBorder) 
    formatTopBorder(action, borderToFormat: topBorder2) 
    formatTopBorder(addSave, borderToFormat: topBorder3) 

    rightBorder.borderColor = borderColor 
    rightBorder.borderWidth = 2 
    rightBorder.frame = CGRectMake(CGRectGetWidth(cancel.frame)-2, 0, 2, CGRectGetHeight(cancel.frame)) 

    leftBorder.borderColor = borderColor 
    leftBorder.borderWidth = 1 
    leftBorder.frame = CGRectMake(0, 0, 2, CGRectGetHeight(cancel.frame)) 

    cancel.layer.addSublayer(topBorder) 
    cancel.layer.addSublayer(rightBorder) 
    action.layer.addSublayer(topBorder2) 
    addSave.layer.addSublayer(topBorder3) 
    addSave.layer.addSublayer(leftBorder) 

Но если их поместить в viewDidLoad, он не работает отлично. Верхние границы работают, а также левая граница. Тем не менее, он все еще преждевременно получать ширину UIButton, в результате чего в правой границе не работает:

rightBorder.frame = CGRectMake(CGRectGetWidth(cancel.frame)-2, 0, 2, CGRectGetHeight(cancel.frame)) 

CGRectGetWidth (cancel.frame) -2 получает правильный правый край и дает простор для границы, но он получает ширина до того, как кнопка сама по себе.

Решение:

Используйте метод, а затем поместить этот код в viewDidAppear. К сожалению, границы появляются через секунду после появления вашего представления, но все границы будут правильными.

Если кто-то может опубликовать код, который работает на границе с правом края, который запускается в viewDidLoad, отправьте его, и я отметю его правильно.

1

Выглядит, как проблема автоаудита - ваша кнопка генерируется до того, как макет изменит свою ширину. С другой стороны, ваши пограничные представления не меняют свою ширину, поскольку они находятся за пределами иерархии ограничений.

Для чего-то такого простого, я думаю, что UIViews слишком много. Я бы добавил несколько CALayers к кнопке, о которой идет речь.

Вот переполнение стека вопрос, непосредственно связанный с решением CALayer: CALayer: add a border only at one side

+0

Просто попробовал это, используя код в этой ссылке. Тот же результат! Как создается граница, вызывающая у меня много разочарований!?!? Это безумие! –

+0

Подождите, теперь это работает. Он показывал странную вещь угла, но я изменил высоту до 1 вручную в коде, и это сработало. благодаря –

Смежные вопросы