Этот код нормально работает в ios10. Я получаю свой ярлык и кнопку с изображением, которая представляет собой профиль с фотографией пользователя, круглая круглая .. Хорошо. но при запуске симулятора xcode 9 ios11 я растягиваю его. рамка кнопки должна быть 32x32, при проверке сима и получении представления и сообщении xcode описать представление, которое я получаю, как 170x32 или что-то в этом роде.
вот мой код.
let labelbutton = UIButton( type: .system)
labelbutton.addTarget(self, action:#selector(self.toLogin(_:)), for: .touchUpInside)
labelbutton.setTitleColor(UIColor.white, for: .normal)
labelbutton.contentHorizontalAlignment = .right
labelbutton.titleLabel?.font = UIFont.systemFont(ofSize: 18.00)
let button = UIButton(type: .custom)
button.addTarget(self, action:#selector(self.toLogin(_:)), for: .touchUpInside)
button.frame = CGRect(x: 0, y: 0, width: 32, height: 32)
button.setTitleColor(UIColor.white, for: .normal)
button.setTitleColor(UIColor.white, for: .highlighted)
var buttomItem : UIBarButtonItem = UIBarButtonItem()
buttomItem.customView = button
buttomItem.target = self
buttomItem.action = "ToLogin"
var labelItem : UIBarButtonItem = UIBarButtonItem()
labelItem.customView = labelbutton
labelItem.target = self
labelItem.action = "ToLogin"
if let user = PFUser.current() {
print("LOGIN : checkiando si existe usuario ")
labelbutton.setTitle(USERNAME, for: UIControlState.normal)
labelbutton.sizeToFit()
if(user["profile_photo_url"] != nil) {
print(" ENCONTRO PROFILE PHOTO URL NOT NIL Y ES \(user["profile_photo_url"])")
let photoURL = user["profile_photo_url"] as! String
let a = LoginService.sharedInstance
a.downloadImage(url: photoURL, complete: { (complete) in
if (complete) {
button.setImage(LoginService.sharedInstance.profile_photo! , for: UIControlState.normal)
button.layer.cornerRadius = 0.5 * button.bounds.size.width
// button.imageView!.contentMode = .scaleAspectFit
// button.imageView!.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
//button.imageView!.contentMode = .scaleAspectFit
//button.imageView!.clipsToBounds = true
//button.imageView!.layer.cornerRadius = 60
button.clipsToBounds = true
self.NavigationItem.rightBarButtonItems = [buttomItem,labelItem]
}
})
} else {
self.NavigationItem.rightBarButtonItem = labelItem
}
print(" EL FRAME DEL BUTTON ES \(button.frame)")
} else {
labelbutton.setTitle("Login", for: UIControlState.normal)
labelbutton.sizeToFit()
self.NavigationItem.rightBarButtonItem = labelItem
}
UIButton
внутреннюю частьUIBarButtonItem
, используйтеbutton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: -20)
Ответы:
Причина
Проблема появляется из-за того, что с ios 11
UIBarButtonItem
вместо работы с фреймами используется автоматическая раскладка.Решение
Вы должны добавить ограничение ширины для этой кнопки с изображением, если вы используете Xcode 9.
PS
button
нетUIBarButtonItem
, этоUIButton
внутриUIBarButtonItem
. Вы должны установить ограничение не дляUIBarButtonItem
, а для элементов внутри него.источник
Спасибо всем за участие! вы правы, ребята !. для xcode9 ios11 вам нужно поставить ограничение.
источник
translatesAutoresizingMaskIntoConstraints
а потом обнаружил, что iOS 9 полностьюValue of type 'UIBarButtonItem' has no member 'widthAnchor'
в Xcode 9 внутриif #available(iOS 11.0, *)
условного?Код Objective C сейчас устарел. Но для пользователя, который должен создавать / поддерживать проекты Objective C в iOS 11, полезен следующий перевод из Swift (ответ Кароли Нисзтор) на Objective C.
источник
Что ж, в
barButtonItem
новинке вместо работы с фреймами используется автоматическая раскладка.Изображение, которое вы добавляли к кнопке, больше, чем размер самой кнопки. Поэтому сама кнопка растянулась до размера изображения. Вы должны изменить размер изображения, чтобы он соответствовал размеру необходимой кнопки, прежде чем добавлять его к кнопке.
источник
Я написал крошечное расширение для установки ограничений на элементы навигационной панели:
источник
UIButton
работу очень хорошо.Я сделал это объективно, используя следующие строки:
Спасибо, удачного кодирования !!
источник
Что я сделал?
В своем приложении я добавил изображение профиля на панели навигации в элемент rightBarButton. до iOS 11 он работал хорошо и правильно отображался, но при обновлении до iOS 11 измените поведение, например, удар
Итак, я добавил
UIView
элемент правой кнопки и установил егоUIButton
как подпредставлениеUIView
? Как показано ниже,И я установил ограничения по высоте и ширине
UIButton
.И моя проблема решена. Не забудьте установить
UIView
цвет фона как прозрачный .источник
Изменение
widthAnchor
/heightAnchor
будет работать только на устройствах iOS 11+. Для устройств с iOS 10 вам нужно пойти классическим способом ручной смены кадров. Дело в том, что ни один из двух подходов не работает для обеих версий, поэтому вам абсолютно необходимо программно чередовать в зависимости от версии среды выполнения, как показано ниже:источник
Несмотря на то, что iOS 11 использует Autolayout для панели навигации, можно заставить ее работать, традиционно устанавливая фреймы. Вот мой код, работающий для ios11 и ios10 или старше:
и вот как составляется элемент бара:
источник
У меня программная установка ограничений сработала для пользователей iOS 11.X. Однако для пользователей iOS 10.X кнопка панели все еще была растянутой.Я предполагаю, что обозреватели AppStore использовали iOS 11.X, поэтому не смогли определить мою проблему, поэтому мое приложение было готово к продаже и загружено ..
Мое решение заключалось в том, чтобы просто изменить размеры моего изображения на 30x30 в другом программном обеспечении (предыдущий размер изображения был 120x120).
источник
Я также добился успеха, реализовав
intrinsicContentSize
возврат соответствующего размера для любого настраиваемого подкласса UIView, который я собираюсь использовать в качестве customView.источник
Я создал элемент кнопки панели, а затем добавил его на панель навигации.
В viewDidLoad ()
Здесь у меня изображение 28x28.
источник